【问题标题】:AHK to simulate ctrl + alt + break to exit remote desktop full screen mode [closed]AHK模拟ctrl + alt + break退出远程桌面全屏模式[关闭]
【发布时间】:2022-01-31 06:11:41
【问题描述】:

我想用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 自动检查/执行以创建远程连接?
  • 扫码列表 I just 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
  • 扫码列表来自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开始工作以切换到全屏。我不明白为什么我无法从全屏切换回来。

标签: remote-desktop autohotkey


【解决方案1】:

即使是在 RDP 之前启动的 CapsLock 键也可以从 AHK 捕获,它是 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 not found wrkstn09.local - Remote Desktop Connection FF 000 a u 0.00 not found 这是在 Win 7 上,我检查了远程桌面类 id,它与 peter 给出的相同。为什么还是不行?
  • 只有 CapsLock 键会被传递给 AHK。看来您正试图在 Numpad 上的 Multiplicator 上进行捕获。您需要使用:^Capslock::(即Ctrl+CapsLock)
  • 谢谢!这帮助我解决了发送 !+{Break} 到 MSTSC 窗口的问题。即使 MS 仍然有阻止 AHK 发送某些系统相关密钥的限制(无论是偶然还是有意)。
【解决方案2】:

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

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

【讨论】:

  • 在我的本地 RDP 客户端 (win 7) 和远程 (win xp) 上,代码 ^!Break 不起作用。 !{ctrlbreak} 也不起作用。只有下面的代码有效: NumpadSub:: send {LCtrl Down}{LAlt Down}{vk03sc146}{LCtrl Up}{LAlt Up} return ' 但是,这仅适用于将 RDP 窗口变为全屏如果 RDP 窗口是全屏的那么当使用任何代码(包括@peter FF 000 a d 16.38 not found wrkstn09.tritonmarine.local - Remote Desktop Connection FF 000 a u 0.00 not found 我删除了所有脚本)时它不起作用(win 7 的键扫描)来自win xp。
  • 正如帮助中提到的,我为
    行留了 2 个空格,但它在评论中不起作用。我在此行之前留了 2 个空格。
  • 关于Person93的建议,我是在RDP客户端激活后启动脚本的。运行此处发布的所有代码(包括 @Peter 的代码)不会恢复窗口。我在我的 win 7 计算机 FF 000 a d 16.38 not found wrkstn09.local - Remote Desktop Connection FF 000 a u 0.00 not found 上获得了密钥历史记录。但是我可以看到该类是正确的,因为代码 'If WinActive("ahk_class TscShellContainerClass") { send {LCtrl Down}{LAlt Down}{vk03sc146}{LCtrl Up}{LAlt Up} }' 可以制作 RDP 屏幕全屏。
【解决方案3】:

以上所有归功于 Peter 的 answer,这是经过一小时搜索后迄今为止唯一可行的解​​决方案。我对其稍作修改,使其更加完整。

此 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2012-03-29
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-12-15
    相关资源
    最近更新 更多