studio reales proyectos para introducción incluye herramientas fuente desarrollo código crear con avanzado aplicaciones c++ windows console getmessage

c++ - reales - no entra en el bucle de GetMessage de Windows en la aplicación de consola



introducción a android studio incluye proyectos reales y el código fuente pdf (2)

Eso no es sorprendente, no hay realmente ningún mensaje en la fila de hilos y no tiene ventana, por lo que tampoco hay ventana.

Si desea jugar con los valores devueltos por su gancho, coloque el código en la función de devolución de llamada gancho.

Debo advertirle que los enganches como estos no funcionarán en las aplicaciones de la consola, ya que la ventana de la consola reside en otro proceso. Además, si mira la página de MSDN para SetWindowsHookEx , verá que WH_KEYBOARD_LL es solo un enganche global, es decir, debe colocar su manejador de hook en una biblioteca DLL e inyectar el enlace en las otras aplicaciones. Entonces usted tiene que manejar el problema de 32/64 bit usted mismo.

Y como última nota, cuando dices cout << c; en su controlador, eso sería imprimir en el manejador del archivo de salida del proceso , no en el suyo.

Quiero detectar pulsaciones de teclas en C ++ y necesito usar Windows System Call. Entonces investigué un poco y esto es lo que obtuve usando Hooks and Message:

#include <Windows.h> #include <iostream> #include <sstream> #include <fstream> #include <ctime> using namespace std; LRESULT CALLBACK LowLevelKeyboardProc(int code, WPARAM wParam, LPARAM lParam) { if (code == HC_ACTION) { switch (wParam) { case WM_KEYDOWN: PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam; char c = char(MapVirtualKey(p->vkCode, MAPVK_VK_TO_CHAR)); cout << c << endl; } } return CallNextHookEx(NULL, code, wParam, lParam); } int main() { HHOOK HKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0); MSG msg; BOOL bRet; while ((bRet = GetMessage(&msg, NULL, 0, 0)) > 0) { cout << "bRet = " << bRet << endl; // I want to do something here, but the program doesn''t seem to go in here TranslateMessage(&msg); DispatchMessage(&msg); } UnhookWindowsHookEx(HKeyboard); return 0; }

Mi pregunta es por qué mi programa no entra dentro del ciclo (y en su lugar se atascó en la función GetMessage)? Necesito que establezca las condiciones para terminar después de unos segundos, entonces ¿dónde debería poner las condiciones? Sé que la función GetMessage lee Mensaje, pero cuando presiono las teclas en mi teclado, todavía no entra y la función de devolución de llamada funciona bien.


Los eventos se publican en la ventana activa. Las ventanas de la consola son propiedad del subsistema de la consola, csrss.exe, y recibe los eventos, luego los traduce en caracteres y los coloca en el objeto de la consola, que es el stdin la aplicación.

Si desea procesar eventos con la GUI de Win32, debe usar una ventana de Win32 (por ejemplo, RegisterClass y CreateWindow ), no una ventana de consola.

Si solo desea que las devoluciones de llamada funcionen durante un cierto período de tiempo, puede usar una espera de SleepEx como SleepEx o MsgWaitForMultipleObjects , que aceptan un tiempo de espera SleepEx .