AHK模拟ctrl + alt + break退出远程桌面全屏模式

4
我想使用AHK模拟Ctrl + Alt + break快捷键。
以下代码无效。我还附上了按下Num-并实际按下三个键后的键盘历史记录。AHK键无法工作,而实际按键可以。两者生成的代码在我看来应该是相同的,除了 Break 在 AHK 中有 d&u。但那不应该有影响。我也引入了延迟,但那也不起作用。
SetKeyDelay, 2,2
NumpadSub::
send {LCtrl Down}{LAlt Down}{vk03sc146}{LCtrl Up}{LAlt Up}
return  

我还尝试了使用{CtrlBreak}和下面的代码,在Win XP远程桌面中都无法成功。 发送!^{vk03sc146} 这段代码在我的win 7上可以正常工作。但是我必须远程登录到Win XP。 请帮忙解决。

6D  04A     d   1.33    Num -           
A2  01D i   d   0.00    Ctrl            
A4  038 i   d   0.02    Alt             
03  146 i   d   0.02    Break           
03  146 i   u   0.02    Break           
A2  01D i   u   0.02    Ctrl            
A4  038 i   u   0.02    Alt             
6D  04A     u   0.16    Num -           
74  03F     d   1.00    F5              
74  03F     u   0.09    F5              
74  03F     d   2.02    F5              
74  03F     u   0.13    F5              
74  03F     d   0.19    F5              
74  03F     u   0.11    F5              
A2  01D     d   1.31    Ctrl            
A4  038     d   0.00    Alt             
03  146     u   0.39    Break           
A2  01D     u   0.06    Ctrl            
A4  038     u   0.03    Alt             
74  03F     d   3.08    F5       

几个问题:您尝试过使用{Break}而不是扫描代码吗?这是您的XP还是Win7扫描代码列表(或者没有区别)?您如何在远程机器上启动此脚本?您是否使用Dropbox,在其中更改脚本,然后由AutoHotKey自动检查/执行以创建远程连接? - Robert Ilbrink
我刚才扫描的代码列表如下: TrA2 01D i d 0.00 Ctrl A4 038 i d 0.02 Alt 13 000 i d 0.02 Pause 13 000 i u 0.02 Pause A2 01D i u 0.02 Ctrl A4 038 i u 0.02 Alt - suman upadhya
扫描码列表来自Win XP。 我刚试了一下{Break},得到了以下扫描码列表。 A2 01D i d 0.00 Ctrl A4 038 i d 0.02 Alt 13 000 i d 0.02 Pause 13 000 i u 0.02 Pause A2 01D i u 0.02 Ctrl A4 038 i u 0.02 Alt此脚本已安装在远程计算机上。我没有使用AHK创建远程连接,但我在远程计算机上运行另一个AHK。 虽然代码可以从win 7切换到全屏,但我不明白为什么无法从全屏切换回来。 - suman upadhya
3个回答

5

即使在RDP启动之前,AHK也可以捕获CapsLock键,这是RDP传递给其他键盘钩子的唯一键。

这可以在本地机器上完成。当您在本地机器上执行此操作时,而不是在远程机器上执行此操作时,您可以使用AHK获取MSTSC的窗口ID,并向窗口传递恢复命令(不发送键,这是非常不可靠的)。

;Get MSTSC window (this may have to be "ahk_class TSSHELLWND" for systems other than Win7)
If WinActive("ahk_class TscShellContainerClass") {
    WinGet, active_id, ID, A
    PostMessage, 0x112, 0xF120,,, ahk_id %active_id%   ; 0x112 = WM_SYSCOMMAND, 0xF120 = SC_RESTORE
}

上述命令将使MSTSC退出全屏模式。
这里有一个完整的例子(http://code.ecomerc.com/Articles/RotateCube/),其中它被用来中断MSTSC的全屏模式并旋转Dexpot的立方体功能(一种3D窗口管理器)。

我尝试了@Peter发布的代码:NumpadMult:: If WinActive("ahk_class TscShellContainerClass") { WinGet, active_id, ID, A PostMessage, 0x112, 0xF120,,, ahk_id %active_id% ; 0x112 = WM_SYSCOMMAND, 0xF120 = SC_RESTORE }但是我的本地密钥历史记录显示以下内容,什么也没有发生: FF 000 a d 3.37未找到 wrkstn09.local - 远程桌面连接 FF 000 a u 0.00未找到这是在Win 7上进行的,并且我已经检查了远程桌面类ID,它与Peter给出的相同。为什么它仍然不起作用? - suman upadhya
只有CapsLock键将被传递给AHK。似乎您正在尝试在数字键盘上捕获乘数。
您需要使用:
^Capslock ::(即Ctrl + CapsLock)
- Peter
谢谢!这帮助我解决了向MSTSC窗口发送!+{Break}的问题。尽管微软仍然限制AHK发送某些与系统相关的键(无论是意外还是故意)。 - Ahmed

1

感谢Peter在此处的回答,经过一小时的搜索,这是目前唯一有效的解决方案。我稍作修改,使其更加完整。

这个 AHK 脚本允许使用 alt + capslock 退出全屏模式,当选择远程桌面窗口时,再次按下 alt + capslock 即可恢复全屏模式。 在主机上启动 AHK 脚本。

;Get MSTSC window (this may have to be "ahk_class TSSHELLWND" for systems other than Win7)
!Capslock::
T := !T
If WinActive("ahk_class TscShellContainerClass") {
    WinGet, active_id, ID, A
    if T
        PostMessage, 0x112, 0xF120,,, ahk_id %active_id%   ; 0x112 = WM_SYSCOMMAND, 0xF120 = SC_RESTORE
    else
        PostMessage, 0x112, 0xF030,,, ahk_id %active_id%   ; 0x112 = WM_SYSCOMMAND, 0xF030 = SC_MAXIMIZE
}
return

0

如果RDP客户端的键盘钩子被激活,则除非在启动RDP客户端之后启动脚本,否则不会使用任何自动热键。

这是编写该行代码的更好方法; ^!Break


在我本地的RDP客户端(win 7)连接远程(win xp)时,代码“^!Break”和“!{ctrlbreak}”都不起作用。只有以下代码起作用: NumpadSub:: send {LCtrl Down}{LAlt Down}{vk03sc146}{LCtrl Up}{LAlt Up} return ' 但这只能使RDP窗口全屏。如果RDP窗口已经全屏,则无法使用此代码。 (使用@peter给出的任何代码)当键盘扫描包括@peter给出的代码时,在Win 7上键盘扫描码FF 000 a d 16.38未找到。 wrkstn09.tritonmarine.local-远程桌面连接。 FF 000 a u 0.00未找到。 我已从win xp中删除所有脚本。 - suman upadhya
正如在帮助中提到的,我在这行代码中留了两个空格<BR>但是在注释中却没有起作用。在这行代码之前我也留了两个空格。 - suman upadhya
关于 Person93 的建议,我在启动 RDP 客户端后开始运行脚本。运行这里发布的所有代码,包括 @Peter 的代码都不能恢复窗口。在我的 Win 7 计算机上得到了键盘历史记录 FF 000 a d 16.38 未找到 wrkstn09.local-远程桌面连接FF 000 a u0.00 未找到。但是我可以看到类是正确的,因为代码 'If WinActive("ahk_class TscShellContainerClass") { send {LCtrl Down}{LAlt Down}{vk03sc146}{LCtrl Up}{LAlt Up} }' 能够将 RDP 屏幕全屏显示。 - suman upadhya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接