
存在一种叫做 message-only window(消息专用窗口)的东西,这是一个极具误导性的名字,因为接收消息本就是窗口一直在做的事情。这就像把某个东西称为“只含水的游泳池”或“只产热的烤箱”一样。
说极具误导性还因为它并不能接收所有消息。
“等等,这个窗口的名字说它唯一能做的事就是接收消息,而你现在却告诉我它连这都做不到!”
message-only window 的关键在于它只接收那些专门发送或投递给它的消息。你可以用它在发送方和窗口之间建立一个私有通道。创建 message-only window 后,你可以通过调用 PostMessage 并传入其窗口句柄 (window handle) 来将消息放入窗口队列 (queue),或者通过调用 SendMessage 并传入窗口句柄来发送非排队消息。
message-only window 的有趣之处在于它不参与广播消息 (broadcast messages)。
许多窗口消息会发送给所有顶级窗口 (top-level windows),例如 WM_QUERYENDSESSION、WM_SETTINGCHANGE、WM_DDE_INITIATE 以及任何通过 HWND_BROADCAST 发送的消息。这些消息不会被发送到 message-only window。
在内部,message-only window 被视作一个由系统管理的、名为 HWND_MESSAGE 的公共父窗口的子窗口。这个系统管理的公共父窗口是永久不可见的,这也导致了 message-only window 同样永久不可见。这也是为什么 message-only window 对于枚举 (enumeration)
和广播 (broadcasts) 是不可见的原因:枚举和广播是针对顶级窗口执行的,但 message-only window 在内部被当作 HWND_MESSAGE 的子窗口,因此不被视为顶级窗口。
3991

被折叠的 条评论
为什么被折叠?



