2016-08-03 12 views
0

Wenn ich versuche, alle laufenden Prozesse in Maus Ereignishandler zu erhalten, löst es eine Ausnahme.
Zuerst habe ich, dass das Problem besteht, weil ich async Schlüsselwort vor Maus Ereignishandler, aber es war nicht der Fall, da die Ausnahme auch für nicht-asynchrone Methoden ausgelöst wird.
Ich benutze MouseKeyHook Bibliothek.

Ausnahmemeldung:ManagementObjectSearcher funktioniert nicht in globalen Hook

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 von dem ich alle Prozesse immer:

private async void MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    List<ProcessInfo> allRunningProcesses = Logic.GetAllProcesses(); 
    // ... 
} 

alle Prozesse Get von ManagementObjectSearcher mit:

public static List<ProcessInfo> GetAllProcesses() 
{ 
    using (var searcher = new ManagementObjectSearcher(wmiQueryString)) 
      using (var results = searcher.Get()) // EXCEPTION THROWN! 
      { 
       // ... 
      } 
} 

Wie Sie sehen können, wird die Ausnahme beim Aufruf von searcher.Get() ausgelöst.
Hinweis: Diese Methode funktioniert problemlos, wenn sie außerhalb des Mausereignishandlers verwendet wird (MouseUp).

Ich werde alle hilfreichen Ratschläge zu schätzen wissen und zusätzliche Informationen bei Bedarf, danke.

Antwort

0

Wie sich herausstellt, COM erfordert, dass Sie Ihren Code auf STA ausgeführt werden, wenn es MTA ist beteiligt und Sie werden mit den ManagementObjectSearcher Methoden innerhalb SendMessage().
Also, was ich tun musste, ist meinen Code auf different Thread ausführen und SetApartmentState auf ApartmentState.STA setzen.

List<ProcessInfo> allRunningProcesses = null; 

Thread threadProc = new Thread(() => 
{ 
    allRunningProcesses = Logic.GetAllProcesses(); 
}); 

threadProc.SetApartmentState(ApartmentState.STA); 
threadProc.Start(); 
threadProc.Join(); 

Nützliche Links:

msdn- Understanding and Using COM Threading Models
stackoverflow- How to run something in the STA thread

Verwandte Themen