Windows 10:在全屏远程桌面中切换虚拟桌面

Windows 10:在全屏远程桌面中切换虚拟桌面

我在 Windows 10 中拥有 3 个虚拟桌面。
在其中一个桌面上,我以全屏方式运行 mstsc。

要切换桌面,我可以使用 windows+ctrl+left 或 right。
但是当我处于全屏 mstsc 中时,此键会被 mstsc 捕获,因此无法切换。
有没有办法改变这种行为?

答案1

我正在寻找解决这个问题的方法,刚刚找到了一个!

CTRL+ ALT+HOME在远程桌面中将键盘焦点返回到主机。
然后您可以执行WIN+ CTRL+LEFTRIGHT在虚拟桌面之间切换。
不太理想,但我可能会使用 autohotkey 来处理这 2 个快捷方式。

答案2

事实证明,在远程桌面客户端中,应用 Windows 组合键时应选择“仅限此计算机”。

远程桌面本地资源

答案3

首先,我希望 Windows 键能够在远程计算机上工作(Alt-Tab例如),因此我将“应用 Windows 键组合”设置成“仅在使用全屏时”。

然后,由于在远程桌面全屏时,很少有组合键能够让您退出远程桌面,因此您必须使用CTRL-ALT-HOME,它会显示连接栏,但也会将控制权交还给本地计算机。

所以我写了这个自动热键脚本 :switchVirtualDesktopWithRD.ahk. 它完全基于这个脚本,所以我不承担任何责任。我只是修改了它我的需要。您可以根据自己的情况进行调整...

就我而言,我只有两个虚拟桌面:第一个是主桌面,第二个是我运行全屏远程桌面客户端的地方。

当我按下时脚本会做什么CTRL-ALT-HOME

  • 如果我处于第二个虚拟桌面上,即我运行全屏远程桌面客户端的桌面上,则首先会显示连接栏。然后我HOME再次按下该键(同时CTRLALT按下 和 ),然后返回第一个主桌面。如果第二个桌面上没有全屏会话,则第一个组合会立即切换到第一个桌面。

  • 如果我在第一个桌面上,它会立即切换到第二个桌面。

换句话说,我总是习惯CTRL-ALT-HOME在桌面之间切换。

答案4

开始建设electrotype 的答案我有一个 AHK 脚本,它可以启用Ctrl+ Win+LeftCtrl+ Win+Right热键来在本地计算机上切换桌面,从全屏 RDP 会话中,而无需牺牲 RDP 会话中的任何其他键 - 即Alt+Tab和类似的键在 RDP 会话中仍然正常工作。

由于我们希望常规快捷键在远程计算机上发挥作用,因此在启动 RDP 会话时,必须将“应用 Windows 组合键”设置设为“仅在使用全屏时”。

我的剧本实际上是基于另一个脚本我在 AHK 论坛上发现了。

它能做什么:

  • 在本地机器上运行脚本(而不是在远程桌面上)。我将我的脚本粘贴到,C:\users\<user>\documents\AutoHotkey.ahk这样当我启动 ahk 时,它就会运行,无需任何参数。
  • 如果您在 RDP 会话中并按Ctrl+ Win+(Leftright),脚本首先发送Ctrl+ Alt+Home以聚焦 RDP 标题栏,然后发送切换桌面键组合以实际切换桌面。

笔记:使用两个或更多虚拟远程桌面时会出现一些小问题(例如,一个本地虚拟桌面,两个虚拟桌面,每个桌面上都有一个全屏 RDP 窗口),但我现在没有时间再处理它了。问题是,当您从一个虚拟远程桌面切换到另一个虚拟远程桌面时,您必须解除绑定并重新绑定热键,并且它无法检测到这一点(虽然它不应该 - RDP 标题栏具有不同的窗口类,但它并不总是能识别它)。

Ahk 脚本:

;setTimer, windowwatch, 500
#persistent
#usehook
SLEEP_VAL := 500
DEBUG := false
keys_bound := false

while true {
    ;Debug("Waiting")
    sleep, SLEEP_VAL
    keys_bound := WaitBind()
}

WaitBind() {
    WinWaitActive, ahk_class TscShellContainerClass
    Debug("bind")
    hotkey LWin & Left, ctrl_win_left_key, on
    hotkey LWin & Right, ctrl_win_right_key, on
    return true
}

WaitUnbind() {
    WinWaitNotActive, ahk_class TscShellContainerClass
    Debug("unbind")
    hotkey LWin & Left, ctrl_win_left_key, off
    hotkey LWin & Right, ctrl_win_right_key, off
    return false
}

Debug(msg) {
    global DEBUG
    if (DEBUG) {
        tooltip %msg%
        settimer, TooltipClear, 2000
    }
}
return

z_key:
    ; simple script for testing - change the z to 'he'
    send, he
    Debug("done z")
return

j_key:
    ; testing if we can activate the RDP title bar
    send {Ctrl down}{Alt down}{Home}{Alt up}{Ctrl up}
    Debug("done j")
Return

ctrl_win_left_key:
    ; we are intercepting all Win+Left combinations so we have to do Win+Shift+Left and Win+Left manually to preserve them inside the RDP
    GetKeyState, shiftState, Shift
    GetKeyState, ctrlState, Ctrl
    if (shiftState = "D") {
        ; by default in windows Ctrl+Shift+Win+Left will act like Shift+Win+Left - shift takes precedence
        Debug("done shift win left")
        send {Shift down}{LWin down}{Left}{LWin up}{Shift up}
    } else if (ctrlState = "D") {
        Debug("done ctrl win left")
        ; the magic happens here
        send {Ctrl down}{Alt down}{Home}{Alt up}{Ctrl up}
        keys_bound := WaitUnbind()
        ;Sleep, SLEEP_VAL ;give the OS time to focus on the title bar
        send {Ctrl down}{LWin down}{Left}{LWin up}{Ctrl up}
    } else {
        Debug("done win left")
        send {LWin down}{Left}{LWin up}
    }
Return

ctrl_win_right_key:
    ; we are intercepting all Win+Right combinations so we have to do Win+Shift+Right and Win+Right manually to preserve them inside the RDP
    GetKeyState, shiftState, Shift
    GetKeyState, ctrlState, Ctrl
    if (shiftState = "D") {
        ; by default in windows Ctrl+Shift+Win+Left will act like Shift+Win+Left - shift takes precedence
        Debug("done shift win right")
        send {Shift down}{LWin down}{Right}{LWin up}{Shift up}
    } else if (ctrlState = "D") {
        Debug("done ctrl win right")
        ; the magic happens here
        send {Ctrl down}{Alt down}{Home}{Alt up}{Ctrl up}
        keys_bound := WaitUnbind()
        ;Sleep, SLEEP_VAL ;give the OS time to focus on the title bar
        send {Ctrl down}{LWin down}{Right}{LWin up}{Ctrl up}
    } else {
        Debug("done win right")
        send {LWin down}{Right}{LWin up}
    }
Return


TooltipClear:
    ; just a routine to turn off tooltip after x milliseconds
    tooltip
    settimer, TooltipClear, off
Return

windowwatch:
    ifwinactive ahk_class TscShellContainerClass
    {
      Debug("bind")
      hotkey LWin & Left, ctrl_win_left_key, on
      hotkey LWin & Right, ctrl_win_right_key, on
    }
    else
    {
     Debug("unbind")
     hotkey LWin & Left, ctrl_win_left_key, off
     hotkey LWin & Right, ctrl_win_right_key, off
    }
Return

相关内容