скрипт для восстановления / вывода на передний план программы или открытия ее, если она не активна

11

Я пытаюсь разработать сценарий, который должен делать следующее. Например, !Wследует:

  • проверить, активен ли Word (можно открыть или свернуть)
  • если оно свернуто, его следует восстановить до размера и местоположения, которое было до минимизации
  • если он открыт, но «спрятан» за другими открытыми окнами, скрипт должен перенести его на передний план, превратив его в самое переднее / активное окно
  • если оно не свернуто и не открыто, программа должна быть запущена заново

Я хотел бы сделать это для нескольких программ: !Wдля Word, !Nдля Notepad ++, !Xдля Excel, !Pдля PowerPoint, !Fдля Firefox.

Если запущено несколько экземпляров программы или доступно несколько вкладок, то это должно быть сделано выше для самого последнего экземпляра или вкладки. Таким образом, когда открыто несколько окон Firefox, он должен восстановить (или перенести на передний план) последнее просмотренное окно с последней открытой вкладкой. Точно так же, если открыты документы из нескольких слов, он должен сделать это для того, над которым я в последний раз работал. И, если ни один документ Word не открыт или свернут, он должен открыть новый экземпляр Word.

Я могу сделать некоторые из этих вещей для некоторых программ, но не последовательно и не с помощью одной горячей клавиши (я все еще изучаю язык сценариев). Как я мог этого добиться?

Питер Вербит
источник

Ответы:

14

Мое понимание того, как работает Window Activation, довольно просто. Восстанавливает последнее использованное окно этого типа. Такое поведение по умолчанию делает кодирование того, что вы хотите, очень простым. На самом деле, я делаю что-то, почти идентичное тому, что вы делаете, с двумя простыми блоками кода.

+#w::
SetTitleMatchMode, 2 ; approximate match
IfWinExist, - Microsoft Word
{
WinActivate, - Micrsoft Word
}
IfWinNotExist, - Microsoft Word
{
Run FullFilePathToMicrosoftWord
}
return

Я создал немного интересного взаимодействия для работы с несколькими мониторами. Обратите внимание, что в Windows 7, удерживая клавишу Shift + Windows и используя стрелки для перемещения влево и вправо, активное окно будет перемещаться между мониторами со скоростью света. Поэтому я попробовал что-то немного умное и сопоставленное слово для shift + window + w. Восстанавливает слово, если оно уже открыто, или запускает новый экземпляр, если нет. Прелесть подхода в том, что я никогда не отпускаю клавиши shift + windows. Делая это, я могу как активировать / начать слово, так и перемещать его в нужное положение, используя клавиши со стрелками влево и вправо (при этом путь вверх будет максимальным, а вниз - минимальным). Карта + # r, чтобы восстановить активное окно, и вы полностью контролируете все окна, которые вы обычно используете без усилий без мыши. Все, что вы должны помнить, это первая буква приложения, которое вы пытаетесь активировать.

В ответ на ваш вопрос о том, как сделать скрипт более общим:

1) рассмотреть возможность использования

; Allows you to search for an approximate window title match
SetTitleMatchMode, 2  

; For example, you could do the following to activate any existing window with 
; "- Microsoft Word" as part of the title

WinWait, - Microsoft Word, 
IfWinNotActive, - Microsoft Word, , WinActivate, - Microsoft Word, 
WinWaitActive, - Microsoft Word,

; some other code here once you have the window active

Или другая возможность:

;Active the window by finding its ahk_class
WinWait, ahk_class OpusApp, 
IfWinNotActive, ahk_class OpusApp, , WinActivate, ahk_class OpusApp, 
WinWaitActive, ahk_class OpusApp,

Примечание. Приведенный выше код был всего лишь адаптацией общего вывода autoscriptwriter'а. Это несколько избыточно, но эффективно. Чтобы найти что-то вроде окна ahk_class, подумайте об использовании окна AutoIt3.

Если вам нужно узнать заголовок окна, вы можете получить активный заголовок, как показано в файле справки примера ahk

WinGetActiveTitle, Title
MsgBox, The active window is "%Title%".

