Лучше будет, если разделить мониторинг для кнопки системного меню и остальных. Кроме того, всем ToolTip'ам можно присвоить один и тот же номер, ведь они не могут показываться параллельно.
global WM_NCMOUSELEAVE := 0x2A2, WM_NCMOUSEMOVE := 0xA0, WM_MOUSEMOVE := 0x200, WM_MOUSELEAVE := 0x2A3
, HTCLOSE := 20, HWINEVENTHOOK, HookProcAdr, EVENT_OBJECT_SHOW := 0x8002, hButton1, hButton2
Gui, Add, Button, x165 y167 w60 h23 hwndhButton1, Cancel
Gui, Add, Button, x230 y167 w60 h23 hwndhButton2, OK
Gui, Show, w300 h200
HookProcAdr := RegisterCallback("HookProc", "F" )
OnMessage(WM_NCMOUSEMOVE, "NonClientAreaMessages")
OnMessage(WM_NCMOUSELEAVE, "NonClientAreaMessages")
OnMessage(WM_MOUSEMOVE, "ClientAreaMessages")
OnMessage(WM_MOUSELEAVE, "ClientAreaMessages")
return
GuiClose:
ExitApp
NonClientAreaMessages(wp, lp, msg, hwnd)
{
if (msg = WM_NCMOUSEMOVE)
{
if (wp = HTCLOSE)
{
if !HWINEVENTHOOK
ToolTipShow("Подсказка для кнопки Close", 1)
}
else if HWINEVENTHOOK
ToolTipDestroy(1)
}
else if (HWINEVENTHOOK && msg = WM_NCMOUSELEAVE)
ToolTipDestroy(1)
}
ClientAreaMessages(wp, lp, msg, hwnd)
{
static ToolTipExist
if (msg = WM_MOUSEMOVE)
{
if (hwnd = hButton1 && !ToolTipExist)
ToolTip, Подсказка для кнопки Cancel,,, % ToolTipExist := 1
else if (hwnd = hButton2 && !ToolTipExist)
ToolTip, Подсказка для кнопки OK,,, % ToolTipExist := 1
else if (hwnd !~= (hButton1 "|" hButton2) && ToolTipExist)
ToolTip, % ToolTipExist := "",,, 1
}
else if (msg = WM_MOUSELEAVE)
ToolTip, % ToolTipExist := "",,, 1
}
ToolTipShow(Text, N)
{
HWINEVENTHOOK := SetWinEventHook(EVENT_OBJECT_SHOW, EVENT_OBJECT_SHOW, 0, HookProcAdr, 0,0,0)
ToolTip, % Text,,, N
}
ToolTipDestroy(N)
{
DllCall("UnhookWinEvent", Ptr, HWINEVENTHOOK), HWINEVENTHOOK := ""
ToolTip,,,, N
}
HookProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
{
WinGetClass, Class, ahk_id %hwnd%
if (Class = "#32774")
WinHide, ahk_id %hwnd%
}
SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
return DllCall("SetWinEventHook" , UInt, eventMin
, UInt, eventMax
, Ptr, hmodWinEventProc
, Ptr, lpfnWinEventProc
, UInt, idProcess
, UInt, idThread
, UInt, dwFlags, Ptr)
}