在控制台上尝试子类化

我想在控制台应用程序中捕获键盘消息,所以我尝试了这个:

HWND GetConsoleHwnd(void) { #define SIZEBUF 1024 char szBuffer[SIZEBUF]; GetConsoleTitle(szBuffer, SIZEBUF); #undef SIZEBUF return FindWindow(NULL, szBuffer); } LRESULT CALLBACK ConsoleProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_KEYDOWN: switch (wParam) { //VK Cases } break; } return CallWindowProc(OldConsoleProc, hwnd, msg, wParam, lParam); } 

这主要是:

 HWND hwndConsole = GetConsoleHwnd(); OldConsoleProc = (WNDPROC) SetWindowLong(hwndConsole, GWL_WNDPROC, ConsoleProc); 

这个全球WNDPROC OldConsoleProc;WNDPROC OldConsoleProc;

但它不起作用,我做错了什么?

您不能以这种方式子类化另一个进程的窗口。 你可以用钩子做,但我不建议在控制台窗口上尝试这个。 ReadConsoleInput足够低,只要你能得到没有丑陋的非便携式黑客攻击(我甚至不确定当控制台窗口全屏时一些事件到达WndProc )。