在一个 键盘 HOOK中, 我想当  hook dll截获到键盘消息时向调用它的窗体发送一个消息, 但有什么方法能得到调用者的 HWND 呢?

解决方案 »

  1.   

    回调函数参数里面就有的吧,看看msdn吧
      

  2.   

    好像传入得信息是没有得,不过能接到keyboard消息得窗口都是激活得,应该在最前面吧。GetFocus  试试看
      

  3.   

    楼上的兄弟, 不是这样的!我写了一个 KeyBoard Hook Dll, 而且是全局的, 拦截所有的键盘输入, 但是回调函数只能写在 DLL中(调用者得不到通知), 我是想每当回调函数有键盘消息时, 就发一个自订义消息到调用者, 这样调用者就知道有键盘输入了! 但事实上, 不管调用者是否处于激活状态, DLL 回调函数都可以拦截所有的键盘输入, 但如果调用者不是处于激活状态, 它根本就收不到 DLL 发送过来的消息 (反之则可以)
      

  4.   

    那你就不用实际调用者的句柄嘛,GetDesktopWindow();  给这个发应该可以显示出来了吧。
      

  5.   

    简单点,可以直接FindWindow();啊
      

  6.   

    晕, 看来 N 人都在潜水调试了一下, 问题解决了, 贴出来看看!调用者的HWND是通过一个初始化函数 InitHook(this->m_hwnd)传入到 DLL 的在DLL中用全局变量g_hwndParent保存, 跟踪时发现, 初始化时, DLL中的 g_hwndParent的值正确, 调用者处于激活时, 也是正确的, 但如果调用者不处于前台, g_hwndParent竟然为0, 当然会错了, 百思不得其解, 后来只好将它放入共享段中, 终于解决了
    #pragma data_seg("SHARED")
    static HHOOK g_hook = NULL;
    static HWND g_hwndParent = NULL;
    #pragma data_seg()
    #pragma comment(linker, "/section:SHARED,RWS")
      

  7.   

    楼主的方法是简单,但还有更强大的.
    有兴趣看看我关于在DLL中截API的贴子.
    http://community.csdn.net/Expert/TopicView.asp?id=3313733