ManagementObjectSearcher 在全局挂钩中不起作用

ManagementObjectSearcher does not work within global hook

当我尝试在鼠标事件处理程序中获取所有 运行 进程时,它会抛出异常。首先我认为问题仍然存在,因为我在鼠标事件处理程序之前放置了 async 关键字,但事实并非如此,因为非异步方法也会抛出异常。

我正在使用 MouseKeyHook 库。

异常信息:

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) 之外使用,此方法可以正常工作。

事实证明,如果有 MTA,COM 要求您 运行 在 STA 上编写您的代码 涉及并且您正在 SendMessage().
中使用 ManagementObjectSearcher 方法 所以,我需要做的是 运行 我的代码 差异线程并将 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
计算器- How to run something in the STA thread