【发布时间】:2010-02-05 01:03:13
【问题描述】:
我使用 win32 安装了一个全局挂钩,但我需要与我的主应用程序通信。我该怎么做?我猜这个dll可以有一个功能,我设置我的应用程序HWND然后钩子可以发送消息吗?或者我应该搜索窗口标题以从钩子中找到我的应用程序并以这种方式发送消息?什么是最好的策略,是 sendmessage 最好的方式,还是我应该使用其他东西来与我的全局钩子通信。
【问题讨论】:
我使用 win32 安装了一个全局挂钩,但我需要与我的主应用程序通信。我该怎么做?我猜这个dll可以有一个功能,我设置我的应用程序HWND然后钩子可以发送消息吗?或者我应该搜索窗口标题以从钩子中找到我的应用程序并以这种方式发送消息?什么是最好的策略,是 sendmessage 最好的方式,还是我应该使用其他东西来与我的全局钩子通信。
【问题讨论】:
使用 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。
【讨论】:
您希望将什么类型的信息返回到您的应用中?
SendMessage 无法跨进程边界传递 DWORD 之外的任何内容(例如,您不能将一个进程中指向内存的指针传递给另一个进程),但如果您真正需要做的只是传递简单的值,它就可以工作够了。
正如@interjay 所说,PostMessage 是一个更好的计划,但最终仍然有相同的限制。
相关:“Hazards of cross-process messages”、“PasswordSpy - Retrieving lost passwords using Windows hooks”
【讨论】: