ManagementObjectSearcher在全局钩子

时间:2016-08-03 22:21:01

标签: c# com wmi pinvoke mousekeyhook

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

异常消息:

  

附加信息:转换到COM上下文0x1ac936a0 for   此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 个答案:

答案 0 :(得分:0)

事实证明,如果有MTA,COM要求您在STA上运行代码 您正在使用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- Understanding and Using COM Threading Models
stackoverflow- How to run something in the STA thread