简体   繁体   中英

ManagementObjectSearcher does not work within global hook

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM