сценарій для відновлення / доведення до передньої програми або відкриття, якщо вона не активна


11

Я намагаюся розробити сценарій, який повинен зробити наступне. Наприклад, !Wслід:

  • перевірити, чи Word активний (може бути відкритим чи мінімізованим)
  • якщо він зведений до мінімуму, він повинен бути відновлений до розміру та місця, які він мав до мінімізації
  • якщо він відкритий, але "прихований" за іншими відкритими вікнами, сценарій повинен виводити його на передню частину, роблячи це переднім / активним вікном
  • якщо вона ні мінімізована, ні відкрита, програму слід розпочати

Я хотів би зробити це для декількох програм: !Wдля Word, !Nдля Notepad ++, !Xдля excel, !Pдля powerpoint, !Fдля Firefox.

Якщо працює декілька примірників програми або є кілька вкладок, слід зробити це вище для останнього екземпляра або вкладки. Отже, коли відкрито кілька вікон Firefox, він повинен відновити (або перенести на передню частину) останнє переглянуте вікно з останньо відкритою вкладкою. Аналогічно, якщо відкрито кілька текстових документів, це слід зробити для того, над ким я востаннє працював. І якщо жоден документ Word не відкритий або мінімізований, він повинен відкрити новий екземпляр слова ..

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

Відповіді:


14

Моє розуміння того, як працює активація вікон, досить просте. Він відновлює останнє вікно цього типу. Така поведінка за замовчуванням робить кодування того, що ви хочете, дуже простим. Насправді я роблю щось майже ідентичне тому, що ви шукаєте, з двома простими кодовими блоками.

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

Я створив трохи цікавої синергії для роботи з декількома моніторами. Зауважте, що в Windows 7 утримуючи клавішу shift + windows та за допомогою стрілок для навігації вліво та вправо переміщати активне вікно між моніторами зі швидкістю світла. Тож я спробував щось трохи розумніше і накреслив слово для зрушення + вікно + ш. Він відновлює слово, якщо воно вже відкрите або запускає новий примірник, якщо ні. Краса підходу полягає в тому, що я ніколи не відпускаю зміну + ключ Windows. Роблячи це, я можу як активне / запустити слово, так і перемістити його в потрібне положення, використовуючи клавіші лівої стрілки вправо (вгору максимізується до речі, а вниз зменшиться до мінімуму). Map + # 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,

Примітка: Код, наведений вище, був лише адаптацією загального результату авторського сценарію. Це дещо зайве, але ефективне. Щоб знайти щось на кшталт вікна ahk_class, спробуйте скористатися вікном-шпигуном AutoIt3.

Якщо вам потрібно відкрити заголовок вікна, ви можете отримати активний заголовок, як показано у довідковому файлі прикладу ах

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

Ще один трюк, який ви можете використовувати, - це встановити активний заголовок за допомогою WinSetTitle

Редагувати: Враховуючи, що у вас багато плаваючих примірників excel / word / powerpoint, також розгляньте можливість вирішити цю проблему за допомогою безкоштовної версії officetabs. Це дозволить вам зберігати всі відкриті файли excel в одному екземплярі, наприклад, замість того, щоб розміщуватися на панелі завдань.


Це ідеально! Чудові поради та дуже корисний код. Я збираюся додати другий монітор, щоб частина відповіді також була високо оцінена.
Пітер Вербеет

До речі, мені також подобається підказка officetabs. Я не знав, що воно існує, але це виглядає дуже корисно.
Пітер Вербеет

На щастя, працює команда "Виконати, виграти слово", тому, здається, мені не доведеться подавати повний шлях.
Пітер Вербеет

@Coldrainwater: Як потрібно змінити сценарій вище, щоб він працював для Google Chrome? Проблема полягає в тому, що назва змінюється залежно від того, який веб-сайт відкритий.
Лернкурве

1

Я бачу, ви вже знаєте про чудову мову автоматичної клавіші;). Я б використовував:

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

Якщо у вас є додаткові запитання, обов'язково їх слід задати на форумі з автоматичною клавішею.

; 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

Дякую. Я граю з ними, але насправді не знаю, як отримати ефективний цикл if-else там. Отже, якщо IfWinActive невірно, як я запускаю відповідну команду Run у складі команди else?
Пітер Вербеет

@PeterVerbeet: див. Редагування. Я використовував англійську версію Word 2007. Натисніть Shift + 1 + w, щоб побачити, як працює сценарій.
colemik

Я кілька разів редагував це.
colemik

Дякую trismarck, це дійсно корисно. Це чудово працює. Чи є спосіб зробити це "загальнішим"? Я хотів би, щоб це було запущено незалежно від того, який документ зараз редагується 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.

Сподіваюсь, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.