0

次のコードは正常に動作します。ユーザーがキーを押すと、メッセージが表示されます。しかし、私が気づいていない特定のことがあります。ここでのメッセージ ループの役割は何ですか? SetWindowsHookEx(...)呼び出しは関数をウィンドウに登録し、登録されたタイプのイベントが発生すると、ウィンドウは適切な関数を自動的に呼び出すことを読みました。メッセージループにスペースを与えないと、出力が表示されないことは間違いありません。

#include<iostream>
#include <windows.h>
using namespace std;

HINSTANCE hinst = NULL;
static HHOOK handleKeyboardHook = NULL;
static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);

void setWinHook() {
  handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,NULL, 0);
if(handleKeyboardHook == NULL) {
    cout << "is NULL";
} else {
    cout << "is not NULL";
}
  cout<<("Inside function setWinHook !");
}

static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
 cout << ("You pressed a key !\n");
  return CallNextHookEx(handleKeyboardHook, nCode, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 handleKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
 MSG msg;
 while(GetMessage(&msg, NULL, 0, 0))
 {
   TranslateMessage(&msg);
   DispatchMessage(&msg);
 }
 return msg.wParam;
}

編集

プログラムを終了する(コンソール ウィンドウを閉じる)と、フックが登録解除されますか?

編集2

Dispatch Messageはここでどのような役割を果たしますか? ドキュメントによると、ウィンドウプロシージャにメッセージをディスパッチしますが、ここではそれを除外しても、出力には影響しません。

4

3 に答える 3

2

Windows のすべてのイベントは、例で使用されている低レベルのキーボード イベントも含めて、通常のメッセージ イベントを使用して送信されます。したがって、プログラムがキーボード イベントを感知できるようにするには、メッセージを処理するイベント ループを使用する必要があります。

于 2012-05-29T08:20:59.360 に答える
2

ループがなければ、プログラムはすぐに終了し、フックもすぐに削除されます。フックを登録して終了することはできません — バグのあるプログラムがあまりにも多くの忘れられたフックを後に残していたら、システムは混乱するでしょう。プロセスが停止すると、フックの削除がスケジュールされます。

低レベルのキーボードフックについては覚えていませんが、他の多くのフックのコールバックはGetMessage/内でのみ呼び出されPeekMessage、他のスレッドでは呼び出されないため、無限ループだけでは不十分です — メッセージループでなければなりません.

于 2012-05-29T08:22:17.073 に答える
0

「ここでディスパッチメッセージはどのような役割を果たしますか?ドキュメントによると、ウィンドウプロシージャにメッセージをディスパッチしますが、ここでそれを除外しても、出力には影響しません。」

DispatchMessageはかなり役に立たないcosコンソールウィンドウは多くのメッセージを受信しません。受信したメッセージは、ウィンドウがフォーカスを失ったときだけです。

于 2012-07-21T11:52:03.480 に答える