MFC扩展动态库中的他局钩子,创建成功,可是无法成功钩取,而且删除钩子的时候出错!该怎么解决
MFC扩展动态库中的他局钩子,创建成功,可是无法成功钩取,而且删除钩子的时候出错!
dll的结构大致是:有一个类导出CTransparentDlg,它需要鼠标钩子,钩子函数及共享数据段如下:
#pragma data_seg( "TransparentDlg ")
static long nUser32Ref = 0;
static HHOOK MouseHook = 0;
#pragma data_seg()
#pragma comment(linker, "/section:TransparentDlg,rws ")
static LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
Beep(1500, 10);
return ::CallNextHookEx(MouseHook, nCode, wParam, lParam);
}
我在CTransparentDlg的OnInitDialog里安装钩子(换句话说,如果不使用库中的CTransparentDlg类就不创建钩子,因没不需要),如下:
if (1 == InterlockedIncrement(&nUser32Ref))
MouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, AfxGetInstanceHandle(), NULL);
ASSERT(MouseHook);
我在CTransparentDlg的OnDestroy里删除钩子,程序如下:
if (InterlockedDecrement(&nUser32Ref) <= 0 && MouseHook)
{
VERIFY(::UnhookWindowsHookEx(MouseHook));
MouseHook = 0;
}
现在问题有,一:无法成功钩到鼠标消息(上面的Beep从未响过);
二:VERIFY(::UnhookWindowsHookEx(MouseHook));出错,错误是无效的钩子句柄,并且报内在泄漏(MouseHook 句柄)。
请高从解答!
------解决方案--------------------
第一次退出A.exe时,钩子已经被释放(HHOOK MouseHook是共享的),第二次释放时MouseHook就是无效的钩子。
dll的结构大致是:有一个类导出CTransparentDlg,它需要鼠标钩子,钩子函数及共享数据段如下:
#pragma data_seg( "TransparentDlg ")
static long nUser32Ref = 0;
static HHOOK MouseHook = 0;
#pragma data_seg()
#pragma comment(linker, "/section:TransparentDlg,rws ")
static LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
Beep(1500, 10);
return ::CallNextHookEx(MouseHook, nCode, wParam, lParam);
}
我在CTransparentDlg的OnInitDialog里安装钩子(换句话说,如果不使用库中的CTransparentDlg类就不创建钩子,因没不需要),如下:
if (1 == InterlockedIncrement(&nUser32Ref))
MouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, AfxGetInstanceHandle(), NULL);
ASSERT(MouseHook);
我在CTransparentDlg的OnDestroy里删除钩子,程序如下:
if (InterlockedDecrement(&nUser32Ref) <= 0 && MouseHook)
{
VERIFY(::UnhookWindowsHookEx(MouseHook));
MouseHook = 0;
}
现在问题有,一:无法成功钩到鼠标消息(上面的Beep从未响过);
二:VERIFY(::UnhookWindowsHookEx(MouseHook));出错,错误是无效的钩子句柄,并且报内在泄漏(MouseHook 句柄)。
请高从解答!
------解决方案--------------------
第一次退出A.exe时,钩子已经被释放(HHOOK MouseHook是共享的),第二次释放时MouseHook就是无效的钩子。