2

私は個人的な興味のためにキーストローク ロガーを作成しています。また、キー ストローク ロガーを関数としてキャプチャして使用する方法 (キー ショートカットなど) も知りたいと思っています。

キーロガーと GetAsyncKeyState() がここでどのように機能するかを学ぶためのコードを入手しました。

Code::Blocks で実行するようにしましたが、最も奇妙なことは、タスク マネージャーを確認すると、CPU 使用率が 100% に上昇することです。プログラムを閉じると元に戻り、再度オンにすると 100% に戻ります。

無限のwhileループが常に入力をチェックしているためだと思いますが、機能を失うことなくCPU使用率を減らす方法があるかどうか知りたいです.

PSキーショートカットを作成するにはどうすればよいですか? たとえば、Ctrl+Eを押してプログラムを終了します。

4

3 に答える 3

6

プログラムは、実行を停止する理由がないため、基本的に可能な限りの CPU 時間を消費します。ループの最後に達するとすぐに再開され、ループ本体内の処理を遅らせる理由はありません。

ほとんどのアプリケーションは、キーボードの状態を継続的にポーリングするのではなく、OS によってブロードキャストされるキーボード イベントをリッスンします。イベントをリッスンしている間、プログラムは CPU 時間を消費する必要がないため、イベントが発生するまでスリープし、それまでプロセッサを解放して使用できるようにします。

(ゲームは、多くの場合、キーボードの状態をポーリングするという点で、これに対する例外です。ただし、通常、これを行う頻度を制限します (通常、多くても 1 フレームに 1 回)。そのため、CPU 使用率は依然として制限されています。)

于 2009-09-16T04:21:23.363 に答える
3

基本的に、この関数を使用したい:

HHOOK SetWindowsHookEx(
  __in  int idHook,
  __in  HOOKPROC lpfn,
  __in  HINSTANCE hMod,
  __in  DWORD dwThreadId
);

パラメータの意味を読むことができます(そして、周りにはたくさんの例があります)が、質問に答える部分は2番目のパラメータです。コールバック関数を指すように設定lpfnすると、キーが押されるたびに関数 (キーストロークを記録する関数) が呼び出されます。

キーボードイベントだけではありません。チェックしてください: SetWindowsHook()

于 2010-04-19T07:55:48.087 に答える
1

Windows では、Windows API を使用して低レベルのキーボード フックを挿入する必要があります。次に、LowLevelKeyboardProc関数でコールバックを取得します。これを使用してログを記録できます。これはほぼ 0% の CPU を使用し、すべてのキーをキャッチすることが保証されています。

ロガーを終了するためのグローバル キー プレスの処理については、すべてのキーをインターセプトするため、LowLevelKeyboardProc で検索できますが、RegisterHotKeyを使用してメッセージ ループで WM_HOTKEY イベントを検索することをお勧めします。それはより良い解決策です

  1. 低レベルのフックにとって重要な LowLevelKeyboardProc の CPU 負荷が軽減されます。
  2. すべてのキーストロークを監視していない他のアプリケーションで機能します。
于 2010-04-19T07:14:34.980 に答える