He estado tratando algunas cosas con ganchos, y yo no entiendo por qué ganchos deben ser usados con una cola de mensajesSetWindowsHookEx ser utilizado con una cola de mensajes ventanas
hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(hook);
¿Por qué no hace algo como este trabajo?
hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, NULL, 0);
cin >> aKey;
UnhookWindowsHookEx(hook);
Uso de los hilos de refuerzo, y una barrera tampoco funciona. ¿Por qué la espera entre el gancho y el desenganche no se puede hacer de otra manera?
EDIT:
hice un error cuando creé esta muestra, se crea un gancho WH_KEYBOARD_LL, no WH_KEYBOARD, (no creo que hace una gran diferencia)
también el bucle no se ejecuta nunca solo espera en la función GetMessage.
El ciclo se ejecuta solo cuando publico el mensaje de abandono PostThreadMessage(id, WM_QUIT, 2323, NULL);
, así que no entiendo qué hace al lado de esperar, ¿hay algún procesamiento interno?
RELACIONADA:
C++ SetWindowsHookEx WH_KEYBOARD_LL Correct Setup
How can I set up a CBT hook on a Win32 console window?
Entonces, si entiendo esto correctamente, Windows solo puede llamar a mi devolución de llamada mientras está en una llamada Get/PeekMessage()? – Ha11owed
Lo entiende correctamente. No hay otra forma de insertar llamadas de forma segura en un hilo, tiene que estar inactivo. Esta es la razón por la cual existen bucles de mensajes. –
@HansPassant para aclarar, ¿sugiere que para los enlaces globales como WH_KEYBOARD los conductos con nombre se puedan usar para "pasar" información a mi propio programa y ese programa no necesita una bomba de mensajes? – dave