2016-08-03 13 views
0

Когда я пытаюсь получить все запущенные процессы внутри обработчика событий мыши, он выдает исключение.
Прежде всего, я решил, что проблема остается, потому что я поставил ключевое слово async перед обработчиком события мыши, но это было не так, поскольку исключение также выбрано для неасинхронных методов.
Я использую MouseKeyHook библиотеки.

Сообщение об исключении:ManagementObjectSearcher не работает в глобальном подключении

Additional information: Transition into COM context 0x1ac936a0 for this RuntimeCallableWrapper failed with the following error: An outgoing call cannot be made since the application is dispatching an input-synchronous call. (Exception from HRESULT: 0x8001010D (RPC_E_CANTCALLOUT_ININPUTSYNCCALL)).

Обработчик события, от которого я получаю все процессы:

private async void MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    List<ProcessInfo> allRunningProcesses = Logic.GetAllProcesses(); 
    // ... 
} 

Получить все процессы с помощью ManagementObjectSearcher:

public static List<ProcessInfo> GetAllProcesses() 
{ 
    using (var searcher = new ManagementObjectSearcher(wmiQueryString)) 
      using (var results = searcher.Get()) // EXCEPTION THROWN! 
      { 
       // ... 
      } 
} 

Как вы можете видеть, исключение вызывается при вызове searcher.Get().
Примечание: Этот метод работает без проблем при использовании вне обработчика события мыши (MouseUp).

Буду признателен за любые полезные советы и дополнительную информацию, если необходимо, спасибо.

ответ

0

Как выясняется, COM требует, чтобы запустить свой код на STA, если есть MTA участие и вы используете ManagementObjectSearcher методы в SendMessage().
Итак, мне нужно было запустить мой код на differet thread и установить SetApartmentState на ApartmentState.STA.

List<ProcessInfo> allRunningProcesses = null; 

Thread threadProc = new Thread(() => 
{ 
    allRunningProcesses = Logic.GetAllProcesses(); 
}); 

threadProc.SetApartmentState(ApartmentState.STA); 
threadProc.Start(); 
threadProc.Join(); 

Полезные ссылки:

msdn- Understanding and Using COM Threading Models
stackoverflow- How to run something in the STA thread