代码之家  ›  专栏  ›  技术社区  ›  Luca

发送和接收Windows消息

  •  2
  • Luca  · 技术社区  · 14 年前

    Windows消息似乎是通知Windows操作系统上的应用程序的好方法。实际上效果很好,但我想不出什么问题:

    如何 将结构化数据指定给 拉帕姆 sendmessage例程(像许多消息代码一样)?我的意思是…当然,参数是指针,但是进程如何访问它?可能是由发送/接收消息的进程加载的dll分配的吗?

    有可能吗? 要共享消息结构参数(发送方和接收方之间)?他们被安排在 发送 操作和 窥视 手术?如果是这样,可以通过修改结构化参数从调用者返回数据吗?这对于sendmessage很有用,因为它是同步执行的,而不是后期消息例程。

    其他疑问…

    有什么区别吗 发送消息 发送通知消息?

    如果应用程序在处理消息泵的同时调用sendmessage本身,是否可能导致死锁?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Chris Becke    14 年前

    如果消息是标准窗口的消息之一(通常消息ID在0和wm_用户之间),那么系统窗口消息调度逻辑包含代码,用于将结构封送到消息调度到的任何进程。

    wm_用户以上的消息不会得到这样的处理——这包括Windows 95中引入的所有常见控制消息——您不能在不同的进程中将任何lvm_*(列表视图消息)或其他新的控制消息终止到控件,并返回结果。

    wm-copydata被专门介绍为用户代码在进程之间封送任意数据的通用机制-在wm-copydata(或重用其他Windows标准消息)之外,没有办法让Windows使用消息队列机制自动封送结构化数据到其他进程。

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

    如果要与不封送数据的外部应用程序交换结构化数据(例如从列表或树视图中提取数据),则需要执行DLL注入,以便可以从“进程内”发送和处理消息。


    sendNoFityMessage与postmessage不同,因为postmessage总是将消息放入消息队列,而sendNotifyMessage在同一进程中与Windows的sendmessage类似。然后,即使目标窗口在另一个进程中,消息也会直接发送到窗口进程,而不是通过getmessage或peekmessage放在已发布消息队列中进行检索。


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

        2
  •  0
  •   Jerry Coffin    14 年前

    您的担忧主要适用于进程之间发送的消息——在进程内,您只需发送一个指针,发送者只需确保数据在接收器使用完之前保持有效。

    一些进程间消息要求您使用 HGLOBAL (例如,剪贴板消息)。其他需要明确的块大小(例如, WM_COPYDATA )还有一些以预先指定的结构(例如,以零结尾的字符串)发送数据以支持编组。

    一般来说,您不能通过修改收到的块来返回值。要返回值,您需要(例如)发送回复消息。

    SendMessage 有一些(相当复杂的)逻辑来防止死锁,但您仍然需要小心。