windows - 发送和接收 Windows 消息

标签 windows winapi sendmessage message-pump

Windows 消息似乎是通知 Windows 操作系统上的应用程序的好方法。它实际上运行良好,但我想到了几个问题:

如何向 SendMessage 例程的 lparam 指定结构化数据(就像许多消息代码那样)?我的意思是...参数当然是一个指针,但是进程如何访问它呢?也许它是由发送/接收消息的进程加载的 DLL 分配的?

是否可以共享消息结构化参数(在发送者和接收者之间)?它们在发送操作和查看操作之间编码?如果是这样的话,是否可以通过修改结构化参数来从调用者返回数据?这对于 SendMessage 很有用,因为它是同步执行的,而不是 PostMessage 例程。

其他疑问...

PostMessageSendNotifyMessage有什么区别?

如果应用程序在处理消息泵时向自身调用 SendMessage,是否可能导致死锁?

最佳答案

如果消息是标准窗口消息之一 - 通常消息 ID 介于 0 和 WM_USER 之间,则系统窗口消息调度逻辑包含将结构编码到消息调度到的任何进程的代码。

WM_USER 以上的消息没有得到这样的处理 - 这包括 Windows 95 引入的所有常见控制消息 - 您不能结束任何 LVM_*( ListView 消息)或其他新的控制消息到不同进程中的控件,并且返回结果。

WM_COPYDATA 是专门作为用户代码在进程之间编码(marshal)任意数据的通用机制而引入的 - 在 WM_COPYDATA 之外(或重用其他 Windows 标准消息),无法让 Windows 使用消息队列机制自动编码(marshal)结构化数据进入另一个进程。

如果是您自己的代码执行消息的发送和接收,您可以使用 dll 来定义共享内存部分,而不是发送指针(该 dll 在每个进程中的基础可能不同)发送偏移量到共享内存块。

如果您想与不编码(marshal)数据的外部应用程序交换结构化数据(例如从列表或 TreeView 中提取数据),那么您需要执行 dll 注入(inject),以便可以发送和处理来自“in -过程”。


SendNofityMessage 与 PostMessage 不同,因为 PostMessage 总是将消息放入消息队列中,而 SendNotifyMessage 的作用类似于同一进程中窗口的 SendMessage。然后,即使目标窗口位于另一个进程中,消息也会直接分派(dispatch)到窗口过程,而不是通过 GetMessage 或 PeekMessage 放入发布消息队列中进行检索。


最后,可能会导致死锁 - 然而,在“阻塞”sendmessage 等待另一个线程回复时,SendMessage 将分派(dispatch)从其他线程发送(未发布)的消息 - 以防止死锁。这可以缓解大多数潜在的死锁,但仍然有可能通过调用其他阻塞 api 或进入模态消息处理循环来创建死锁。

关于windows - 发送和接收 Windows 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3143970/

相关文章:

在 Linux 上使用 MinGW 为 Windows 编译 Gnu11

c++ - 通过快捷方式启动程序时 WM_SETICON 不起作用

c++ - 从另一个窗口上的控件获取文本时出现问题

powershell - 单行中的Send-MailMessage命令不起作用

c - 使用 C 的 Windows 进程间通信 (IPC)

node.js - “NODE_OPTIONS”未被识别为内部或外部命令

c - 为什么SetWindowLongPtr在处理WM_CREATE消息时总是返回零?

c++ - WriteFile Hook 无法捕获写入文件操作

java - 依赖于特定 dll 的 play(java) 项目如何在非 Windows 计算机上运行?

winapi - 从 Rundll32 调用的 SetCursorPos 函数?