windows模拟qt鼠标事件

  1 set<CMouseHookMgr*> CMouseHookMgr::msGlobalHookObser = set<CMouseHookMgr*>();
2 3 CMouseHookMgr::CMouseHookMgr( VPortSDKExtern* observer ): 4 mMouseHook(NULL), 5 mBePressed(false), 6 mObserver(observer) 7 { 8 RegisterHook(); 9 } 10 11 CMouseHookMgr::~CMouseHookMgr() 12 { 13 UnRegisterHook(); 14 } 15 16 void CMouseHookMgr::RegisterHook() 17 { 18 if(mMouseHook)return; 19 mMouseHook = SetWindowsHookEx(WH_MOUSE,CMouseHookMgr::MouseMoveProc,NULL,GetCurrentThreadId()); //局部钩子 20 // key_keep = SetWindowsHookEx(WH_MOUSE_LL,MouseMoveProc,NULL,NULL); //全局钩子 21 msGlobalHookObser.insert(this); 22 } 23 24 void CMouseHookMgr::UnRegisterHook() 25 { 26 set<CMouseHookMgr*>::iterator it = msGlobalHookObser.find(this); 27 if (it != msGlobalHookObser.end()) 28 { 29 msGlobalHookObser.erase(it); 30 } 31 UnhookWindowsHookEx(mMouseHook); mMouseHook = NULL; 32 } 33 34 void CMouseHookMgr::MouseMoveEvent( int x, int y, bool lOrR ) 35 { 36 if (mBePressed) 37 { 38 mObserver->MouseMoveEvent(x, y); 39 } 40 } 41 42 void CMouseHookMgr::MousePressEvent( int x, int y, bool lOrR ) 43 { 44 mBePressed = true; 45 mObserver->MousePressEvent(x, y, lOrR); 46 } 47 48 void CMouseHookMgr::MouseReleaseEvent( int x, int y, bool lOrR ) 49 { 50 mBePressed = false; 51 mObserver->MouseReleaseEvent(x, y, lOrR); 52 } 53 54 LRESULT CALLBACK CMouseHookMgr::MouseMoveProc(int code, WPARAM wparam, LPARAM lparam) 55 { 56 MOUSEHOOKSTRUCT mhs = *((PMOUSEHOOKSTRUCT)lparam); //将lParam指向的内容拷贝到mhs中 57 58 QPoint globalPot = QCursor::pos(); 59 60 //判断位置是否在窗口内部 61 if(wparam ) 62 { 63 set<CMouseHookMgr*>::iterator it = CMouseHookMgr::msGlobalHookObser.begin(); 64 for ( ; it != msGlobalHookObser.end(); ++it) 65 { 66 QPoint pot = (*it)->mObserver->mapFromGlobal(globalPot); 67 switch (wparam) 68 { 69 case WM_MOUSEMOVE: 70 { 71 QRect georect = (*it)->mObserver->geometry(); 74 75 //如果事件不是发生在窗口内部则忽略 76 if (!georect.contains(pot)) 77 { 78 continue; 79 } 80 81 (*it)->ExeFuncation(&CMouseHookMgr::MouseMoveEvent,pot.x(),pot.y(),0); 82 } 83 break; 84 case WM_LBUTTONUP: 85 { 86 (*it)->ExeFuncation(&CMouseHookMgr::MouseReleaseEvent,pot.x(),pot.y(),0); 87 } 88 break; 89 case WM_RBUTTONUP: 90 { 91 (*it)->ExeFuncation(&CMouseHookMgr::MouseReleaseEvent,pot.x(),pot.y(),1); 92 } 93 break; 94 95 case WM_LBUTTONDOWN: 96 { 97 QRect georect = (*it)->mObserver->geometry();100 101 //如果事件不是发生在窗口内部则忽略 102 if (!georect.contains(pot)) 103 { 104 continue; 105 } 106 (*it)->ExeFuncation(&CMouseHookMgr::MousePressEvent,pot.x(),pot.y(),0); 107 } 108 break; 109 case WM_RBUTTONDOWN: 110 { 111 QRect georect = (*it)->mObserver->geometry(); 112114 115 //如果事件不是发生在窗口内部则忽略 116 if (!georect.contains(pot)) 117 { 118 continue; 119 } 120 (*it)->ExeFuncation(&CMouseHookMgr::MousePressEvent,pot.x(),pot.y(),1); 121 } 122 break; 123 } 124 } 125 } 126 127 return CallNextHookEx(0, code, wparam, lparam); 128 }

 

posted @ 2017-09-04 07:44  木白木又寸  阅读(519)  评论(0)    收藏  举报