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