0

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

我正在使用MouseKeyHook库。

异常消息:

附加信息:为此 RuntimeCallableWrapper 转换到 COM 上下文 0x1ac936a0 失败,并出现以下错误:由于应用程序正在调度输入同步调用,因此无法进行传出调用。(来自 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如果在鼠标事件处理程序 ( )之外使用此方法,则不会出现任何问题。

4

1 回答 1

1

事实证明,如果涉及 MTA 并且您正在ManagementObjectSearcher使用SendMessage().
所以,我需要做的是在不同的线程上运行我的代码并设置SetApartmentStateApartmentState.STA.

List<ProcessInfo> allRunningProcesses = null;

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

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

有用的链接:

msdn-理解和使用 COM 线程模型
stackoverflow-如何在 STA 线程中运行某些东西

于 2016-08-06T21:32:46.947 回答