4

私は最近、低レベルのキーボードフックを調べています。私はすでに私の仕事をしていますが、コードについていくつか質問があります。

ここにコンソールアプリケーションの完全なコードがあるようです:http: //blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx

Main関数には、「UnhookWindowsHookEx」DLL関数と呼ばれるプログラマーが表示されます。この関数の目的は何ですか?コメントアウトするとどうなりますか?(特に悪い結果?)

編集:

後もう一つ。コードを機能させるために「Application.Run()」を呼び出す必要があるのはなぜですか?

4

3 に答える 3

3
  1. この特定のケースでは、UnhookWindowsHookExがコメント化されている場合、プログラムはとにかく終了するため、悪いことは何も起こりません。ただし、プログラムの実行を継続するときとプログラムの終了時の両方で、リソースの使用量を制御できるように、リソースが不要になったときにリソースを閉じることをお勧めします。

  2. Application.Runがない場合、プログラムはすぐに終了します。Application.Runを使用する2番目の理由は、SetWindowsHookEx要件です。動作するにはメッセージループが必要です。Application.Runはメッセージループを実行します。Ctrl + Cを押すと、プログラムを停止できます。

于 2012-10-03T08:44:45.963 に答える
2

UnhookWindowsHookEx()を呼び出す必要は厳密にはありません。Windowsは、呼び出すのを忘れたことを認識し、プログラムが終了するとフックを解除します。必然的に、フックをクリーンアップしないと、Windowsがハングします。オペレーティングシステムに任せないことは「マナー」と見なされます。

Application.Run()呼び出しは、低レベルのフックを実装するプログラムの厳しい要件です。メッセージループがない場合、たとえばConsole.ReadLine()を代わりに使用すると、フックへのコールバックは行われません。特定のWindowsの約束は、コールバックがSetWindowsHookEx()を呼び出したのと同じスレッドで行われることです。これを行うために、Windowsにはどういうわけか「侵入」があり、スレッドにコールバックメソッドを呼び出すように強制します。スレッドを勝手に中断して強制的に呼び出しを行うことはできません。これは、恐ろしい再入可能性の問題を引き起こします。スレッドは明確に定義された状態である必要があり、アイドル状態であり、プログラムの状態を変更していない必要があります。

メッセージループ、特にGetMessage()またはPeekMessage()winapi関数はそのシグナルであり、スレッドがメッセージループをポンピングすると、アイドル状態になり、Windowsが何かを実行するように指示するのを待機します。これは、生産者/消費者問題に対する普遍的な解決策です。

于 2012-10-03T10:23:43.197 に答える
2

いいえ、それは悪いです。

ネイティブフックは、ファイルまたはプロセスハンドルと同じ意味での「ハンドル」ではありません。それらはWindowsセッションに対して永続的であり、リソースが不足しています。

私は可能な限りそれを呼び出すようにしていますが、ハングするなどの理由で強制終了することがよくあり、20回ほど経つとフックが登録されません。

一部のゲームのように、フックを使用する他のすべてのアプリケーションも、この後失敗します。唯一の解決策は再起動のようです。

于 2013-07-22T11:36:19.403 に答える