基于Batch与getkey.exe:如何同时捕获按键并执行SET /P命令?
批处理结合getkey.exe实现计算器按键检测方案
核心需求
用批处理配合Aacini开发的getkey.exe制作计算器,需实现:
- 捕获用户按键,区分字符/数字和F1这类功能键
- 字符/数字输入:将按键内容传入
SET /P用于计算式输入 - 功能键触发:打开对应菜单
getkey.exe通过设置errorlevel返回对应按键ID,不能直接同时运行getkey.exe和SET /P——因为SET /P是等待用户输入流,而getkey.exe是主动捕获按键,需先通过getkey.exe判断按键类型,再分支执行对应逻辑。
实现示例代码
@echo off setlocal enabledelayedexpansion :mainLoop cls echo 计算器操作提示:按F1打开菜单,输入数字/运算符开始计算 getkey.exe :: 判断F1功能键(F1对应的errorlevel为59,具体键值可查getkey文档) if %errorlevel% equ 59 ( goto :menu ) else ( :: 筛选可打印字符(ASCII码32-126对应errorlevel范围) if %errorlevel% geq 32 if %errorlevel% leq 126 ( :: 将errorlevel转换为对应字符 for /f "delims=" %%a in ('powershell -command "[char]%errorlevel%"') do set "inputChar=%%a" goto :inputHandler ) else ( :: 忽略不可打印的非功能键,回到主循环 goto :mainLoop ) ) :inputHandler :: 将捕获的字符预填入计算式输入框 set /p "calcExpr=输入计算式:!inputChar!" :: 此处可添加计算逻辑,比如调用calc.exe计算结果 echo 计算式:!calcExpr! pause >nul goto :mainLoop :menu cls echo === 菜单选项 === echo 1. 清除当前计算式 echo 2. 查看计算历史 echo 3. 返回计算器主界面 getkey.exe :: 处理菜单按键(数字1-3对应errorlevel49-51) if %errorlevel% equ 49 (set "calcExpr=" & goto :mainLoop) if %errorlevel% equ 50 (goto :showHistory) if %errorlevel% equ 51 (goto :mainLoop) :: 无效按键则停留在菜单 goto :menu :showHistory cls echo === 计算历史记录 === :: 此处可添加历史记录读取/展示逻辑 echo 暂无历史记录 pause >nul goto :menu
关键说明
- 执行顺序:必须先用
getkey.exe捕获按键,根据errorlevel判断类型后,再决定是进入输入流程还是菜单流程,不能并行运行getkey.exe和SET /P - 按键判断:
- 功能键有固定的
errorlevel值(比如F1是59),需参考getkey.exe的文档获取对应键值 - 可打印字符的
errorlevel对应其ASCII码(32-126),通过PowerShell将数值转换为字符后,可预填入SET /P的输入框
- 功能键有固定的
- 循环逻辑:主循环保证程序持续运行,处理完按键后回到初始状态等待下一次操作
内容的提问来源于stack exchange,提问作者ItsSuperPlayz
相关产品推荐
相关产品推荐

