我想用线程钩子拦截线程中一个控件窗口的WM_KILLFOUCSE消息,请问各位大侠该使用哪种消息钩子类型
我试了 WH_GETMESSAGE  WH_CBT  WH_CALLWNDPROC 这3种, 在我点开另外一个进程的窗口的时候,这3种类型的钩子都不好使!
很无奈中。

解决方案 »

  1.   

    WH_CBT  肯定好使    不好使是用发不对吧
      

  2.   

    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);
    }在点任务栏其他进程的窗口的时候这个函数就没有被执行,只是点自己进程中其他子窗口的时候它才被执行了。 不知道咋回事?
      

  3.   

    g_hook3 = ::SetWindowsHookEx(WH_CBT, CBTProc, NULL, GetCurrentThreadId());
    这里写错了,是这样
      

  4.   

    但是 我用spy++ 看了那个控件的窗口的消息 它确实收到过 WM_KILLFOUCSE消息啊
      

  5.   

    SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, GetCurrentThreadId());用这个,自己处理回调函数
      

  6.   

    当你点击别的窗口的时候,是自己窗口killfocus,自己线程的事当然可以抓到。
    SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, GetCurrentThreadId());
      

  7.   

    式了一下SetWindowsHookEx(WH_MSGFILTER, MenuInputFilter, NULL, GetCurrentThreadId());还是没成功,郁闷啊!! 
      

  8.   

    用全局钩子那肯定能搞定问题,这个不用说,但是我想不通为什么明明是自己进程中的窗口收到了WM_KILLFOUCES消息,却抓不到。
      

  9.   

    问题你都没讲清楚,你自己说了点开另外一个进程,然后你下面给的代码又是全局的。 你直接说注入的线程不就都明白了吗?弄的大家都迷糊。::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);
     如果你的情况我没猜错。这就可以了。
      

  10.   

    嗯,我开始是把代码贴错了!具体情况是这样子的, 我在程序(一个ACTIVE X)里面使用了一个别人做的控件(类似一个EditBox), 然后我想做一个类似于VS助手那样的插件, 当在这个控件里面输入特定的单词后给出一个提示的窗体。  
    现在出现的问题是,当这个提示框显示出来之后,我把任务栏的其他进程窗口(如WORD等)打开的时候, 我想让我创建的这个窗口消失。 所以就相到了去勾我使用的那个控件窗口的WM_KILLFOUCES消息。但是不想用全局钩子。 据说全局钩子有众多缺点~  我也是刚学WINDOWS程序, 希望大侠们能给点建议。