一个轻量、美观的 Windows 全局键盘宏工具。按下指定触发键,按顺序自动模拟一串按键(支持按键组合、输入文本、延时),游戏内全局生效。
基于 Win32 低级键盘钩子(WH_KEYBOARD_LL) + SendInput 扫描码注入,非独占全屏的游戏(如恐怖黎明 Grim Dawn)也能生效。WPF 深色界面,系统托盘常驻。
上图:主界面 —— 勾选了「循环模式」,触发键
2、动作键2、循环间隔500ms(按一下触发键开始,再按一下停止)。
- 多个宏:每个宏有独立的触发键,支持 Ctrl/Shift/Alt/Win 修饰键组合
- 动作序列:按键组合 / 输入文本(支持中文) / 延时等待,按顺序执行,每步可配独立延时
- 全局生效:低级键盘钩子 + 扫描码注入,DirectInput 独占键盘的游戏内同样有效
- 全局开关热键:默认
F8,一键启用/暂停所有宏(可录制自定义) - 排队上限(防连按积压):连按触发键时,排队中(未开始执行)的宏数量超过上限后,新触发被丢弃,避免"停手后还在一直执行";「应用」按钮可立即裁剪当前已排队的宏(保留最早排队的 N 个,即使之前是 0 不限也当场生效)
- 防自触发:宏输出按键在 150ms 窗口内被识别为合成键,不会回喂触发;触发键恰好出现在自己宏输出里时也不会死循环
- 循环模式:勾选后,按一下触发键即开始不断循环执行动作序列,再按一下同一触发键停止;可设置每圈完成后的间隔毫秒
- 系统托盘常驻:关闭窗口最小化到托盘,双击恢复,右键菜单可启用/暂停/退出
- 按键录制:录制触发键、录制动作按键,无需手敲键名
- 开机自启:可选
- 配置持久化:JSON 文件(
config.json,与 exe 同目录),界面上改或手改文件均可
- 双击
KeyMacro.exe启动(默认请求管理员权限,普通权限亦可运行) - 点「+ 新建宏」,输入名称
- 点「录制触发键」,按下要用的触发键(如
F9),勾选修饰键(如 Ctrl) - 在「添加动作」区域:
- 类型选「按键」→ 点「录制」按下目标键(如
C),填写延时毫秒 → 添加 - 类型选「延时」→ 填写毫秒 → 添加
- 类型选「文本」→ 输入文本(支持中文)→ 添加
- 类型选「按键」→ 点「录制」按下目标键(如
- 开启「启用」开关,按触发键即可执行
- 按
F8(或自定义)暂停/恢复所有宏;托盘图标右键可退出
在触发键面板勾选「循环模式」,并设置「间隔」(毫秒):
- 按一下触发键 → 开始循环:按顺序执行一遍动作序列,完成后等待「间隔」毫秒,再执行下一遍,如此不断循环
- 再按一下同一触发键 → 停止循环
- 动作序列里每个步骤自带的延时仍会生效;「间隔」是每圈执行完之后的额外等待
- 循环期间若把该宏「禁用」或关闭「循环模式」,循环会立即停止;全局暂停(关闭宏总开关)会停止所有循环
- 触发键与动作键相同时也安全:宏合成的按键带内部标记,不会再次触发触发键,也不会打断循环
底部状态栏「排队上限(0=不限)」输入框 +「应用」按钮:
- 0 = 不限制(默认),保持传统行为:连按触发键全部依次排队执行
- 设为 N(如 1~5):排队中(还没开始执行)的宏最多 N 个,满了再按触发键会被丢弃(触发键仍被吞掉,不传给游戏);正在执行的宏不计入排队
- 点「应用」:立即对当前队列生效——把已排队的宏当场裁剪到 N 个(保留最早排队的),之后新触发按新上限判断
- 暂停(全局开关关闭)时,排队中的宏立即作废,正在执行的那个跑完即止
- 触发键按下时会被"吞掉"(不传递给游戏/应用),动作序列中的按键正常发送
- 全局开关热键与触发键冲突时,开关优先
- 触发键可与动作键相同:宏合成的按键带内部标记(
dwExtraInfo),既不会再次触发触发键,也不会打断循环;循环模式下用同一触发键即可开始/停止。若你的键盘驱动/输入法注入的按键无法区分,极少数情况下可能仍会回喂,建议用按键录制确认 - 部分独占全屏(Exclusive Fullscreen)游戏或反作弊系统可能拦截钩子,建议游戏使用无边框窗口/窗口化模式
- 宏用于游戏时请遵守游戏规则,公平竞技类游戏可能禁止宏
与 exe 同目录,UTF-8 无 BOM。字段:
| 字段 | 类型 | 说明 |
|---|---|---|
ToggleKey |
string | 全局开关热键主键,默认 F8 |
ToggleModifiers |
string[] | 开关热键修饰键 |
MacroEnabled |
bool | 宏是否启用(可用热键切换) |
StartMinimized |
bool | 启动时最小化到托盘 |
AutoStart |
bool | 开机自启 |
MaxQueueSize |
int | 排队上限,0 = 不限制 |
Macros |
Macro[] | 宏列表(名称/触发键/启用/循环模式/步骤) |
每个 Macro 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
Name |
string | 宏名称 |
TriggerKey |
string | 触发键主键(友好名称,如 F9) |
TriggerModifiers |
string[] | 触发键修饰键(如 ["Ctrl"]) |
Enabled |
bool | 是否启用该宏 |
LoopEnabled |
bool | 是否循环模式 |
LoopIntervalMs |
int | 每圈完成后的间隔毫秒 |
Steps |
MacroStep[] | 动作步骤 |
依赖 .NET 6 SDK(Windows)。
# 编译
dotnet build -c Release
# 发布自包含单文件 exe(无需目标机器安装 .NET)
dotnet publish -c Release -r win-x64 --self-contained true \
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true \
-p:EnableCompressionInSingleFile=true -o publish产物:publish/KeyMacro.exe(自包含单文件,可拷到任意 Windows 10/11 x64 机器直接运行)。
KeyboardMacro/
├── App.xaml(.cs) # 启动、管理员自提升、配置加载
├── MainWindow.xaml(.cs) # 主界面:宏列表/编辑器/设置/托盘
├── Core/
│ ├── GlobalKeyboardHook.cs # WH_KEYBOARD_LL 低级键盘钩子
│ ├── KeyMap.cs # 键名 <-> 虚拟键码映射
│ └── KeySender.cs # SendInput 扫描码/Unicode 注入
├── Models/Models.cs # AppConfig / Macro / MacroStep 数据模型
└── Services/
├── ConfigStore.cs # config.json 读写
└── MacroManager.cs # 触发判定、执行队列、排队上限、防自触发、循环模式
