Роль цикла сообщений в этой программе? и еще несколько вопросов

Следующий код работает нормально. Он выдает сообщение, когда пользователь нажимает клавишу. Но есть определенные вещи, о которых я не знаю. Какова роль 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 довольно бесполезен, потому что окно консоли не получает много сообщений. Только сообщение получено, когда окно теряет фокус.

Другие вопросы по тегам