HHOOK SetWindowsHookEx(
int idHook, // 钩子的类型,即它处理的消息类型
HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0
// 或是一个由别的进程创建的线程的标识,
// lpfn必须指向DLL中的钩子子程。
// 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
// 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的
DLL。
// 如果dwThreadId 标识当前进程创建的一个线程,
// 而且子程代码位于当前进程,hMod必须为NULL。
// 可以很简单的设定其为本应用程序的实例句柄。
DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
// 如果为0,钩子子程与所有的线程关联,即为全局钩子。
);
在网上看到的都是用
wparam==WM_RBUTTONDBLCLK来判断,但不知是不是我的做法有问题,监控不到,所有用时间间隔来判断
int idHook, // 钩子的类型,即它处理的消息类型
HOOKPROC lpfn, // 钩子子程的地址指针。如果dwThreadId参数为0
// 或是一个由别的进程创建的线程的标识,
// lpfn必须指向DLL中的钩子子程。
// 除此以外,lpfn可以指向当前进程的一段钩子子程代码。
// 钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
HINSTANCE hMod, // 应用程序实例的句柄。标识包含lpfn所指的子程的
DLL。
// 如果dwThreadId 标识当前进程创建的一个线程,
// 而且子程代码位于当前进程,hMod必须为NULL。
// 可以很简单的设定其为本应用程序的实例句柄。
DWORD dwThreadId // 与安装的钩子子程相关联的线程的标识符。
// 如果为0,钩子子程与所有的线程关联,即为全局钩子。
);
函数成功则返回钩子子程的句柄,失败返回NULL
- HHOOK glhHook=NULL; //定义为全局变量
- DWORD lastTime; //定义为全局变量
- BOOL lastIsRight=FALSE; //定义为全局变量
- HINSTANCE glhInstance=NULL;
- glhInstance=GetModuleHandle(NULL);
- glhHook=SetWindowsHookEx(WH_MOUSE_LL,MouseProc,glhInstance,0);
- //WH_MOUSE_LL指监控鼠标行为,MouseProc是回调函数
- LRESULT CALLBACK MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
- {
- if (nCode>=0)
- {
- if(wparam==WM_RBUTTONUP)
- {
- if(lastIsRight==FALSE)
- {
- lastTime=::GetTickCount();
- lastIsRight=TRUE;
- }
- else
- {
- DWORD nowTime=::GetTickCount();
- if(nowTime-lastTime<350)//时间间隔为350ms
- {
- AfxMessageBox("双击了鼠标右键");
- lastIsRight=FALSE;
- }
- else
- lastTime=nowTime;
- }
- }
- }
- return CallNextHookEx(glhHook,nCode,wparam,lparam);
- }