ManagementObjectSearcher无法在全局挂钩中工作

本文关键字:工作 全局 ManagementObjectSearcher | 更新日期: 2023-09-27 18:00:02

当我试图在鼠标事件处理程序中获取所有正在运行的进程时,它会抛出一个异常。首先,我认为问题仍然存在,因为我将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)之外使用此方法,则不会出现任何问题。

ManagementObjectSearcher无法在全局挂钩中工作

事实证明,如果存在MTA,COM要求您在STA上运行代码并且您正在使用SendMessage()中的ManagementObjectSearcher方法
所以,我需要做的是在区分线程并将CCD_ 7设置为CCD_。

List<ProcessInfo> allRunningProcesses = null;
Thread threadProc = new Thread(() =>
{
    allRunningProcesses = Logic.GetAllProcesses();
});
threadProc.SetApartmentState(ApartmentState.STA);
threadProc.Start();
threadProc.Join();

有用的链接:

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