skrypt do przywrócenia / przeniesienia na przód programu lub otwórz go, jeśli nie jest aktywny

11

Próbuję opracować skrypt, który powinien wykonać następujące czynności. Na przykład !Wpowinien:

  • sprawdź, czy Word jest aktywny (można go otworzyć lub zminimalizować)
  • jeśli zostanie zminimalizowany, powinien zostać przywrócony do rozmiaru i położenia, które miał przed minimalizacją
  • jeśli jest otwarty, ale „ukryty” za innymi otwartymi oknami, skrypt powinien przenieść go na przód, dzięki czemu będzie to pierwsze / aktywne okno
  • jeśli nie zostanie zminimalizowane ani otwarte, program powinien zostać ponownie uruchomiony

Chciałbym to zrobić dla kilku programów: !Wdla programu Word, !Ndla Notepad ++, !Xdla programu Excel, !Pdla programu PowerPoint, !Fdla programu Firefox.

Jeśli działa wiele instancji programu lub dostępnych jest wiele kart, należy wykonać powyższe czynności w przypadku najnowszej instancji lub karty. Tak więc, gdy otwartych jest wiele okien Firefoksa, powinno ono przywrócić (lub przesunąć na przód) ostatnio oglądane okno z ostatnio otwartą kartą. Podobnie, jeśli otwarte są dokumenty zawierające wiele słów, należy to zrobić dla tego, nad którym ostatnio pracowałem. A jeśli żaden dokument Worda nie jest otwarty lub zminimalizowany, powinien otworzyć nową instancję słowa.

Mogę robić niektóre z tych rzeczy dla niektórych programów, ale nie konsekwentnie, ani za pomocą jednego skrótu (wciąż uczę się języka skryptowego). Jak mogłem to osiągnąć?

Peter Verbeet
źródło

Odpowiedzi:

14

Rozumiem, jak działa aktywacja systemu Windows, jest dość prosta. Przywraca ostatnio używane okno tego typu. To domyślne zachowanie sprawia, że ​​kodowanie tego, co chcesz, jest bardzo proste. W rzeczywistości robię coś prawie identycznego z tym, czego szukasz, za pomocą dwóch prostych bloków kodu.

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

Stworzyłem trochę interesującej synergii do pracy z wieloma monitorami. Pamiętaj, że w systemie Windows 7 przytrzymanie klawisza Shift + Windows i poruszanie się w lewo i w prawo za pomocą strzałek spowoduje szybkie przesuwanie aktywnego okna między monitorami. Więc spróbowałem czegoś sprytnego i zamapowanego słowa do shift + okno + w. Przywraca słowo, jeśli jest już otwarte lub uruchamia nową instancję, jeśli nie. Piękno tego podejścia polega na tym, że nigdy nie puszczam klawisza Shift + Windows. W ten sposób mogę zarówno aktywować / uruchamiać słowo, jak i przesuwać je dokładnie do żądanej pozycji za pomocą klawiszy lewej strzałki w prawo (góra przy okazji maksymalizuje, a dół minimalizuje). Map + # r, aby przywrócić aktywne okno i całkowicie kontrolować wszystkie okna, których normalnie używasz bez wysiłku. Musisz tylko pamiętać o pierwszej literze aplikacji, którą próbujesz aktywować.

W odpowiedzi na twoje pytanie dotyczące uczynienia skryptu bardziej ogólnym:

1) Rozważ użycie

; 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

Lub inna możliwość:

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

Uwaga: powyższy kod był tylko adaptacją ogólnych danych wyjściowych autoscriptwriter. Jest nieco zbędny, ale skuteczny. Aby znaleźć coś w rodzaju ahk_class okna, rozważ użycie szpiega okien AutoIt3.

Jeśli chcesz odkryć tytuł okna, możesz uzyskać tytuł aktywny, jak pokazano w przykładowym pliku pomocy ahk

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

Inną sztuczką, której możesz użyć, jest ustawienie aktywnego tytułu za pomocą WinSetTitle

Edycja: Biorąc pod uwagę, że masz wiele wystąpień programu Excel / Word / Powerpoint, możesz również rozważyć rozwiązanie tego problemu w bezpłatnej edycji officetabs. Pozwoli ci to przechowywać wszystkie otwarte pliki programu Excel w jednej instancji, na przykład, zamiast rozrzucać się po pasku zadań.

Coldrainwater
źródło
To jest doskonałe! Świetne wskazówki i bardzo przydatny kod. Zamierzam dodać drugi monitor, aby część odpowiedzi była również bardzo doceniana.
Peter Verbeet
Nawiasem mówiąc, podoba mi się również wskazówka z officetabs. Nie wiedziałem, że istnieje, ale wygląda bardzo przydatnie.
Peter Verbeet
Na szczęście działa polecenie „Run, winword”, więc wydaje się, że nie muszę podawać pełnej ścieżki.
Peter Verbeet
@Coldrainwater: Jak należałoby zmienić powyższy skrypt, aby działał w przeglądarce Google Chrome? Problem polega na tym, że tytuł zmienia się w zależności od tego, która strona internetowa jest otwarta.
Lernkurve,
1

Widzę, że znasz już wspaniały język Autohotkey;). Użyłbym:

  • ifWinActive; sprawdź, czy okno jest aktywne
  • WinGet, wyjście, MinMax; sprawdź, czy okno jest zminimalizowane
  • ifWinExists; sprawdź, czy okno istnieje (ale nie jest aktywne)
  • Biegać ; uruchom program, jeśli nie jest powiązany żaden proces
  • Z-order / WinList; te pomogą ci wyświetlić listę wszystkich instancji / ustalić, która instancja jest pierwsza

Jeśli masz więcej pytań, zdecydowanie powinieneś zadać je na forum 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
źródło
Dzięki. Bawiłem się nimi, ale tak naprawdę nie wiem, jak uzyskać tam skuteczną pętlę if-else. Jeśli więc IfWinActive ma wartość false, jak uruchomić odpowiednią komendę Run jako część komendy else?
Peter Verbeet
@PeterVerbeet: zobacz edycję. Użyłem angielskiej wersji Word 2007. Naciśnij Shift + 1 + w, aby zobaczyć, jak działa skrypt.
colemik
Edytowałem to kilka razy.
colemik
Dzięki, Trismarck, to jest naprawdę przydatne. Działa świetnie. Czy istnieje sposób, aby uczynić go bardziej „ogólnym”? Chciałbym, aby działało to niezależnie od tego, jaki dokument jest obecnie edytowany przez program Word. Wydaje mi się, że musiałbym za każdym razem ręcznie zmieniać nazwę skryptu (często używam Worda i rzadko używam „Document1”. Czy można to zrobić, sprawdzając, czy sam Word jest aktywny, niezależnie od tego, jaki to dokument aktywny w dniu?
Peter Verbeet
1

To może nie być tak skomplikowane jak niektóre, ale oto, czego używam do uruchamiania większości moich programów. Przełącznik pozwala zminimalizować okno, jeśli jest już aktywne.

^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
            }
        }
}
Elliot
źródło
czy przełączanie nie zawsze będzie równe 0?
Sam Hasler
0

W ten sposób sam rozwiązałem ten problem. https://superuser.com/a/1405409/997992 W oryginalnym poście zapomniałem wspomnieć, że korzystam z dodatku do systemu Windows o nazwie rzeczywistego menedżera systemu Windows, dlatego mam tam dodatkową kontrolę z WinExist dla faktycznego menedżera okien LUB explorer.exe.

Mam nadzieję że to pomoże.

Brandon G.
źródło