Ho provato alcune cose con ganci, e non capisco il motivo per cui i ganci devono essere utilizzati con una coda di messaggiPerché deve SetWindowsHookEx essere utilizzato con una coda di messaggi di Windows
hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);
Perché non fa qualcosa come questo lavoro?
hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);
cin >> aKey;
UnhookWindowsHookEx(hook);
Utilizzo di thread di boost e una barriera non funziona. Perché l'attesa tra il gancio e lo sgancio non può essere fatta in un altro modo?
EDIT:
ho fatto un errore quando ho creato questo esempio, creo un gancio WH_KEYBOARD_LL, non WH_KEYBOARD, (io non credo che fa una grande differenza)
anche il ciclo non esegue attende solo la funzione GetMessage.
Il ciclo viene eseguito solo quando si invia il messaggio di uscita PostThreadMessage(id, WM_QUIT, 2323, NULL);
, quindi non capisco cosa fa dopo l'attesa, c'è qualche elaborazione interna?
RELATIVA:
C++ SetWindowsHookEx WH_KEYBOARD_LL Correct Setup
How can I set up a CBT hook on a Win32 console window?
Quindi, se ho capito bene, Windows può chiamare il mio callback solo in una chiamata Get/PeekMessage()? – Ha11owed
Lo capisci correttamente. Non c'è altro modo per iniettare chiamate in sicurezza in un thread, deve essere inattivo. Questo è il motivo per cui esistono loop di messaggi. –
@HansPassant per chiarire, stai suggerendo che per gli hook globali come WH_KEYBOARD named pipe possono essere usati per "passare" le informazioni al mio programma e quel programma non ha bisogno di un message pump? – dave