WM_MOUSELEAVE是这样,你可以检测到鼠标离开你的窗口,当你不有捕获。当你被捕获时,你有责任检测你自己(如果你在乎)。
因此,SetCapture
和TrackMouseEvent
在同一时间没有任何意义,你可以使用一个或另一个。
现在,如果在捕获时看到WM_MOUSELEAVE消息会更方便,在消息泵中执行该操作相对简单。
您只需在消息泵中的GetMessage()
和DispatchMessage()
调用之间添加类似这样的代码即可。
GetMessage(pmsg, ...);
.....
if ((IS_WITHIN(pmsg->message, WM_MOUSEFIRST, WM_MOUSELAST) ||
IS_WITHIN(pmsg->message, WM_NCMOUSEMOVE, WM_NCMBUTTONDBLCLK)) &&
MyMouseLeaveDetection(pmsg, g_hwndNotifyMouseLeave))
{
MSG msg = *pmsg;
msg.message = WM_MOUSELEAVE;
msg.hwnd = g_hwndNotifyMouseLeave; // window that want's
msg.lParam = 0xFFFFFFFF;
g_hwndNotifyMouseLeave = NULL;
DispatchMessage (&msg);
}
.....
TranslateMessage(pmsg);
DispatchMessage(pmsg);
你在什么时候调用TrackMouseEvent?可能是因为你有延迟,并且你正在设法在'TrackMouseEvent'被调用之前离开窗口? – 2010-02-17 18:46:04
当客户端区域内有鼠标移动时,我会执行TrackMouseEvent。 – djcouchycouch 2010-02-17 19:37:39