Por que SetWindowsHookEx deve ser usado com uma fila de mensagens do Windows

Estou tentando algumas coisas com ganchos e não entendo por que ganchos devem ser usados com uma fila de mensagens

hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
        TranslateMessage(&msg);
        DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);

Por que algo assim não funciona?

hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);
cin >> aKey;
UnhookWindowsHookEx(hook);

Usando threads de reforço, e uma barreira também não funciona. Por que a espera entre o gancho e o desengate não pode ser feita de outra maneira?

EDITAR

Cometi um erro quando criei este exemplo, crio um gancho WH_KEYBOARD_LL, não WH_KEYBOARD (não acho que isso faça uma grande diferença)

Além disso, o loop nunca executa apenas espera na função GetMessag

O loop é executado somente quando eu postar a mensagem de encerramentoPostThreadMessage(id, WM_QUIT, 2323, NULL); então eu não entendo o que ele faz além de esperar, existe algum processamento interno?

RELATED:

C ++ SetWindowsHookEx WH_KEYBOARD_LL Instalação correta

Como posso configurar um gancho de CBT em uma janela de console do Win3

questionAnswers(2)

yourAnswerToTheQuestion