2016-05-11 4 views
0

MouseKeyboardActivityMonitorを使用して、たとえばマウスを無効にするなどのユーザーアクティビティにいくつかの制限を設定しました。MangementObjectSearcherを使用すると、異なるスレッドエラーでマーシャリングされたアプリケーションがアプリケーションと呼ばれました

www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C

私は私の形で

public partial class MyForm:Form 
{ 
    KeyboardHookListener kl; 
    MouseHookListener ml; 
    MyForm:Form() 
    { 
     ml = new MouseHookListener(new GlobalHooker()); 
     ml.Enabled=true; 
    } 
    private void MyForm_Load 
    { 
     ml.MouseDownExt += ml_MouseDownExt; 
     // And same thing for Click or ... 
    } 
    private void ml_MouseDownExt(object sender,MouseEventExtArgs e) 
    { 
      e.Handled= true; 
      // I have got hard disk serial number here 
      string sn = HardDisk.Serial; 
    } 

}

をこれらのコードを持っています

そしてHardDisk.Serial

のコード
ManagementObjectSearcher s= new ManagementObjectSearcher(" SELECT *..."); 
foreach(var wmi in s.Get()) 
{ 
} 

私はMyFormをクリックしたときに、私はエラーを取得します。

私は私のソリューションを構築し、手動 を、それを実行すると、私はこのエラーを取得する

The application called an interface that was Marshalled for different thread 

スタック:

at system.management.MangementException.ThrowWithExtendedInfo(Exception e) 
at system.management.MangementObjectSearcher.Get() 
at HardDisk.Get_serial() 
at ml_MouseDownExt(object sender,MouseEventExtArgs e) 
at  MouseKeyboardActivityMonitor.MouseHookListener.InvokeMouseEventHandlerExt(EventHandler'1 handler,MouseEventExtArgs e) 

しかし、私は、例外がハードディスクにスローされますVisual Studioに私の解決策を実行したとき。シリアル s.Get行で、私はこれを得る

エラー:

Managed debugging assistant ' DisconnectedContext' 
Has detected a problem in 'my app Name.exe' 
Transition into com context 0xa4206 for this runtime callable wrapper failed with following error : 
an outgoing call can't be made since the application is dispatching an input asynchronous call 

MangementObjectSearcherクラスから2つのエラーが発生していることは明らかです.MyForm内の別の場所でシリアル番号を取得します。エラーは、ml_MouseDownExtメソッドまたはGlobalHookerのイベントに追加されたメソッドをシリアルに取得すると発生します。 msdn。 MangementObjectSearcherの継承階層では、私はそれは私がこれらのエラーを避ける必要がありますどのようにこれらのエラーか

に関連していることを知りませんSystem.MarshalByRefObject

https://msdn.microsoft.com/en-us/library/system.management.managementobjectsearcher(v=vs.110).aspx

を参照してください?

+0

このMDAを取得するために何をしたのかははっきりしていませんが、確かに非常に悪いです。スニペットもCodeproject.comプロジェクトもヒントはありません。 Program.csファイルに戻り、Main()メソッドに[STAThread]属性があることを確認します。あなたがしていることを本当に分かっていない限り、ワーカースレッド上でフォームオブジェクトを作成することは決してありません。ちょうど誰についてもしません。 –

答えて

0

正しいスレッドでフックコールバックが発生していません。それはちょうど最初の問題です。第二の問題は、あなたがグローバルフックのハンドラでは、COMオブジェクトと対話しようとしているということです

private void ml_MouseDownExt(object sender,MouseEventExtArgs e) 
{ 
     e.Handled= true; 

     var wrongThread = new Action(()=> 
     { 
      // I have got hard disk serial number here 
      string sn = HardDisk.Serial; 
      //put anything else you were planning on doing with sn here 
     } 
     BeginInvoke(wrongThread, null); 
} 

:BeginInvokeメソッドでそれをラップし、すべてが順調になります。 BeginInvokeは数マイクロ秒間遅延させることでうまく回るはずです。

Disposeがグローバルフックで呼び出されることを忘れないでください。あなたが頻繁にリブートするのを好まない限り、アプリケーションを閉じるだけでは不十分です。

+0

私はまだエラーがあります。 2つのエラーが発生しています – mohsen

関連する問題

 関連する問題