Роль цикла сообщений в этой программе? и еще несколько вопросов
Следующий код работает нормально. Он выдает сообщение, когда пользователь нажимает клавишу. Но есть определенные вещи, о которых я не знаю. Какова роль Message Loop здесь? Я прочитал это призвание 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? Согласно документу, он отправляет сообщение в оконную процедуру, но здесь, даже если я исключаю это, это не влияет на вывод.
3 ответа
Все события в Windows, даже низкоуровневое событие клавиатуры, используемое в вашем примере, отправляются с использованием обычных сообщений. Таким образом, чтобы программа могла распознавать события клавиатуры, она должна использовать цикл обработки сообщений.
Без цикла программа немедленно вышла бы, и хук также был бы удален сразу. Вы не можете зарегистрировать ловушку и выйти - система превратилась бы в беспорядок, если бы ошибочные программы оставляли после себя слишком много забытых ловушек. Как только ваш процесс умирает, ловушка назначается на удаление.
Я не помню о низкоуровневом хуке клавиатуры, но обратные вызовы многих других хуков вызываются только внутри GetMessage
/PeekMessage
и не в каком-то другом потоке, так что просто бесконечный цикл не будет достаточным - это должен быть цикл сообщений.
"Какую роль здесь играет Dispatch Message? Согласно документу, он отправляет сообщение в оконную процедуру, но здесь, даже если я исключаю это, это не влияет на вывод".
DispatchMessage довольно бесполезен, потому что окно консоли не получает много сообщений. Только сообщение получено, когда окно теряет фокус.