1

GUI アプリケーションで使用するSetWindowsHookExには、通常、最終行に、イベントが発生するたびに呼び出されるスレッド内の関数が必要です。

たとえば、システムで押されているすべてのキーを表示するソフトウェアを作成している場合、キーが押さAddKeyToList(int vkeycode)れるたびに GUI アプリに関数が呼び出されるようにしたいと考えています。

私は Windows の内部の専門家ではありませんが、ドキュメントを正しく理解していれば、によってインストールされたフックは、フックしSetWindowsHookExているイベントを引き起こしたスレッドのコンテキストで呼び出されています。したがって、私が説明したことを行うには、次のことを行う必要があります。

  1. フック関数を含む DLL を作成し、そこにすべてのスレッドが共有して相互に通信する共有メモリ領域を作成します。

  2. pInvokeフック関数と GUI プログラムの両方で like メカニズムを作成します。この例では、フック関数は押されたキーを GUI プログラムに送信し、GUI プログラムは独自のコンテキストでAddKeyToList関数を呼び出します。

これは、比較的単純なクラスでは信じられないほど複雑であり (UNIX の世界の XRecord 拡張機能と比較して) Qt、.

これらのメカニズムを既に実装しているライブラリ (できればオープン ソース) はありますWH_KEYBOARD_LL?

私の分析は正しいですか、それとも私が説明したことを達成するためのより簡単な方法はありますか?

Qt図書館はこの仕事を手伝ってくれますか?

4

1 に答える 1

3

これは、WH_KEYBOARD_LL フックの既定の動作です。コールバックは、SetWindowsHookEx() を呼び出した同じスレッドで呼び出されます。そのスレッドは、UI スレッドを使用するときに自動的に、これが適切に機能するようにメッセージ ループをポンピングする必要もあります。また、コールバック コードも DLL に存在する必要はありません。これは、DLL インジェクションを必要とするグローバル フックではありません。

追加の作業は必要ありません。

于 2010-06-18T19:07:29.413 に答える