禁用 Windows 系统热键

Windows 中存在大量与 Win 组合使用的全局热键。比如 Win + E 打开资源管理器、Win + R 打开运行对话框、Win + D 最小化所有桌面窗口、Win + Tab 显示任务视图,等等。几乎所有 Win 与单一按键的组合都被系统占用了,而通常用户日常使用的系统热键只占其中很少一部分。如果能禁用(释放)一些 Windows 系统热键,以供其他软件使用,想来也是甚好。

编程实现

由于大多数系统热键是由 explorer.exe 进程通过 RegisterHotkey() 注册的。想要抢占这些热键,只要在 Explorer 启动前抢先注册就可以了。通过替换系统默认 Shell 可以实现用户程序先于 Explorer 启动。

修改注册表如下键值:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell

将原 Shell 值 explorer.exe 改为你自己编写的程序路径。在程序中注册需要的热键,然后再启动 Explorer 进程便可。

此外,还可以使用 SetWindowsHookEx() 设置底层键盘钩子拦截全局热键。例如 AutoHotkey 就是使用这个方法来屏蔽和覆盖系统热键的。该方法可以拦截大多数系统热键,除了少部分特例。比如:

  1. Win + L (锁定会话)
    该热键由系统进程 Winlogon 处理,用户进程无法拦截。
  2. Win + P (切换投影模式)
    该热键由系统服务处理,用户进程无法拦截。

修改注册表

方法一

该方法可以禁用 Explorer 注册的所有 Win 组合热键。缺点是一些常用的热键也失效了。

在注册表中创建或修改如下 DWORD 值为 1

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoWinKeys

重启 Explorer 进程使设置生效。

方法二

该方法可以选择性禁用 Explorer 注册的 Win 组合热键。

在注册表中创建如下可扩充字符串(Expandable String)值:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\DisabledHotkeys

假设我们要禁用 Win + EWin + QWin + D,双击编辑字符串,输入 EQD 并保存。重启 Explorer 进程使设置生效。

方法三

该方法可以禁用 Win + L 热键。

在注册表中创建或修改如下 DWORD 值为 1

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableLockWorkstation