解决方案 »
- 在DLL COM组件中 _Module.GetModuleInstance()返回的是谁的句柄?
- 用了连接池,还能复用连接做事务处理吗?
- 哪里有下载InstallShield for Microsoft Visual C++ 6.0??
- VC中如何在Excel中画线
- 请教关于在MDI中修改子窗口标题颜色的问题?加急!!!
- tcp/ip这样控制流量控制啊!
- 如何直接读写USB软驱(for 98/2000/xp)!
- 窗口和视口具体对应设备上的什么?
- CreateToolHelp32Snapshot查模块拒绝服务为什么?散分
- 到底有多少人听说过或看过中央台“同一首歌”这个节目?要去现场,想统计此节目在本行里的知名程度
- 如何对以显示的位图选定区域然后进行颜色变换
- 为什么说CView ::OnDraw(CDC* pDC)中的形参CDC* pDC是函数的返回值?
LRESULT CALLBACK MsgHook(int nCode, WPARAM wParam, LPARAM lParam)
{
LPMSG msg = (LPMSG)lParam; if(nCode >= HC_ACTION)
{
switch(msg->message)
{
case WM_LBUTTONDOWN:
OutputDebugString(_T("WM_LBUTTONDOWN msg monitored\n"));
break;
}
} return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}g_hHook = SetWindowsHookEx(idHook, MsgHook, g_Instanse, 0);
nCode [in]
Type: intSpecifies whether the hook procedure must process the message. If nCode is HC_ACTION, the hook procedure must process the message. If nCode is less than zero, the hook procedure must pass the message to the CallNextHookEx function without further processing and must return the value returned by CallNextHookEx. MSDN上说明了,nCode在小于0的时候你无法处理这些消息,你只能处理大于等于零的消息。
http://bbs.sysdn.com/forum-77-1.html
VC技术交流群:34097777
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
改为 return NULL;
我个人认为是,调用CallNextHookEx(g_hHook, nCode, wParam, lParam);之后,原来的钩子变得无效了,导致卸载不成功,我是这样解决的。
另外有人提出不能在回调函数里卸载钩子,我不知道是不是,因为我之前在回调函数里卸载成功过。
一样的 我看了下百度即使是在UnhookWindowsHookEx返回之后,钩子程序还可以其他线程调用。如果钩子程序没有同时被调用,钩子程序将会在UnhookWindowsHookEx返回之前删除。
可能是这个原因 我可以在局部卸掉但如果我没在调用程序的窗口上点击的话 还是一样的
The hook procedure can be in the state of being called by another thread even after UnhookWindowsHookEx returns. If the hook procedure is not being called concurrently, the hook procedure is removed immediately before UnhookWindowsHookEx returns.大体意思是如果另外一个线程正在使用该钩子,即使调用UnhookWindowsHookEx卸载了该钩子,它还是可以被这个线程继续调用的;
如果钩子在使用UnhookWindowsHookEx卸载的时候没有被调用,那么它可以在UnhookWindowsHookEx返回前被立即释放掉。楼主这样的设计思路是没办法规避的,只能另辟蹊径了。