2010-02-05 94 views
1

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

回答

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

您想要回到您的应用中的是哪种类型的信息?

SendMessage不适合跨DWORD跨越进程边界传递任何东西(例如,不能将指针传递到另一个进程的内存),但如果你真的需要做的就是传递简单的值,工作得不错。

作为@interjay国家,PostMessage是一个更好的计划,但最终仍然有相同的限制。

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

相关问题