2016-08-03 14 views
0

マウスイベントハンドラ内で実行中のすべてのプロセスを取得しようとすると、例外がスローされます。
私はasyncというキーワードをマウスイベントハンドラの前に置くので、問題は続きますが、非同期メソッドでも例外がスローされるため、そうではありませんでした。
私はMouseKeyHookライブラリを使用しています。グローバルフック内でManagementObjectSearcherが機能しない

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! 
      { 
       // ... 
      } 
} 


例外メッセージ:私はすべてのプロセスを取得していたから

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)).

イベントハンドラ

ご覧のとおり、searcher.Get()を呼び出すと例外がスローされます。
注:このメソッドは、マウスイベントハンドラ(MouseUp)の外で使用すると問題なく動作します。

有用なアドバイスをいただき、必要に応じて追加情報を提供します。ありがとうございます。

答えて

0

MTA があり、以内のManagementObjectSearcherメソッドを使用している場合、COMはSTAでコードを実行する必要があります。
だから私は、 differetスレッドでコードを実行し、SetApartmentStateApartmentState.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
stackoverflow- How to run something in the STA thread

関連する問題