【问题标题】:PostMessage and HWND_BROADCASTPostMessage 和 HWND_BROADCAST
【发布时间】:2014-06-03 17:15:33
【问题描述】:

我正在尝试通过以下方式向所有窗口发送消息:

PostMessage( HWND_BROADCAST, 0x0401, 0, 0 );
or
SendMessage( HWND_BROADCAST, 0x0401, 0, 0 );

问题是,没有窗口接收到这个消息。 Windows 有自己的线程。 问题是......如何向我的应用程序中的所有窗口发送消息,或者为什么这个功能不起作用......

提前致谢。

【问题讨论】:

  • 您如何确定窗口没有收到消息?你为什么要发送 0x401,它是用于私有 Windows 类的? WM_USER 范围内的消息应仅发送到识别该值的类的特定窗口。
  • 哦...我明白了...我更改为 WM_ACTIVATE 并且它可以工作...谢谢...所以,我现在知道为什么它会抛出错误代码 87...

标签: c winapi broadcast sendmessage postmessage


【解决方案1】:

问题是,如何向我的应用程序中的所有窗口发送消息,或者为什么这个功能不起作用。

WM_USER 范围内的消息(顺便说一句,您真的应该停止使用像 0x0401 这样的魔术常量)为私有窗口类保留。另一方面,HWND_BROADCAST 导致消息被传递到系统中的所有顶级窗口。

这两个事实相互冲突,PostMessage 知道这一点。如果PostMessage 接受您的出价,那么它肯定会向窗口传递虚假消息,从而导致不良行为。因此PostMessage 不会将您的消息传递到所有顶级窗口。

现在,如前所述,HWND_BROADCAST 导致消息被传递到系统中的所有顶级窗口。你不想要那个。您只希望它转到应用程序中的窗口。这意味着HWND_BROADCAST 不适合您。如果你想将消息传递到应用程序中的特定窗口,则必须维护或获取窗口列表,并逐一传递消息。

【讨论】:

    【解决方案2】:

    您是否尝试使用它来访问所有顶部窗口?此 API 不适用于子窗口。您还应该确保使用 RegisterWindowMessage 返回的值而不是硬编码值。此链接应该可以帮助您转到子窗口。

    http://forums.codeguru.com/showthread.php?130766-How-to-Send-messages-to-ALL-child-windows

    【讨论】:

    • 另外,UIPI 可能会阻止消息
    • 尝试调用 GetLastError。如果您收到拒绝访问。你有一个特权问题。您可能还想尝试查看 EnumWindow 设置以在调试器中研究问题
    • 这很奇怪......它抛出错误87......(参数不正确)
    • 会不会是你的消息是非法值?我会实现 EnumWindows/EnumProc 的想法只是为了能够更仔细地观察这个过程
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多