Как исправить 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
Другие вопросы по тегам