C语言按键计数器:如何实现F1触发的暂停与恢复功能
实现Windows按键计数的暂停/恢复功能(F1切换)
以下是修改后的代码,已添加F1键切换暂停/恢复的功能,同时修复了原代码中的潜在问题:
#include <stdio.h> #include <stdbool.h> #include <windows.h> #include <winuser.h> HHOOK hook; MSG msg; // 修复:原LPMSG未初始化,改为直接声明MSG结构体 int counter = 0; bool is_paused = false; // 标记是否暂停计数 void Stealth() { HWND Stealth; AllocConsole(); Stealth = FindWindowA("ConsoleWindowClass", NULL); ShowWindow(Stealth, SW_SHOWNORMAL); } LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam){ // 只有code >= HC_ACTION时才处理消息 if (code >= HC_ACTION && wParam == WM_KEYDOWN) { KBDLLHOOKSTRUCT* kb_data = (KBDLLHOOKSTRUCT*)lParam; // 捕获F1键,切换暂停状态 if (kb_data->vkCode == VK_F1) { is_paused = !is_paused; printf(is_paused ? "已暂停计数\n" : "已恢复计数\n"); // 返回1阻止系统处理该F1键,避免触发默认F1功能 return 1; } // 非暂停状态下才计数 if (!is_paused) { counter++; printf("Current count: %d\n", counter); } } // 其他消息交给系统默认处理 return CallNextHookEx(hook, code, wParam, lParam); } int main() { Stealth(); hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, GetModuleHandle(NULL), 0); if (hook != NULL) puts("钩子安装成功"); else puts("钩子安装失败 :("); while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } // 程序退出前卸载钩子 UnhookWindowsHookEx(hook); return 0; }
关键修改说明
- 暂停状态控制:新增
is_paused布尔变量,初始为false(正常计数),按下F1时切换其值,同时输出当前状态提示。 - F1键处理:通过
VK_F1判断F1按键,切换状态后返回1,阻止系统对该F1键的默认处理(比如打开帮助文档)。 - 计数逻辑优化:只有当
is_paused为false时,才对非F1的按键进行计数。 - 修复潜在问题:原代码中
LPMSG msg是未初始化的指针,改为直接声明MSG msg并传递其地址给GetMessage,避免内存访问错误;同时在程序退出前添加UnhookWindowsHookEx卸载钩子,符合Windows编程规范。 - 钩子消息处理:添加
code >= HC_ACTION判断,确保只处理有效的钩子消息;未处理的消息通过CallNextHookEx传递给下一个钩子,避免影响系统其他功能。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

