【问题标题】:Swap Ctrls and Capslock for remote access sessions using AHK for Windows 7使用 AHK for Windows 7 为远程访问会话交换 Ctrls 和 Capslock
【发布时间】:2026-01-21 09:10:01
【问题描述】:

我正在使用校园范围内的计算机访问我办公室中的 Windows 7 桌面计算机,但在交换 CapsLockCtrl 密钥时遇到问题。

问题是,我在办公室的机器上只有管理员权限,我通过添加适当的“扫描码映射”编辑注册表(regedit)交换了CapsLockCtrl

但是,这对任何远程访问会话都没有帮助,因为本地计算机上的 CapsLock 保持原样。

我求助于 AHK,但在两台机器上运行的脚本中设置 CapsLock::LControl 并不能解决问题。通过 AHK 指定键交换后,按 CapsLock 确实会向 RDP 会话发送 Ctrl 键击。但是,在本地机器上,“CapsLock”的灯也应该打开(或关闭)!这表明,当 AHK 将 CapsLock 的印刷机转换为 Ctrl 时,本地机器将其视为 CapsLock 的原始印刷机。此外,多次按Ctrl 会使AHK 感到困惑并最终终止进程。

我也尝试在本地机器上运行的脚本中设置如下,但是没有用。

SetTitleMatchMode 2
#IfWinActive, Remote Desktop
    SetCapsLockState, off
#IfWinActive
; or
#IfWinActive, ahk_class TscShellContainerClass
    SetCapsLockState, off
#IfWinActive

当我在本地计算机上没有管理员权限时,我应该怎么做才能在远程访问的计算机上一致地指定 CapsLockCtrl 之间的密钥交换?在我自己的笔记本电脑上,我还通过注册表交换了CapsLockCtrl,在远程访问会话中交换这些密钥没有问题。

一切顺利,

-临丰

【问题讨论】:

  • 我尝试将以下行插入本地计算机上运行的 AHK 脚本,但 Capslock 键仍然有效。 SetCapsLockState, AlwaysOff
  • @wOxxOm,我还添加了钩子,将以下行放在 AHK 脚本的开头。 #InstallKeybdHook;但是,这仍然没有帮助。 CapsLock 键仍然有效。

标签: windows windows-7 keyboard-shortcuts autohotkey remote-desktop


【解决方案1】:

我已经设法将uncapAutoHotKey 一起使用来解决此问题。

uncap 的 GitHub:https://github.com/susam/uncap

  1. 在本地机器上运行AutoHotKey 脚​​本
  2. 在远程机器上下载uncap
  3. 在 PowerShell 上运行

path\to\uncap.exe 0x14:0x14 0x14:0xa2

这将覆盖默认行为,因此它不会使您 Esc 无用

详见here


更实际的是,可以将以下三个文件放入 U 盘中随身携带。 (鉴于当前的居家令,UCA 未测试。某些学校计算机可能会禁止 *.exe 文件完全运行?)

  1. uncap.exe,从here下载。或者,请参阅 Github repo for uncap 最新安装程序。
  2. Bat 文件 1 触发重新映射。叫它Swap_Capslock_and_Ctrl.bat。并且,输入以下内容:
.\uncap.exe 0x14:0xa2 0xa2:0x14
  1. Bat 文件 2,停止脚本。叫它StopScript.bat,内容:
.\uncap.exe -k

【讨论】:

  • 看起来很有希望。我将尝试使用 uncap 0x14:0xa2 0xa2:0x14 来交换 Caps Lock 键和 Left Control 键。
【解决方案2】:

低技术解决方案

斗争

如何交换 CapsLockCtrl 上苦苦挣扎了几个小时后,我发现可能没有理想的解决方案。 (非常适合使用管理员权限创建scancode 映射。)

解决方案

我最终购买了带 DIP 开关的机械键盘,这解决了我通过 AHK 脚本轻柔地重新映射按键的所有难题。 DIP 开关有点“重新连接”键盘,使 CapsLock 键的行为与 Ctrl 一样。

【讨论】:

    【解决方案3】:

    此 AutoHotkey 脚本使用变通方法来提供非常好的键盘功能,以使 CapsLock 的行为类似于 Ctrl 且没有按钮闪烁。基本上Ctrl+C/Ctrl+V等变成了一个两阶段的过程,按住capslock,然后按字母,但是可以变得相当流畅。

    ;===============
    ;workaround script, pretty good functionality, no capslock blinking
    CapsLock::
    vIsCtrlOn := 1
    Return
    
    $a::
    $b::
    $c::
    $d::
    $e::
    $f::
    $g::
    $h::
    $i::
    $j::
    $k::
    $l::
    $m::
    $n::
    $o::
    $p::
    $q::
    $r::
    $s::
    $t::
    $u::
    $v::
    $w::
    $x::
    $y::
    $z::
    vLetter := SubStr(A_ThisHotkey, 1-1)
    if vIsCtrlOn
    SendInput ^%vLetter%
    else
    SendInput %vLetter%
    vIsCtrlOn := 0
    Return
    ;===============
    

    我提供了一些可能对 OP 和其他 AutoHotkey 用户有所帮助的测试说明:

    ;===============
    ;script with just these 3 lines, no capslock blinking
    CapsLock::
    SendInput {Enter}
    Return
    ;===============
    
    ;===============
    ;script with just these 7 lines, capslock blinking
    CapsLock::
    SendInput {Enter}
    Return
    
    CapsLock & c::
    SendInput ^c
    Return
    ;===============
    

    [编辑:]
    这个额外的 AutoHotkey 脚本将显示 capslock 的开/关状态:

    vFormat := "zh0 b1 c0 fs18 x1000 y100 w150"
    Loop
    {
    if GetKeyState("CapsLock", "T")
    vText := "capslock on"
    else
    vText := "capslock off"
    if !(vText = vText2)
    Progress, %vFormat%, %vText%
    vText2 := vText
    Sleep 100
    }
    Return
    

    【讨论】:

    • 嗨@vafylec,我已经尝试将您上面提到的脚本作为可执行文件部署在我学校的公共计算机上,遗憾的是,它并没有完全解决问题。现在,Capslock 的指示灯不再提供信息,我不知道我在哪个键上。我正在发布针对原始问题的低技术解决方案,对于我的特定用例而言,我已经足够满意了。
    • 您好@llinfeng,很高兴我的脚本在这些个月后仍然对您有用,很高兴听到您的反馈。 -- 顺便说一句,如果唯一的问题是您无法知道 CapsLock 是否打开,我添加了一个可以显示它的脚本。我将作为单独的脚本/应用程序运行。
    • 嗨@vafylec,非常感谢您的新编辑;我一到学校就去考试;我的目标很简单:能够触发 AHK 脚本,在我没有管理员权限的机器上交换 Capslock 和 Ctrl 键,并使交换在远程访问会话中有效。到目前为止,我对掉期不稳定的表现感到困扰。 (有时,Capslock 应该被按住;在其他情况下,Ctrl 键没有释放。)所以,我转身去拿一个带 DIP 开关的键盘。