使用AHK for Windows 7为远程访问会话交换CTRL和Capslock

使用AHK for Windows 7为远程访问会话交换CTRL和Capslock,windows,windows-7,keyboard-shortcuts,autohotkey,remote-desktop,Windows,Windows 7,Keyboard Shortcuts,Autohotkey,Remote Desktop,我正在使用校园范围内的计算机访问办公室中的Windows 7桌面计算机,并且在切换CapsLock和Ctrl键时遇到问题 问题是,我在办公室的机器上只有管理员权限,我通过添加适当的“扫描代码映射”编辑注册表(regedit),交换了CapsLock和Ctrl) 但是,这对任何远程访问会话都没有帮助,因为本地计算机上的CapsLock保持原样 我求助于AHK,但在两台机器上运行的脚本中设置CapsLock::LControl并不能解决问题。通过AHK指定键交换后,按CapsLock会向RDP会话发

我正在使用校园范围内的计算机访问办公室中的Windows 7桌面计算机,并且在切换
CapsLock
Ctrl
键时遇到问题

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

但是,这对任何远程访问会话都没有帮助,因为本地计算机上的
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
当我在本地计算机上没有管理员权限时,如何在远程访问的计算机上一致地指定
CapsLock
Ctrl
之间的键交换?在我自己的笔记本电脑上,我也通过注册表交换了
CapsLock
Ctrl
,在远程访问会话中交换这些键没有问题

祝你一切顺利


-Linfeng

此自动热键脚本使用变通方法来提供相当好的键盘功能,使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和其他自动热键用户的测试说明:

;===============
;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
;===============
[编辑:
此附加自动热键脚本将显示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
低技术解决方案 斗争 在花了几个小时讨论如何交换CapsLock和Ctrl的问题后,我发现可能没有一个理想的解决方案。(非常适合使用管理员权限创建
scancode
映射。)

解决方案
最后我买了一个带DIP开关的机械键盘,这解决了我所有的困难,通过AHK脚本轻轻地重新映射按键。DIP开关类似于“重新连接”键盘,使按键CapsLock的功能如同Ctrl键一样。

我已设法将
uncap
自动热键一起使用来解决此问题

uncap的GitHub:

  • 在本地计算机上运行
    AutoHotKey
    脚本
  • 在远程计算机上下载
    uncap
  • 在PowerShell上运行
  • path\to\uncap.exe 0x14:0x14:0xa2

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

    有关详细信息,请参阅


    更实际的是,可以将以下三个文件放入thumb驱动器中并随身携带。(鉴于当前的寄宿家庭订单,UCA未测试。某些学校计算机可能会禁止
    *.exe
    文件完全运行?)

  • uncap.exe
    ,从下载。或者,请参阅最新的安装程序
  • Bat文件1以触发重新映射。称之为
    Swap\u Capslock\u和\u Ctrl.bat
    。并且,将以下内容放入:
  • Bat文件2,以停止脚本。称之为
    StopScript.bat
    ,内容如下:

  • 尝试。我尝试在本地计算机上运行的AHK脚本中插入以下行,但是
    Capslock
    key仍然可以使用
    SetCapsLockState,AlwaysOff
    @wOxxOm,我还添加了钩子,在AHK脚本的开头放了下面一行<代码>#InstallKeybdHook
    ;然而,这仍然没有帮助。
    CapsLock
    键仍处于活动状态。您好@vafylec,我已尝试将您上面提到的脚本作为可执行文件部署到我学校的公共计算机上,但遗憾的是,它没有完全解决问题。现在,Capslock的指示灯不再提供信息,我也不知道我在哪个键上。我正在发布针对原始问题的低技术解决方案,对于我的特定用例,我已经足够满意了。Hi@llinfeng,我很高兴我的脚本在这几个月后仍然对您有潜在的用处,很高兴听到您的反馈顺便说一句,如果唯一的问题是你无法知道CapsLock是否开启,我添加了一个脚本,可以显示这个。我将作为单独的脚本/应用程序运行。Hi@vafylec,非常感谢您的新编辑;我一到学校就要考试;我的目标很简单:能够启动AHK脚本,在我没有管理员权限的机器上交换Capslock和Ctrl键,并使交换在远程访问会话中有效。到目前为止,我对掉期交易的不稳定表现感到烦恼。(有时,Capslock应该被按住;在其他情况下,Ctrl键不会被释放。)因此,我转而使用带有DIP开关的键盘。看起来很有希望。我将尝试
    uncap 0x14:0xa2 0xa2:0x14
    ,它用于交换Caps Lock键和Left Control键。
    .\uncap.exe 0x14:0xa2 0xa2:0x14
    
    .\uncap.exe -k