Другой трюк, который вы можете использовать, - установить активный заголовок с помощью WinSetTitle.

Изменить: Учитывая, что у вас есть несколько экземпляров Excel / Word / PowerPoint, также рассмотреть возможность решения этой проблемы с бесплатной версией Officetabs. Это позволит вам хранить все открытые файлы Excel в одном экземпляре, например, вместо разбросанных по панели задач.

Coldrainwater
источник
Это потрясающе! Отличные советы и очень полезный код. Я собираюсь добавить второй монитор, так что часть ответа также высоко ценится.
Питер Вербит
Кстати, мне также нравится совет Officetabs. Я не знал, что он существует, но выглядит очень полезным.
Питер Вербит
К счастью, команда «Run, winword» работает, поэтому мне не нужно указывать полный путь.
Питер Вербит
@Coldrainwater: Как нужно изменить вышеуказанный скрипт, чтобы он работал для Google Chrome? Проблема в том, что название меняется в зависимости от того, какой сайт открыт.
Lernkurve
1

Я вижу, вы уже знаете великолепный язык Autohotkey;). Я бы использовал:

  • ifWinActive; проверьте, активно ли окно
  • WinGet, выход, MinMax; проверьте, свернуто ли окно
  • ifWinExists; проверить, существует ли окно (но не активно)
  • Пробег ; запустить программу, если процесс не связан
  • Z-порядок / WinList; это поможет вам перечислить все экземпляры / определить, какой экземпляр является первым

Если у вас есть дополнительные вопросы, вы обязательно должны задать их на форуме autohotkey.

; The script activates a Word 2007 window
; The script uses 'winTitle' and 'winClass' variables to match the window
; so set those properly first.
; Press Shift + 1 + w to see how the script works.
;
winTitle := "Document1 - Microsoft Word" ; use Autoit Window Spy to get this
winClass := "OpusApp"
RunWait, winword
return

+1::
    KeyWait, w, D T1 ; KeyboardHook not needed
    if(errorlevel) {
        msgbox, % """Shift + 1 + w"" failed"
        return
    }
    Send, {Backspace} ; erase 'w'
    IfWinNotActive, %winTitle%
    {
        WinActivate, %winTitle%
        WinWaitActive, %winTitle%, , 3
        if(errorlevel)
            MsgBox, % "Failed to activate the window."
    } 
    else ; Last Found Window set
    {
        MsgBox, % "Window already activated."

    }
return


F11::Reload
colemik
источник
Спасибо. Я играл с ними, но не знаю, как получить эффективный цикл if-else. Итак, если IfWinActive имеет значение false, как мне запустить соответствующую команду Run как часть команды else?
Питер Вербит
@PeterVerbeet: см. Редактирование. Я использовал английскую версию Word 2007. Нажмите Shift + 1 + w, чтобы увидеть, как работает скрипт.
colemik
Я редактировал это несколько раз.
colemik
Спасибо, Трисмарк, это действительно полезно. Работает отлично. Есть ли способ сделать его более «универсальным»? Я хотел бы, чтобы это работало независимо от того, какой документ в настоящее время редактируется Word. Мне кажется, что мне придется каждый раз менять имя в скрипте вручную (я часто использую Word и редко использую «Document1». Можно ли это сделать, проверив, активен ли сам Word, независимо от того, какой это документ? активен?
Питер Вербит
1

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

^NumpadDot::ShowStart("Google Chrome", "chrome.exe")

ShowStart(title, exe, toggle = 0)
{
    If WinActive(title) and toggle
        WinMinimize %title%
    Else
        {
            IfWinExist, %title%
                WinActivate
            else
            {
                Run, %exe%
                WinActivate
            }
        }
}
Эллиот
источник
не будет переключаться всегда будет 0?
Сэм Хаслер
0

Так я решил эту проблему для себя. https://superuser.com/a/1405409/997992 Я забыл упомянуть в исходном посте, что я использую добавление Windows на называемом фактическом диспетчере Windows, поэтому у меня есть дополнительная проверка с WinExist для любого фактического windowsmanager ИЛИ explorer.exe.

Надеюсь это поможет.

Брэндон Дж
источник