Xây dựng câu trả lời của electrotype Tôi có tập lệnh AHK sẽ cho phép các phím nóng Ctrl+ Win+ Leftvà Ctrl+ Win+ Rightchuyển đổi máy tính để bàn trên máy tính cục bộ, từ trong phiên RDP toàn màn hình, mà không phải hy sinh bất kỳ phím nào khác trong phiên RDP - tức là Alt+ Tabvà tương tự hoạt động như bình thường trong phiên RDP.
Vì chúng tôi muốn phím tắt thông thường hoạt động trên máy tính từ xa, bạn phải có "Chỉ khi sử dụng toàn màn hình" cho cài đặt "Áp dụng tổ hợp phím Windows" khi bắt đầu phiên RDP.
Tôi thực sự dựa trên kịch bản của mình từ một kịch bản khác mà tôi tìm thấy trên các diễn đàn AHK.
Những gì nó làm:
- Chạy tập lệnh trên máy cục bộ của bạn (không phải trên máy tính để bàn từ xa). Tôi dán cái của tôi vào
C:\users\<user>\documents\AutoHotkey.ahk
để nó chạy khi tôi bắt đầu ahk mà không có đối số.
- Nếu bạn đang ở trong phiên RDP và nhấn Ctrl+ Win+ ( Lefthoặc right) tập lệnh trước tiên sẽ gửi Ctrl+ Alt+ Homeđể tập trung vào thanh tiêu đề RDP sau đó gửi tổ hợp phím chuyển đổi trên màn hình để thực sự chuyển đổi máy tính để bàn.
Lưu ý: nó có một chút lỗi khi sử dụng hai hoặc nhiều máy tính để bàn từ xa ảo (ví dụ: một máy tính để bàn ảo cục bộ, hai máy tính để bàn ảo có cửa sổ RDP toàn màn hình trên mỗi máy) nhưng tôi không có thời gian để làm việc trên nó ngay bây giờ . Vấn đề là khi bạn chuyển từ một máy tính để bàn từ xa ảo này sang một máy tính từ xa ảo khác, bạn phải hủy liên kết và bật lại phím nóng và nó gặp khó khăn khi phát hiện điều này (mặc dù không nên - thanh tiêu đề RDP có một lớp cửa sổ khác nhưng nó không ' t luôn luôn chọn cái này).
Kịch bản 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