c++ windows winapi console keyboard-hook

c++ - SetWindowsHookEx con WH_KEYBOARD no funciona para mí, ¿qué hago mal?



winapi console (4)

Citaré de otro tema :

Las ventanas de la consola son manejadas completamente por CSRSS, que es un proceso del sistema. Instalar un gancho en un proceso significa inyectar su DLL en él. Como el CSRSS es tan importante (es vital para la ejecución del sistema y el código dentro de las ejecuciones como LocalSystem, que es el usuario super-administrador local), no está permitido inyectar código en él. Entonces no puedes conectar ninguna de sus ventanas.

No hay mensajes de ventana reales en su aplicación de consola simple, por lo que no es necesario llamar a su gancho, y en su caso, ni siquiera está inyectando su gancho, pero solo utiliza el enganche de modo de subproceso. Se llama a la documentación de MSDN cuando los mensajes están a punto de procesarse:

Una función de devolución de llamada definida por la aplicación o definida por la biblioteca utilizada con la función SetWindowsHookEx. El sistema llama a esta función cada vez que una aplicación llama a la función GetMessage o PeekMessage y hay un mensaje de teclado (WM_KEYUP o WM_KEYDOWN) para procesar.

Ahora déjame mostrarte lo que puedes hacer para comenzar a recibir llamadas en tu gancho:

MessageBox(NULL, _T("It is keyboard time!"), _T("Let''s Go"), MB_OK); //for(int i=0; i<=10; i++) { // cout << i << endl; // Sleep(1000); //}

Haga MessageBox y, antes de cerrarlo, comience a escribir: comenzará a recibir llamadas de enlace.

#include <iostream> #include <fstream> #define _WIN32_WINNT 0x501 #include <windows.h> using namespace std; HHOOK hKeyboardHook = 0; LRESULT CALLBACK KeyboardCallback(int code,WPARAM wParam,LPARAM lParam) { cout << "a key was pressed" << endl; ofstream myfile; myfile.open ("hookcheck.txt", ios::ate | ios::app); myfile << "a key was pressed/n"; myfile.close(); return CallNextHookEx(hKeyboardHook,code,wParam,lParam); } int main() { HWND consoleWindow = GetConsoleWindow(); HINSTANCE hInstCons = (HINSTANCE)GetWindowLong( consoleWindow, GWL_HINSTANCE ); hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD, (HOOKPROC)KeyboardCallback, (HINSTANCE)consoleWindow, GetCurrentThreadId()); MessageBox(NULL, "It is keyboard time!", "Let''s Go", MB_OK); }

Este código en cada pulsación de tecla mientras el ciclo está en marcha debería imprimir un mensaje en la consola y crear un archivo, pero no ocurre nada. ¿Qué hago mal?



Sleep(1000) suspende la ejecución de la secuencia actual hasta que transcurra el intervalo de tiempo de espera. Significa que su programa no se está ejecutando en realidad (es decir, procesando mensajes) durante este modo de suspensión.

Necesita usar un tipo diferente de comando, que mantendrá el bucle de mensaje ejecutándose. Lo más simple sería esperar la entrada del usuario

while(true) std::cin.get();


HINSTANCE un HINSTANCE que enganchó el teclado y allí utilicé la función DllMain para recuperar un HINSTANCE que se puede usar en SetWindowsHookEx .

Además de eso, también usé 0 como hilo para que todos los hilos se enganchen.

Quizás puedas probar una táctica similar también.