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