Я пытаюсь сделать скрипт AutoHotkey, который будет запускать следующую последовательность после нажатия Ключ Windows+Пробел:

  1. Ключ Windows+E - открыть окно проводника
  2. Ключ Windows+Стрелка влево - привязка к левой части экрана
  3. Ключ Windows+E - открыть окно проводника
  4. Ключ Windows+Стрелка вправо - привязка к правой части экрана

Я попробовал следующее, но это не сработало:

# space::
Send #e
Send {LWin Down}{Left}{LWin Up}
Send #e
Send {LWin Down}{Right}{LWin Up}
return

Спасибо,

2 ответа2

2

Ваш код в порядке относительно того, какие ключи он отправляет. Это не работает, потому что отправляет их слишком быстро. После #e требуется некоторое время, чтобы запустить новое окно.

Простым решением было бы подождать некоторое время. Но лучше было бы динамически ожидать появления нового окна. Например достижимо через COM-объект "Оболочка".Приложение »(см. Ответ Грея) или AHK-Command« WinGet, List »(см. Ниже).

Fix-Wait-Time:

#space::
  startExplorerAttached("Left")
  startExplorerAttached("Right")
return

startExplorerAttached(sideToAttacheTo)
  {
  Send, #e
  Sleep, 500
  Send, #{%sideToAttacheTo%}
  }

Динамический:

#space::
  startExplorerAttached("Left")
  startExplorerAttached("Right")
return

startExplorerAttached(sideToAttacheTo)
  {
  hWnd := startExplorer()
  if ( hWnd == -1 )
    {
    Msgbox, Could not start/find new explorer window!
    return
    }

  WinActivate, ahk_id %hWnd%
  Send, #{%sideToAttacheTo%}
  }

startExplorer()
  {
  ; Starts a new Windows Explorer with the Computer-View. 
  ; Returns the handle from the new window or -1 if no new window is found

  static AFTER_START_DELAY := 150
  static AFTER_FAILED_SEARCH_DELAY := 20
  static MAX_SEARCH_ATTEMPTS := 100

  explorerWinTitle = ahk_class CabinetWClass
  WinGet, explorerWinHandlesBeforeStart, List, %explorerWinTitle%

  argToStartWithComputerView = /e`,
  Run, explorer.exe %argToStartWithComputerView%
  Sleep, %AFTER_START_DELAY%

  Loop, %MAX_SEARCH_ATTEMPTS%
    {
    WinGet, explorerWinHandlesAfterStart, List, %explorerWinTitle%
    Loop, %explorerWinHandlesAfterStart%
      {
      curAfterStartWinHandle := explorerWinHandlesAfterStart%A_Index%
      isOldWin := false
      Loop, %explorerWinHandlesBeforeStart%
        {
        curBeforeStartWinHandle := explorerWinHandlesBeforeStart%A_Index%
        if ( curBeforeStartWinHandle == curAfterStartWinHandle )
          {
          isOldWin := true
          break
          }
        }

      if ( not isOldWin )
        {
        return curAfterStartWinHandle
        }
      }

    Sleep, %AFTER_FAILED_SEARCH_DELAY%
    }

  return -1
  }
1
oShellWindows:=(oShell:=ComObjCreate("Shell.Application")).windows

#Space:: ; win+space
   KeyWait, Space
   oShell.MinimizeAll
   Loop, 2 ; any reasonable amount
   {
      curCnt:=oShellWindows.count
      Send, {LWinDown}{vk45}{LWinUp} ; vk45 - e
      While, curCnt=oShellWindows.count
         Sleep, 500
   }
   Exit, oShell.TileVertically, curCnt:=""

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .