![](/img/trans.png)
[英]ManagementObjectSearcher does not contain a definition for Get
[英]ManagementObjectSearcher does not work within global hook
当我尝试在鼠标事件处理程序中获取所有正在运行的进程时,它将引发异常。 首先,我认为问题仍然存在,因为我在鼠标事件处理程序之前放置了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
)之外使用此方法,则不会出现任何问题。
事实证明,如果涉及到MTA,并且您在SendMessage()
中使用ManagementObjectSearcher
方法,则COM要求您在STA上运行代码。
因此,我需要做的是在SetApartmentState
线程上运行我的代码,并将SetApartmentState
设置为ApartmentState.STA
。
List<ProcessInfo> allRunningProcesses = null;
Thread threadProc = new Thread(() =>
{
allRunningProcesses = Logic.GetAllProcesses();
});
threadProc.SetApartmentState(ApartmentState.STA);
threadProc.Start();
threadProc.Join();
有用的链接:
msdn- 了解和使用COM线程模型
stackoverflow- 如何在STA线程中运行某些内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.