สร้างคำตอบของ electrotypeฉันมีสคริปต์ AHK ที่จะเปิดใช้งานCtrl+ Win+ LeftและCtrl+ Win+ Rightฮอตคีย์เพื่อสลับเดสก์ท็อปบนคอมพิวเตอร์ท้องถิ่นจากภายในเซสชัน RDP เต็มหน้าจอโดยไม่ต้องเสียสละคีย์อื่น ๆ ภายในเซสชัน RDP - เช่นAlt+ Tabและคล้ายกันทั้งหมด ทำงานได้ตามปกติภายในเซสชัน RDP
เนื่องจากเราต้องการให้ปุ่มทางลัดปกติทำงานบนคอมพิวเตอร์ระยะไกลคุณต้องมี "เมื่อใช้งานเต็มหน้าจอ" สำหรับการตั้งค่า "ใช้คีย์ Windows ร่วมกัน" เมื่อเริ่มเซสชัน RDP
จริง ๆ แล้วฉันใช้สคริปต์ของฉันกับสคริปต์อื่นที่ฉันพบในฟอรัม 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