如何在光标离开窗口检测

    技术2022-05-11  60

    概要

    <script type="text/javascript">loadTOCNode(1, 'summary');</script> Microsoft Windows NT 4.0、 Windows 2000 和 Microsoft Windows 98 提供 TrackMouseEvent API 来鼠标已离开窗口, 通知窗口。 Windows 95 不提供任何这样的通知。 当鼠标退出窗口通过鼠标进入窗口, 时启动计时器和使用该计时器来监视鼠标位置和当它不再是窗口中查找应用程序可检测。 

    示例代码

    <script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> #if(_WIN32_WINNT < 0x0400) #define WM_MOUSELEAVE WM_USER+2 #define TME_LEAVE 1 typedef struct tagTRACKMOUSEEVENT { DWORD cbSize; DWORD dwFlags; HWND hwndTrack; } TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT; VOID CALLBACK TrackMouseTimerProc(HWND hWnd,UINT uMsg,UINT idEvent,DWORD dwTime) { RECT rect; POINT pt; GetClientRect(hWnd,&rect); MapWindowPoints(hWnd,NULL,(LPPOINT)&rect,2); GetCursorPos(&pt); if (!PtInRect(&rect,pt) || (WindowFromPoint(pt) != hWnd)) { if (!KillTimer(hWnd,idEvent)) { // Error killing the timer! } PostMessage(hWnd,WM_MOUSELEAVE,0,0); } } BOOL TrackMouseEvent(LPTRACKMOUSEEVENT ptme) { OutputDebugString(TEXT("TrackMouseEvent/n")); if (!ptme || ptme->cbSize < sizeof(TRACKMOUSEEVENT)) { OutputDebugString(TEXT("TrackMouseEvent: invalid " "TRACKMOUSEEVENT structure/n")); return FALSE; } if (!IsWindow(ptme->hwndTrack)) { OutputDebugString( TEXT("TrackMouseEvent: invalid hwndTrack/n")); return FALSE; } if (!(ptme->dwFlags & TME_LEAVE)) { OutputDebugString(TEXT("TrackMouseEvent: invalid dwFlags/n")); return FALSE; } return SetTimer(ptme->hwndTrack, ptme->dwFlags, 100,(TIMERPROC)TrackMouseTimerProc); } #endif LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { TRACKMOUSEEVENT tme; static BOOL fInWindow; static BOOL fInMenu; switch (uMsg) { case WM_CREATE: fInWindow = FALSE; fInMenu = FALSE; return 0; case WM_MOUSEMOVE: if (!fInWindow) { fInWindow = TRUE; tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_LEAVE; tme.hwndTrack = hWnd; if (!TrackMouseEvent(&tme)) { MessageBox(hWnd, TEXT("TrackMouseEvent Failed"), TEXT("Mouse Leave"),MB_OK); } } break; case WM_MOUSELEAVE: fInWindow = FALSE; if (!fInMenu) MessageBox(hWnd,TEXT("Elvis has left the building"), TEXT("Mouse Leave"),MB_OK); break; case WM_ENTERMENULOOP: fInMenu = TRUE; break; case WM_EXITMENULOOP: fInMenu = FALSE; break; default: return DefWindowProc(hWnd,uMsg,wParam,lParam); } return FALSE; }  

    最新回复(0)