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 }