Как исправить AHK для отправки ключей в полноэкранный режим RDP?
Как заставить горячие клавиши AutoHotKey работать с удаленным рабочим столом в полноэкранном режиме в Windows 7?
5 ответов
Как отмечает пользователь 16659, Reload
заставляет горячие клавиши работать снова (но его сценарий не работает для меня).
По сути, теперь у меня работает два скрипта, один из которых содержит мои горячие клавиши и горячие строки "script.ahk"
и другой, который перезагрузит этот скрипт, если RDP максимизируется "controller.ahk"
,
script.ahk:
#SingleInstance force
::hw::Hello World
controller.ahk:
Run "autohotkey" "script.ahk"
#Persistent
SetTimer, ReloadOnRDPMaximized, 500
return
ReloadOnRDPMaximized:
If WinActive("ahk_class TscShellContainerClass")
{
WinGet, maxOrMin, MinMax, ahk_class TscShellContainerClass
if (maxOrMin = 0) {
WinGetPos, PosX, PosY, WinWidth, WinHeight, ahk_class TscShellContainerClass
if (PosY = 0) {
; it is fully maximized therefore reload "script.ahk"
Run "autohotkey" "script.ahk"
; wait until window gets deactivated so you don't reload it again.
WinWaitNotActive, ahk_class TscShellContainerClass
}
}
}
return
Вам также необходимо установить "Применить сочетания клавиш Windows" на вкладке "Локальные ресурсы" подключения к удаленному рабочему столу "mstsc.exe" на "НА ЭТОМ КОМПЬЮТЕРЕ"
Чтобы AHK работал с клиентом Microsoft Terminal Server в полноэкранном режиме, AHK необходимо перезагрузить после активации окна удаленного рабочего стола.
SetTimer, waitforrdp, -250
return
:*:ppp::password
:*:ccc::
SendInput, {shift}C{shift up}
SendInput, apitalized
return
waitforrdp:
IfWinActive, ahk_class TscShellContainerClass
{
WinWaitNotActive, ahk_class TscShellContainerClass,,3600
}
WinWaitActive, ahk_class TscShellContainerClass,,3600
Reload
return
Код пользователя yakrider у меня не сработал, но на основе https://github.com/CaptainHelm/AHK-RDP-Scripts/blob/main/Primary я использую этот код, который приостанавливает использование горячих клавиш, пока RDP не активен и активируется. их (с небольшой задержкой), когда RDP становится активным, что позволяет горячим клавишам работать в полноэкранном сеансе RDP:
debug_audio := true ; Use audio beeps on suspend on/off to help debugging
#persistent
setTimer, windowWatch, 500 ; Run windowWatch() every 500ms
return
windowWatch()
{
global debug_audio
static active := true ; Ensure that we suspend hotkeys upon script (re-)start
if WinActive("ahk_class TscShellContainerClass") {
if (!active) {
active := true
; Short sleep to make sure the remote desktop keyboard hook is active
Sleep 100
; Coming out of suspend mode recreates the keyboard hook, giving
; our hook priority over the remote desktop client's.
suspend off
if (debug_audio) {
SoundBeep
}
}
} else {
if (active) {
active := false
suspend on
if (debug_audio) {
SoundBeep 300
}
}
}
}
Не могу добавить комментарий к верхнему ответу, но я изменил предложенный скрипт, который Тахир связал со своим блогом в верхнем ответе, чтобы сделать его чище и проще в использовании.
Следующее работает путем приостановки локального сценария, когда активен полноэкранный RDP, вместо того, чтобы пытаться уничтожить и перезапустить отдельную версию сценария при каждом перемещении фокуса. Это легче, а также позволяет избежать засорения панели уведомлений множеством значков зомби AHK для убитых сценариев. Это также означает, что вы можете просто добавить это к существующему сценарию вместо того, чтобы запускать их оба отдельно!
; this line should be put on top (auto-exec) section of ahk script
SetTimer, SuspendOnRDPMaximized, 500
; this actual code label and the fn can be put anywhere in the script file
SuspendOnRDPMaximized:
If WinActive("ahk_class TscShellContainerClass") {
WinGet, maxOrMin, MinMax, ahk_class TscShellContainerClass
if (maxOrMin = 0) {
WinGetPos, PosX, PosY, WinWidth, WinHeight, ahk_class TscShellContainerClass
if (PosY = 0) { ; it is fully maximized
Suspend, On
WinWaitNotActive, ahk_class TscShellContainerClass
Suspend, Off
}
}
}
return