ManagementObjectSearcher не работает в глобальном хуке

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

Сообщение об исключении:

Дополнительная информация: Переход в контекст COM 0x1ac936a0 для этого RuntimeCallableWrapper завершился неудачно со следующей ошибкой: Исходящий вызов не может быть выполнен, так как приложение отправляет синхронный входной вызов. (Исключение из 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).

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

1 ответ

Решение

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

List<ProcessInfo> allRunningProcesses = null;

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

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

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

msdn - Понимание и использование моделей потоков COM
stackru- Как запустить что-то в потоке STA

Другие вопросы по тегам