【问题标题】:Call of BroadcastSystemMessage never finishBroadcastSystemMessage 的调用永远不会完成
【发布时间】:2013-06-18 18:19:30
【问题描述】:

我正在从User32.dll 调用BroadcastSystemMessage 方法。在一台 PC (Windows8 Pro) 上调用该方法,但调用从未完成。应用程序正在等待,但永远不会返回结果(也不是异常)。我在几台 Windows8 计算机上尝试过(不同的硬件,有/没有防病毒软件等...),但这种行为在这些计算机上从未发生过。

目标计算机没有任何已安装或正在运行的应用程序,该应用程序会注册自定义消息。所以所有应用程序都应该忽略广播。

这种行为正确吗?我在 MSDN 中没有看到任何关于它的提及。 怎么了?是否有一些正确的方法可以在超时后停止通话?

欢迎任何建议或提示。

代码是:

[DllImport("user32", SetLastError = true)]
public static extern int BroadcastSystemMessage(MessageBroadcastFlags flags, ref MessageBroadcastRecipients lpInfo, uint Msg, IntPtr wParam, IntPtr lParam);
// ...... 
BroadcastSystemMessage(
    MessageBroadcastFlags.BSF_IGNORECURRENTTASK, // do not send message to this process
    ref MessageBroadcastRecipients.BSM_ALLDESKTOPS, // broadcast recipients
    msg, // registered private message
    IntPtr.Zero, // message-specific value
    IntPtr.Zero);
// ...... 
[Flags]
public enum MessageBroadcastFlags : uint {
    BSF_QUERY = 0x00000001,
    BSF_IGNORECURRENTTASK = 0x00000002,
    BSF_FLUSHDISK = 0x00000004,
    BSF_NOHANG = 0x00000008,
    BSF_POSTMESSAGE = 0x00000010,
    BSF_FORCEIFHUNG = 0x00000020,
    BSF_NOTIMEOUTIFNOTHUNG = 0x00000040,
    BSF_ALLOWSFW = 0x00000080,
    BSF_SENDNOTIFYMESSAGE = 0x00000100,
    BSF_RETURNHDESK = 0x00000200,
    BSF_LUID = 0x00000400
}

[Flags]
public enum MessageBroadcastRecipients : uint {
    BSM_ALLCOMPONENTS = 0x00000000,
    BSM_VXDS = 0x00000001,
    BSM_NETDRIVER = 0x00000002,
    BSM_INSTALLABLEDRIVERS = 0x00000004,
    BSM_APPLICATIONS = 0x00000008,
    BSM_ALLDESKTOPS = 0x00000010
}

【问题讨论】:

  • 这有点像在温布利球场内与十万嘈杂的足球迷大喊大叫,并希望所有人都能回应。只需要一个人而不是你来关注比赛,以防止比赛发挥作用。明确你对谁大喊大叫,希望他们仍然无视你。

标签: .net winapi user32 window-messages


【解决方案1】:

我认为这是 Raymond Chen 的问题 - 希望他能看到。

是否有一些正确的方法可以在超时后停止呼叫?

当然,使用 BSF_NOHANG 标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多