【问题标题】:ManagementObjectSearcher does not work within global hookManagementObjectSearcher 在全局挂钩中不起作用
【发布时间】:2016-12-09 19:48:34
【问题描述】:

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

【问题讨论】:

    标签: c# com wmi pinvoke mousekeyhook


    【解决方案1】:

    事实证明,如果存在 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
    stackoverflow-How to run something in the STA thread

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多