10

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

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

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

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

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

4 ответа4

13

Мое понимание того, как работает 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 в одном экземпляре, например, вместо разбросанных по панели задач.

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
            }
        }
}
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
0

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

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

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