次のコードは正常に動作します。ユーザーがキーを押すと、メッセージが表示されます。しかし、私が気づいていない特定のことがあります。ここでのメッセージ ループの役割は何ですか? 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はここでどのような役割を果たしますか? ドキュメントによると、ウィンドウプロシージャにメッセージをディスパッチしますが、ここではそれを除外しても、出力には影響しません。