ManagementObjectSearcher 在全局挂钩中不起作用
ManagementObjectSearcher does not work within global hook
当我尝试在鼠标事件处理程序中获取所有 运行 进程时,它会抛出异常。首先我认为问题仍然存在,因为我在鼠标事件处理程序之前放置了 async
关键字,但事实并非如此,因为非异步方法也会抛出异常。
我正在使用 MouseKeyHook 库。
异常信息:
Additional information: Transition into COM context 0x1ac936a0 for
this RuntimeCallableWrapper failed with the following error: An
outgoing call cannot be made since the application is dispatching an
input-synchronous call. (Exception from 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,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
计算器- How to run something in the STA thread
当我尝试在鼠标事件处理程序中获取所有 运行 进程时,它会抛出异常。首先我认为问题仍然存在,因为我在鼠标事件处理程序之前放置了 async
关键字,但事实并非如此,因为非异步方法也会抛出异常。
我正在使用 MouseKeyHook 库。
异常信息:
Additional information: Transition into COM context 0x1ac936a0 for this RuntimeCallableWrapper failed with the following error: An outgoing call cannot be made since the application is dispatching an input-synchronous call. (Exception from 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,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
计算器- How to run something in the STA thread