安装钩子问题

lumei_1123 2011-03-27 03:19:55
我做了一个对话框程序,但总是运行出错。请各位告诉帮忙指点下。
我的操作步骤是,在对话框的OnInitDialog函数中调用创建钩子是函数,代码如下:
/**
* 安装窗口消息过滤钩子
*/
void CSoftKeyBoardDlg::InstallMsgFilterHook()
{
if (g_hook == NULL)
{
g_hook = ::SetWindowsHookEx(WH_CALLWNDPROC ,MsgFilterHookProc,theApp.m_hInstance,NULL);
if (g_hook == NULL)
{
CString str;
str.Format(L"安装钩子 失败 error = %d ",GetLastError());
MessageBox(str);
}
}
}
MsgFilterHookProc函数代码如下:
/**
* 窗口消息过滤钩子的回调函数
*/
LRESULT CALLBACK /*CSoftKeyBoardDlg::*/MsgFilterHookProc(int nCode ,WPARAM wParam,LPARAM lParam)
{
if (g_hook == NULL)
{
return 0;
}
return CallNextHookEx(g_hook,nCode,wParam,lParam);
}

每次一运行就 出现异常,而且是很怪的异常,和explorer.exe关联起来 。
请各位高手指点,不生感激。
...全文
55 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
野男孩 2011-03-28
  • 打赏
  • 举报
回复
SetWindowHookEx的最后一个参数设置成GetCurrentThreadId(),不要用NULL。

全局钩子和局部钩子用法是不同的。自己google吧。
在他乡奋斗 2011-03-27
  • 打赏
  • 举报
回复
如果安装的是全局钩子,其回调函数应该是DLL中的函数。
其lpfn的说明如下: 钩子子程的地址指针。如果dwThreadId参数为0 或是一个由别的进程创建的线程的标识, lpfn必须指向DLL中的钩子子程。除此以外,lpfn可以指向当前进程的一段钩子子程代码。钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
验证码识别 2011-03-27
  • 打赏
  • 举报
回复
g_hook = ::SetWindowsHookEx(WH_CALLWNDPROC ,MsgFilterHookProc,theApp.m_hInstance,NULL);

全局钩子的话 MsgFilterHookProc 要是DLL中的函数

http://baike.baidu.com/view/1208620.htm

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