0

BroadcastSystemMessageからメソッドを呼び出していUser32.dllます。1 台の 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
}
4

1 に答える 1

1

これは Raymond Chen への質問だと思います。

タイムアウト後に呼び出しを停止する正しい方法はありますか?

もちろん、BSF_NOHANG フラグを使用してください。

于 2013-06-21T16:25:36.210 に答える