2013-06-21 2 views
0

Я звоню BroadcastSystemMessage метод от User32.dll. На одном ПК (Windows8 Pro) вызывается метод, но вызов никогда не заканчивается. Приложение ожидает, но результат (или исключение) никогда не возвращается. Я попробовал его на нескольких компьютерах под управлением Windows8 (разные HW, с антивирусом и без него), но на этих компьютерах такого поведения никогда не бывает.Звонок BroadcastSystemMessage никогда не заканчивается

На целевом компьютере нет установленного или запущенного приложения, которое зарегистрировало бы пользовательское сообщение. Поэтому все приложения должны игнорировать трансляцию.

Правильное ли поведение? Я не видел упоминаний в 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 
} 
+2

Это немного похоже на крик на стадионе Уэмбли со сто тысяч шумных футбольных болельщиков и надежду, что все они ответят. Просто вам нужно обратить внимание на матч вместо вас, чтобы он не работал. Будьте конкретны, на кого вы кричите, ожидайте, что они все равно игнорируют вас. –

ответ

1

Я думаю, что это вопрос для Raymond Chen - надеюсь, он увидит его.

Есть ли правильный способ остановить вызов после некоторого таймаута?

Конечно, используйте флаг BSF_NOHANG.

 Смежные вопросы

  • Нет связанных вопросов^_^