You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:09:54