消息钩子问题,急!! 我想用线程钩子拦截线程中一个控件窗口的WM_KILLFOUCSE消息,请问各位大侠该使用哪种消息钩子类型我试了 WH_GETMESSAGE WH_CBT WH_CALLWNDPROC 这3种, 在我点开另外一个进程的窗口的时候,这3种类型的钩子都不好使!很无奈中。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WH_CBT 肯定好使 不好使是用发不对吧 g_hook3 = ::SetWindowsHookEx(WH_CBT, CBTProc, NULL, 0);LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam){ switch (nCode) { case HCBT_SETFOCUS: case HCBT_ACTIVATE: // 一些处理代码 default: break; } return CallNextHookEx(g_hook3, nCode, wParam, lParam);}在点任务栏其他进程的窗口的时候这个函数就没有被执行,只是点自己进程中其他子窗口的时候它才被执行了。 不知道咋回事? g_hook3 = ::SetWindowsHookEx(WH_CBT, CBTProc, NULL, GetCurrentThreadId());这里写错了,是这样 但是 我用spy++ 看了那个控件的窗口的消息 它确实收到过 WM_KILLFOUCSE消息啊 SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, GetCurrentThreadId());用这个,自己处理回调函数 当你点击别的窗口的时候,是自己窗口killfocus,自己线程的事当然可以抓到。SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, GetCurrentThreadId()); 式了一下SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, GetCurrentThreadId());还是没成功,郁闷啊!! 用全局钩子那肯定能搞定问题,这个不用说,但是我想不通为什么明明是自己进程中的窗口收到了WM_KILLFOUCES消息,却抓不到。 问题你都没讲清楚,你自己说了点开另外一个进程,然后你下面给的代码又是全局的。 你直接说注入的线程不就都明白了吗?弄的大家都迷糊。::SetWindowsHookEx(WH_CBT, CBTProc, NULL, 0); 你这个函数全局不是全局,线程不是线程的。实际上你这个钩子的意思是 “勾到线程ID为0的线程钩子”。 当然就不会有效。而SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, GetCurrentThreadId());则是勾到本进程的线程钩子。 也自然勾不到你的目标进程。解决方法: 使用findwindow 与GetWindowThreadProcessId配合获取目标进程。 比如最后获取到的进程是DWORD m_thread; 则钩子代码SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, m_thread); 如果你的情况我没猜错。这就可以了。 嗯,我开始是把代码贴错了!具体情况是这样子的, 我在程序(一个ACTIVE X)里面使用了一个别人做的控件(类似一个EditBox), 然后我想做一个类似于VS助手那样的插件, 当在这个控件里面输入特定的单词后给出一个提示的窗体。 现在出现的问题是,当这个提示框显示出来之后,我把任务栏的其他进程窗口(如WORD等)打开的时候, 我想让我创建的这个窗口消失。 所以就相到了去勾我使用的那个控件窗口的WM_KILLFOUCES消息。但是不想用全局钩子。 据说全局钩子有众多缺点~ 我也是刚学WINDOWS程序, 希望大侠们能给点建议。 满分求如何使用vc实现更改文件的“从父项继承那些可以应用到子对象的权限项目“那个权限 MFC的Dialog中如何验证一个字符串是否是有效的邮箱地址? 在Windows中“另存为”这个功能调用的是那个API函数? 我的程序报如下错误怎么办???????(含代码) 怎么使listbox的文本居中? 请问怎样才能模拟键盘操作? 如何改变Edit中的字体大小 关于取系统日期的问题 已知BMP文件数据,如何能得到HBITMAP句柄? 各位,我想找编程的工作干,请大家为我出出主意。 求助:StartIo 例程的返回点? 窗口重绘,出现闪烁??
{ switch (nCode)
{
case HCBT_SETFOCUS:
case HCBT_ACTIVATE:
// 一些处理代码
default:
break;
}
return CallNextHookEx(g_hook3, nCode, wParam, lParam);
}在点任务栏其他进程的窗口的时候这个函数就没有被执行,只是点自己进程中其他子窗口的时候它才被执行了。 不知道咋回事?
这里写错了,是这样
SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, GetCurrentThreadId());
实际上你这个钩子的意思是 “勾到线程ID为0的线程钩子”。 当然就不会有效。
而SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, GetCurrentThreadId());则是勾到本进程的线程钩子。 也自然勾不到你的目标进程。
解决方法:
使用findwindow 与GetWindowThreadProcessId配合获取目标进程。
比如最后获取到的进程是DWORD m_thread;
则钩子代码SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, m_thread);
如果你的情况我没猜错。这就可以了。
现在出现的问题是,当这个提示框显示出来之后,我把任务栏的其他进程窗口(如WORD等)打开的时候, 我想让我创建的这个窗口消失。 所以就相到了去勾我使用的那个控件窗口的WM_KILLFOUCES消息。但是不想用全局钩子。 据说全局钩子有众多缺点~ 我也是刚学WINDOWS程序, 希望大侠们能给点建议。