When I try to get all running processes inside mouse event handler it throws an exception. First I thought that the problem persists because I put async
keyword before mouse event handler, but it was not the case, as the exception is thrown also for non-asynchronous methods.
I'm using MouseKeyHook library.
Exception message:
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)).
Event handler from which I'm getting all processes:
private async void MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
List<ProcessInfo> allRunningProcesses = Logic.GetAllProcesses();
// ...
}
Get all processes by using ManagementObjectSearcher
:
public static List<ProcessInfo> GetAllProcesses()
{
using (var searcher = new ManagementObjectSearcher(wmiQueryString))
using (var results = searcher.Get()) // EXCEPTION THROWN!
{
// ...
}
}
As you can see the exception is thrown when calling searcher.Get()
. Note: This method works without any issues if used outside the mouse event handler ( MouseUp
).
As it turns out, COM requires you to run your code on STA if there is MTA involved and you are using the ManagementObjectSearcher
methods within SendMessage()
.
So, what I needed to do is to run my code on differet thread and set SetApartmentState
to ApartmentState.STA
.
List<ProcessInfo> allRunningProcesses = null;
Thread threadProc = new Thread(() =>
{
allRunningProcesses = Logic.GetAllProcesses();
});
threadProc.SetApartmentState(ApartmentState.STA);
threadProc.Start();
threadProc.Join();
Useful links:
msdn- Understanding and Using COM Threading Models
stackoverflow- How to run something in the STA thread
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.