TrackMouseEvent介紹

TrackMouseEvent函數
TrackMouseEvent函數在鼠標離開某一窗口或在某一窗口上停留超過某一特定時間長度時發送消息
。其函數原型:
BOOL TrackMouseEvent(LPTRACKMOUSEEVENT lpEventTrack);

參數lpEventTrack是一個指向TRACKMOUSEEVENT結構體的指針。

函數執行成功的話返回非零值(true),否則返回零(false)。

該函數可以發送的消息包括:

WM_MOUSEHOVER
 鼠標在窗口的某一客戶區上停留上一次調用TrackMouseEvent函數時所設定的時間長度時發送。
在該消息產生之後將停止跟蹤,如果需要進一步跟蹤鼠標的停留事件,必須再次調用TrackMouseEvent函數。

WM_MOUSELEAVE
當鼠標離開前一次調用TrackMouseEvent函數所設定的窗口的客戶區時發送該消息。在產生該消息
時,所有由TrackMouseEvent請求的跟蹤都將被取消。如果需要對鼠標的hover事件進行進一步的跟蹤,必須在鼠標重新進入窗口裏再次調用TrackMouseEvent函數
 
TRACKMOUSEEVENT結構體
TRACKMOUSEEVENT結構體在TrackMouseEvent函數中用到。
其定義如下:
typedef struct tagTRACKMOUSEEVENT {
    DWORD cbSize;
    DWORD dwFlags;
    HWND  hwndTrack;
    DWORD dwHoverTime;
} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;
 
幾個成員的含義:
cbSize 定義TRACKMOUSEEVENT結構體的大小;
dwFlags 定義服務請求,可以是下列值的組合:
TME_CANCEL 取消前一次的跟蹤請求;使用該項時必須指定要取消跟蹤的類型,例如要取消hover跟蹤,就必須同時傳送TME_CANCEL和TME_HOVER(TME_CANCEL|TME_HOVER)。
TME_HOVER hover通知。可以發送WM_MOUSEHOVER消息。如果在hover跟蹤處於激活狀態時再次請求hover跟蹤的話,hover的定時器將被重置。
TME_LEAVE 鼠標離開。發送TME_MOUSELEAVE消息。當鼠標不在指定的窗口或區域上時,將立即產生一個leave通知,不再做任何跟蹤。
TME_QUERY 這一項不是作爲跟蹤請求的。選中這一項時,當結構體被傳送給TrackMouseEvent函數時,即產生當前跟蹤。唯一不同的是返回的消耗時間,是真實的消耗時間而不是HOVER_DEFAULT,即使之前TrackMouseEvent函數所請求的是HOVER_DEFAULT。
hwndTrack 待跟蹤窗口的句柄
dwHoverTime 定義hover事件的耗盡時間(如果在dwFlags中有定義TME_HOVER的話),單位毫秒。

可以使用HOVER_DEFAULT來使用系統默認的hover事件耗盡時間。

系統默認的hover事件耗盡時間爲菜單下拉時間,即400毫秒。可以調用SystemParameterInfo函數並使用SPI_GETMOUSEHOVERTIME來獲取默認的hover耗盡時間。
默認的hover矩形區與雙擊區一致。可以調用SystemParameterInfo並使用SPI_GETMOUSEHOVERWIDTH和SPI_GETMOUSEHOVERHEIGHT來獲取鼠標在上面停留可以產生WM_MOUSEHOVER的區域。

另外還有一個小問題。前面一直都說的是TrackMouseEvent函數,但實在上,在程序中,如果直接使用TrackMouseEvent(&tme);時,會出現諸如“'TrackMouseEvent' : undeclared identifier”

的錯誤。但如果你使用_TrackMouseEvent(&tme);就不會有錯誤了。爲什麼呢?

這兩個函數的區別,TrackMouseEvent函數的頭文件是winuser.h,對應的庫文件爲user32.lib,而_TrackMouseEvent函數則在commctrl.h裏定義,而由COMCTRL32.DLL導出。
使用TrackMouseEvent函數必須用extern "C"導入此函數。如下:
extern   "C"   WINUSERAPI   BOOL   WINAPI   TrackMouseEvent   (LPTRACKMOUSEEVENT  

lpEventTrack);

 

NOTE:由上面說到的TrackMouseEvent函數的特點,通常都在OnMouseMove函數裏添加該函數。另外,可以與SetCapture函數聯合使用,即使在鼠標移出窗口區時也能夠響應。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章