我正在BroadcastSystemMessage
调用User32.dll
方法。在一台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
}
答案 0 :(得分:1)
我认为这对Raymond Chen来说是一个问题 - 希望他能看到它。
有些正确的方法可以在超时后停止通话吗?
当然,请使用BSF_NOHANG标志。