如何将<全局键盘钩子>的<WPARAM wParam, LPARAM lParam> 传递给调用者, "注意":调用者是非窗口类

解决方案 »

  1.   

    又是类成员函数的回调么,偶靠这段代码已经得了很多分了,请见本人blog。
      

  2.   

    向你的调用程序发送消息就可以做到.不用窗口的话用Win32 Application应用程序也行,在里面响应发给它的自定义消息就行了.怎么自定义消息,怎么发送的例子好多,我就不哆嗦了.目的就是把wParam和lParam的值传过去,所以用#define,PostMessage()等就可以了.响应的事查网上.
      

  3.   

    //gaopl_8278(老婆脾气爆) 
    没有窗口句柄怎么发消息??我想还是要用回调函数
      

  4.   

    superarhow(苏泊尔耗)
    我不至于那么蠢把:)  我是静态函数, 我把静态函数的地址给钩子了, 放在全局段里面, 是共享的因为当前窗口非调用者的话, 钩子函数会在不同的地址空间, 我就怀疑是因为地址空间不同造成的gaopl_8278(老婆脾气爆) :
    我还想知道就一个纯类(没有任何继承)如何做到消息获取? 创建线程还是全局消息?shenming123(www.software168.com) 
    PostThreadMessage, 同样的, 因为地址空间不同, 就算线程句柄在全局段, 也会是非法访问吧
      

  5.   

    如果用其他技术实现: socket 管道钩子函数里面就需要每次都打开管道 或者 打开socket, 这样效率太低了所以就是想问, 一个非窗口类怎么接收消息
      

  6.   

    shenming123(www.software168.com) 
    PostThreadMessage, 同样的, 因为地址空间不同, 就算线程句柄在全局段, 也会是非法访问吧
    是线程ID,不是句柄,看看VNC的代码吧,里面有个全局钩子的例子,就是用的PostThreadMessage
      

  7.   

    用线程ID也无法做到! 我的代码是这样的调用者CHotKeyHook 是一个无继承的类, 启动一个全局键盘钩子
    UINT CHotKeyHook::Thread_ReceiveHookMsg(LPVOID lpParam)
    {
    Sleep(1000); MSG   msg;   
    while(1)   
    {
    // while(GetMessage(&msg,   NULL,   0,   0))  
    if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))   
    {   
    if(msg.message== WM_RECEIVE_HOOK_MSG)   
    {
    MessageBox(NULL, 0, 0, MB_OK); g_pthis->KeyBoardProc(msg.wParam, msg.lParam);
    }
    }   
    } return   0;   }
    钩子函数:
    // Trap keyboard messages
    _declspec(dllexport) LRESULT CALLBACK HookFunction(
    int code,
    WPARAM wParam,
    LPARAM lParam)
    { if (code == HC_ACTION)
    {// PostMessage(NULL, g_dwReceiveMsgID, wParam, lParam);
    PostThreadMessage(g_dwReceiveMsgThreadID, g_dwReceiveMsgID, wParam, lParam);

    }    return CallNextHookEx(m_oldhook, code, wParam, lParam);}当调用者窗口非当前窗口, 无法接收到消息! ;9如何处理呢? 说起来线程ID是全局的, 应该没问题啊, 难道消息循环只发生在当前活动窗口?
      

  8.   

    原因找到了, 后面加的线程ID和消息没有初始化, 导致DLL把它判定为非全局的