关于捕获WM_MOUSELEAVE/WM_NCMOUSELEAVE消息和TrackMouseEvent 的使用
2010-10-30 21:51 Hailoong 阅读(1417) 评论(0) 收藏 举报在网上看了很多片文章都说要捕获WM_MOUSELEAVE/WM_NCMOUSELEAVE消息,则需要先使用TrackMouseEvent,并且每一次TrackMouseEvent调用只能产生一次的WM_MOUSELEAVE/WM_NCMOUSELEAVE消息,以后需要再次调用TrackMouseEvent才能继续捕获WM_MOUSELEAVE/WM_NCMOUSELEAVE消息.
于是产生了很多代码 在WM_MOUSELEAVE里面再次调用TrackMouseEvent的代码,但是我自己认为应该在WM_CREATE里面进行首次调用,可是自己在测试的时候却发现程序陷入课死循环,于是取消在WM_CREATE里面的函数调用,这下好了,根本就没反应了.
于是苦苦冥思,不得其解.打开浏览器各种Google 最后在不宜咖啡处发现原来是要在WM_MOUSEMOVE(MFC则是在OnMouseMove)处调用TrackMouseEvent,并非其他文章的WM_MOUSELEAVE/WM_NCMOUSELEAVE处.
或许是我的哪一步做错了.请各位知情人士点拨下.
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) { static TRACKMOUSEEVENT tme; switch(iMessage) { case WM_CREATE: tme.cbSize = sizeof(TRACKMOUSEEVENT); tme.dwFlags = TME_LEAVE; tme.dwHoverTime = HOVER_DEFAULT; tme.hwndTrack = hWnd; TrackMouseEvent(&tme); break; case WM_MOUSEMOVE: TrackMouseEvent(&tme); break; case WM_MOUSELEAVE: //TO-DO List //.......... break; case WM_DESTROY: PostQuitMessage(0); return 0; default: return(DefWindowProc(hWnd,iMessage,wParam,lParam)); } return 0; }