4

フックに関するチュートリアルや記事はすでにたくさん見ましたが、よくわかりません。主な理由は、すべての例で異なるソリューションが使用されているためです。

私はフックを生かし続ける何かを実装しなければならないことを知っています。通常、それはある種のwhileサイクルです。Q1:このループがコールバックのあるクラスにあった場合、スレッドはそれらを実行できなくなりますか?

しばらく時間がかかることは承知していますが、グローバルキーボードフックのよく説明された例をいただければ幸いです。または、バイナリを使用した実際の例リンクしてください。(私を信じてください、私はそれを最後の数時間グーグルしようとしてきました)。

ありがとうございました

4

3 に答える 3

3

私はフックを生かし続ける何かを実装しなければならないことを知っています

いいえ、それは問題ではありません。グローバルフックには、コールバックを含むDLLが必要です。そのDLLは、実行中のすべてのプロセスに挿入されます。UnHookWindowsHookEx()を呼び出すか、プロセスが終了するまで、プロセスにロードされたままになります。

WH_KEYBOARD_LLを使用してキーボードをフックすることもできることに注意してください。これはグローバルフックではありません。Windowsはコンテキストをプログラムに切り替えてコールバックを行います。グローバルフックに必要なDLLが挿入されたIPCメカニズムが必要ないため、はるかに使いやすくなっています。低レベルのフックは、フックを解除するか、メッセージキューを所有するスレッドが終了するか、プロセスが終了するかのいずれか早い方までアクティブのままです。

于 2010-08-16T10:20:04.893 に答える
2

私の Web サイト(ページの下部にある「ダウンロード」ボタンに注意してください) には、ダウンロード可能なコードを備えたスケルトン キーボード フックがあります。この記事では、共有セクションなど、理解する必要があるいくつかのことについて説明し、Win32 フックに関する Kyle Marsh の優れた記事について説明します (MSDN の馬鹿が、.netty が不十分であるために、今までに削除していない場合)。

ソースコードは例にあり、makefile/sln ビルドが必要なだけです (使用するコンパイラ/バージョンはわかりません)。これと不気味なほど似たコードが、10 年前から出荷されている商用製品に含まれていたので、それが機能することはわかっています。

整合性レベルの問題により、Vista および W7 でのフックの有用性が低下する可能性があることに注意してください。

于 2010-08-16T09:50:08.130 に答える
1

フックの間、プログラムは生き続ける必要があります。あなたのプログラムは SetWindowsHookEx / UnSetWindowsHookEx (またはそれが呼ばれるもの) を呼び出すものです。これらの呼び出しの間に、典型的な Windows プログラムと同じように、実際にメッセージ ループ (これはおそらく、あなたが話している while ループです) があります。

ただし、プログラムはフックしているプロセスとは異なるプロセスであるため、メッセージ ループによって他のプロセスがハングすることはありません。それはマルチタスクと呼ばれます:)

于 2010-08-16T09:55:45.730 に答える