如何从我的全局钩子与我的应用程序进行通信?

时间:2010-02-05 01:03:13

标签: c++ windows winapi

我使用win32安装了一个全局钩子,但我需要与我的主应用程序通信。我该怎么做?我想这个DLL可以有一个功能,我设置我的应用程序HWND然后钩子可以发送消息吗?或者我应该搜索窗口标题以从钩子中找到我的应用程序并以这种方式发送消息?什么是最好的策略,并且sendmessage是最好的方式,或者我应该使用其他东西与我的全局钩子进行通信。

2 个答案:

答案 0 :(得分:1)

  • 使用PostMessage,而不是SendMessage:SendMessage可能需要一段时间,这可能会导致其他应用程序出现延迟。

  • 初始化挂钩时,使用您定义的函数将应用程序的HWND放入挂钩DLL中。这应存储在DLL中的共享数据段中,如下所示:

    #pragma data_seg(".shared")
    HWND hWndApp = NULL;
    #pragma data_seg()
    #pragma comment("linker, /section:.shared,rws")
    
    void setAppWnd(HWND hWnd) {
        hWndApp = hWnd;
    }
    

您可以看到执行此操作here的完整示例。

答案 1 :(得分:1)

您尝试使用哪种类型的信息回到自己的应用中?

SendMessage没有能力跨越进程边界传递超出DWORD的任何东西(例如,你不能将指针传递到一个进程中的内存到另一个进程),但是如果您真正需要做的就是传递简单的值,它将起作用够了。

正如@interjay所说,PostMessage是一个更好的计划,但最终仍然有相同的限制。

相关:“Hazards of cross-process messages”,“PasswordSpy - Retrieving lost passwords using Windows hooks