把 HP 光影精灵 / 暗影精灵(Victus / OMEN 系列)笔记本上那几个「用不上的功能键」换成 Home / End / PageUp / PageDown 的小工具。
单文件 C# 程序,无第三方依赖,只用系统自带的 .NET Framework。运行一次就自动安装并注册开机自启,之后完全无感。
| 物理键 | 默认替换为 | 识别方式 |
|---|---|---|
| OMEN 功能键 | Home | BIOS WMI 事件 hpqBEvnt(eventData=8613, eventId=29) |
| 计算器键 | End | 低级键盘钩子(VK_LAUNCH_APP2 = 0xB7) |
| Insert 键 | PageUp | 低级键盘钩子(VK_INSERT = 0x2D) |
| PrtSc 键 | PageDown | 低级键盘钩子(VK_SNAPSHOT = 0x2C) |
按下 OMEN 键时,程序会顺手把被系统弹出的 OMEN Gaming Hub 关掉,避免每次都弹一个商店窗口。
到 Releases 下载 OmenKey-vX.Y.Z.zip,解压后双击 OmenKey.exe。
首次运行会自动完成三件事(需要管理员权限,UAC 弹窗请允许):
- 把自己复制到
C:\Program Files\OmenKey\OmenKey.exe(连同OmenKey.ini、stop.bat) - 注册计划任务
OmenKey:登录时以最高权限启动,所以每次开机不会再弹 UAC - 从安装目录重新启动自己,然后常驻后台(无窗口)
安装后下载目录里的那份可以删掉,下次开机会自动用安装目录的副本运行。
双击 uninstall.bat(或执行 OmenKey.exe uninstall)取消开机自启,再删掉 C:\Program Files\OmenKey 目录即可。
也可以在「计划任务」里删掉 OmenKey:
schtasks /delete /tn "OmenKey" /fOmenKey.exe 启动(已安装时直接以安装目录副本运行)
OmenKey.exe stop 停止当前运行的实例
OmenKey.exe uninstall 取消开机自启
停止:双击 stop.bat。重新启用:双击 OmenKey.exe 或重启电脑。
改 C:\Program Files\OmenKey\OmenKey.ini(需要管理员权限才能保存),改完 stop.bat 停掉再启动生效。
程序只读取「自身所在目录」的 ini。首次安装时会把运行目录里同名的 ini 复制过去,所以也可以在解压目录里先改好再运行。
# 物理键 = 目标键;右边留空表示「不替换」,该键保持原功能
Omen = Home
Calc = End
Insert = PageUp
PrtSc = PageDown- 右边留空(或写
none/off/0)→ 不替换,按键原样放行 - 配置文件不存在也能运行,直接用上面这套默认值
- 键名不区分大小写,可用:
HomeEndPageUp(PgUp)PageDown(PgDn)Insert(Ins)Delete(Del)PrintScreen(PrtSc)EscUpDownLeftRightSpaceEnterTabBackspaceAppsF1~F24 - 键名写错时保持默认值,不会把映射改坏
注意:默认配置下 PrtSc 会失去截图功能。需要保留就写成
PrtSc =(留空)。
OMEN 功能键的按下信号在 EC/BIOS 固件层就被转成了 WMI 事件上报,根本没有进入键盘 HID 通道——所以 PowerToys、AutoHotkey、SharpKeys、WH_KEYBOARD_LL 这些常规方案全都看不到这个键。
程序的做法是:用 ManagementEventWatcher 直接订阅 root\wmi 命名空间下的 BIOS 事件类 hpqBEvnt,读 eventId / eventData 判断是不是 OMEN 键,命中就 SendInput 发出目标键。
几个踩过的坑(已修):
hpqBEvnt是 BIOS 提供的外生事件(extrinsic event),WQL 不支持对它做WHERE属性过滤,加了过滤会一条事件都收不到 → 改为订阅全量SELECT * FROM hpqBEvnt,在代码里比对- 一次按下会连发多条事件(不同
eventType)→ 用 300ms 去重 INPUT结构体的联合体必须包含最大的成员MOUSEINPUT,否则 x64 下会算成 32 字节(正确是 40),SendInput会因cbSize非法直接返回 0、静默什么都不发
计算器键、Insert、PrtSc 都发标准键码,用 WH_KEYBOARD_LL 低级键盘钩子拦截,按下时改发目标键,并把 keydown/keyup 一起吞掉。
写注册表 Run 项的话,因为程序需要管理员权限,每次开机都会弹一次 UAC。改用「登录时触发 + 最高权限」的计划任务,既不弹 UAC,也不用常驻服务。
eventData = 8613 / eventId = 29 是在 HP Victus 16-r0xxx 上实测确认的值,其它型号可能不同。如果 OMEN 键不生效,可以这样查:
- 用 OmenXHub 或任意 WMI 事件查看工具订阅
root\wmi的hpqBEvnt - 按一下 OMEN 键,看新出现的事件里
eventId/eventData是多少 - 改
OmenKey.cs顶部的OMEN_EVENT_ID/OMEN_EVENT_DATA常量后重新编译
无需安装任何 SDK,系统自带的 .NET Framework 编译器即可(Windows 10/11 默认都有):
build.bat等价命令:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nologo /target:exe /codepage:65001 ^
/r:System.Management.dll /out:OmenKey.exe OmenKey.cs推一个 v* 形式的 tag 会触发 GitHub Actions 自动编译并发布 Release:
git tag v1.0.0 && git push origin v1.0.0- Windows 10 / 11(x64 / x86)
- .NET Framework 4.x(系统自带,无需额外安装)
- 管理员权限(写 Program Files、注册计划任务、订阅 BIOS WMI 事件)
- 仅适用于 HP Victus / OMEN 系列(OMEN 键识别依赖 HP 的 BIOS WMI 事件类)