![Windows 10:在全屏远程桌面中切换虚拟桌面](https://linux22.com/image/1485200/Windows%2010%EF%BC%9A%E5%9C%A8%E5%85%A8%E5%B1%8F%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2%E4%B8%AD%E5%88%87%E6%8D%A2%E8%99%9A%E6%8B%9F%E6%A1%8C%E9%9D%A2.png)
我在 Windows 10 中拥有 3 个虚拟桌面。
在其中一个桌面上,我以全屏方式运行 mstsc。
要切换桌面,我可以使用 windows+ctrl+left 或 right。
但是当我处于全屏 mstsc 中时,此键会被 mstsc 捕获,因此无法切换。
有没有办法改变这种行为?
答案1
我正在寻找解决这个问题的方法,刚刚找到了一个!
CTRL+ ALT+HOME在远程桌面中将键盘焦点返回到主机。
然后您可以执行WIN+ CTRL+LEFT或RIGHT在虚拟桌面之间切换。
不太理想,但我可能会使用 autohotkey 来处理这 2 个快捷方式。
答案2
答案3
首先,我希望 Windows 键能够在远程计算机上工作(Alt-Tab
例如),因此我将“应用 Windows 键组合”设置成“仅在使用全屏时”。
然后,由于在远程桌面全屏时,很少有组合键能够让您退出远程桌面,因此您必须使用CTRL-ALT-HOME
,它会显示连接栏,但也会将控制权交还给本地计算机。
所以我写了这个自动热键脚本 :switchVirtualDesktopWithRD.ahk. 它完全基于这个脚本,所以我不承担任何责任。我只是修改了它我的需要。您可以根据自己的情况进行调整...
就我而言,我只有两个虚拟桌面:第一个是主桌面,第二个是我运行全屏远程桌面客户端的地方。
当我按下时脚本会做什么CTRL-ALT-HOME
:
如果我处于第二个虚拟桌面上,即我运行全屏远程桌面客户端的桌面上,则首先会显示连接栏。然后我
HOME
再次按下该键(同时CTRL
仍ALT
按下 和 ),然后返回第一个主桌面。如果第二个桌面上没有全屏会话,则第一个组合会立即切换到第一个桌面。如果我在第一个桌面上,它会立即切换到第二个桌面。
换句话说,我总是习惯CTRL-ALT-HOME
在桌面之间切换。
答案4
开始建设electrotype 的答案我有一个 AHK 脚本,它可以启用Ctrl+ Win+Left和Ctrl+ Win+Right热键来在本地计算机上切换桌面,从全屏 RDP 会话中,而无需牺牲 RDP 会话中的任何其他键 - 即Alt+Tab和类似的键在 RDP 会话中仍然正常工作。
由于我们希望常规快捷键在远程计算机上发挥作用,因此在启动 RDP 会话时,必须将“应用 Windows 组合键”设置设为“仅在使用全屏时”。
我的剧本实际上是基于另一个脚本我在 AHK 论坛上发现了。
它能做什么:
- 在本地机器上运行脚本(而不是在远程桌面上)。我将我的脚本粘贴到,
C:\users\<user>\documents\AutoHotkey.ahk
这样当我启动 ahk 时,它就会运行,无需任何参数。 - 如果您在 RDP 会话中并按Ctrl+ Win+(Left或right),脚本首先发送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