Skript zum Wiederherstellen / Vorrücken eines Programms oder zum Öffnen, wenn es nicht aktiv ist


11

Ich versuche, ein Skript zu entwickeln, das Folgendes tun sollte. Zum Beispiel !Wsollte:

  • Überprüfen Sie, ob Word aktiv ist (kann geöffnet oder minimiert sein).
  • Wenn es minimiert ist, sollte es auf die Größe und Position zurückgesetzt werden, die es vor der Minimierung hatte
  • Wenn es geöffnet ist, aber hinter anderen geöffneten Fenstern "versteckt" ist, sollte das Skript es nach vorne bringen und es zum vordersten / aktivsten Fenster machen
  • Wenn es weder minimiert noch geöffnet ist, sollte das Programm neu gestartet werden

Ich möchte dies für mehrere Programme tun: !Wfür Word, !Nfür Notepad ++, !Xfür Excel, !Pfür Powerpoint, !Ffür Firefox.

Wenn mehrere Instanzen eines Programms ausgeführt werden oder wenn mehrere Registerkarten verfügbar sind, sollte dies für die neueste Instanz oder Registerkarte ausgeführt werden. Wenn also mehrere Fenster von Firefox geöffnet sind, sollte das zuletzt angezeigte Fenster mit der zuletzt geöffneten Registerkarte wiederhergestellt (oder nach vorne gebracht) werden. Wenn mehrere Word-Dokumente geöffnet sind, sollte dies für das Dokument geschehen, an dem ich zuletzt gearbeitet habe. Wenn kein Word-Dokument geöffnet oder minimiert ist, sollte eine neue Word-Instanz geöffnet werden.

Ich kann einige dieser Dinge für einige Programme tun, aber nicht konsistent oder in einem Hotkey (ich lerne immer noch die Skriptsprache). Wie könnte ich das erreichen?

Antworten:


14

Mein Verständnis der Funktionsweise der Fensteraktivierung ist ziemlich einfach. Es stellt das zuletzt verwendete Fenster dieses Typs wieder her. Dieses Standardverhalten macht das Codieren sehr einfach. Tatsächlich mache ich mit zwei einfachen Codeblöcken etwas, das fast identisch mit dem ist, wonach Sie suchen.

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

Ich habe eine interessante Synergie geschaffen, um mit mehreren Monitoren zu arbeiten. Beachten Sie, dass unter Windows 7 das aktive Fenster mit Lichtgeschwindigkeit zwischen den Monitoren verschoben wird, wenn Sie die Umschalttaste + die Fenstertaste gedrückt halten und mit den Pfeilen nach links und rechts navigieren. Also habe ich etwas kluges und zugeordnetes Wort ausprobiert, um + Fenster + w zu verschieben. Es stellt das Wort wieder her, wenn es bereits geöffnet ist, oder führt eine neue Instanz aus, wenn nicht. Das Schöne an diesem Ansatz ist, dass ich Shift + Windows-Taste nie loslasse. Auf diese Weise kann ich das Wort sowohl aktivieren / starten als auch mit den Pfeiltasten nach links und rechts genau an die gewünschte Position verschieben (nach oben wird übrigens maximiert und nach unten wird minimiert). Map + # r, um das aktive Fenster wiederherzustellen, und Sie steuern alle Fenster, die Sie normalerweise mühelos verwenden, vollständig ohne die Maus. Sie müssen sich nur an den ersten Buchstaben der App erinnern, die Sie aktivieren möchten.

Als Antwort auf Ihre Frage, ob das Skript allgemeiner gestaltet werden soll:

1) Erwägen Sie die Verwendung

; 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

Oder eine andere Möglichkeit:

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

Hinweis: Der obige Code war nur eine Anpassung der generischen Ausgabe des Autoscriptwriters. Es ist etwas überflüssig, aber effektiv. Um so etwas wie die ahk_class eines Fensters zu finden, sollten Sie AutoIt3 Window Spy verwenden.

Wenn Sie den Titel eines Fensters ermitteln müssen, können Sie den aktiven Titel abrufen, wie in der ahk-Beispielhilfedatei gezeigt

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

Ein weiterer Trick, den Sie verwenden können, besteht darin, den aktiven Titel mit WinSetTitle festzulegen

Bearbeiten: Angesichts der Tatsache, dass mehrere Instanzen von Excel / Word / Powerpoint im Umlauf sind, sollten Sie dieses Problem auch mit der kostenlosen Version von officetabs lösen. So können Sie beispielsweise alle geöffneten Excel-Dateien in einer einzigen Instanz behalten, anstatt über die Taskleiste zu streuen.


Dies ist perfekt! Tolle Tipps und sehr nützlicher Code. Ich werde einen zweiten Monitor hinzufügen, damit auch ein Teil der Antwort sehr geschätzt wird.
Peter Verbeet

Übrigens gefällt mir auch der Officetabs-Tipp. Ich wusste nicht, dass es existiert, aber es sieht sehr nützlich aus.
Peter Verbeet

Glücklicherweise funktioniert der Befehl "Ausführen, Winword", sodass ich anscheinend nicht den vollständigen Pfad angeben muss.
Peter Verbeet

@Coldrainwater: Wie müsste man das obige Skript ändern, damit es für Google Chrome funktioniert? Das Problem ist, dass sich der Titel abhängig davon ändert, welche Website geöffnet ist.
Lernkurve

1

Ich sehe, Sie kennen bereits die großartige Autohotkey-Sprache;). Ich würde verwenden:

  • ifWinActive; Überprüfen Sie, ob das Fenster aktiv ist
  • WinGet, Ausgabe, MinMax; Überprüfen Sie, ob das Fenster minimiert ist
  • ifWinExists; Überprüfen Sie, ob das Fenster vorhanden ist (aber nicht aktiv ist).
  • Lauf ; Führen Sie das Programm aus, wenn kein Prozess zugeordnet ist
  • Z-Ordnung / WinList; Diese helfen Ihnen dabei, alle Instanzen aufzulisten / festzustellen, welche Instanz die erste ist

Wenn Sie weitere Fragen haben, sollten Sie diese unbedingt im Autohotkey-Forum stellen.

; 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

Vielen Dank. Ich habe mit diesen gespielt, weiß aber nicht wirklich, wie ich dort eine effektive If-else-Schleife erstellen kann. Wenn IfWinActive false ist, wie starte ich dann den entsprechenden Run-Befehl als Teil eines else-Befehls?
Peter Verbeet

@PeterVerbeet: siehe die Bearbeitung. Ich habe die englische Version von Word 2007 verwendet. Drücken Sie Umschalt + 1 + w, um zu sehen, wie das Skript funktioniert.
Colemik

Ich habe das ein paar Mal bearbeitet.
Colemik

Danke trismarck, das ist wirklich nützlich. Es funktioniert großartig. Gibt es eine Möglichkeit, es "generischer" zu machen? Ich möchte, dass dies unabhängig davon ausgeführt wird, welches Dokument gerade von Word bearbeitet wird. Es scheint mir, dass ich den Namen jedes Mal manuell im Skript ändern müsste (ich verwende häufig Word und verwende selten "Document1". Kann dies durch Überprüfen, ob Word selbst aktiv ist, unabhängig davon, um welches Dokument es sich handelt? aktiv am?
Peter Verbeet

1

Es ist vielleicht nicht so kompliziert wie manche, aber hier ist, was ich verwende, um die meisten meiner Programme zu starten. Mit dem Umschalter können Sie das Fenster minimieren, wenn es bereits aktiv ist.

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

wird nicht immer 0 umschalten?
Sam Hasler

0

So habe ich dieses Problem für mich gelöst. /superuser//a/1405409/997992 Ich habe vergessen, im ursprünglichen Beitrag zu erwähnen, dass ich ein Windows-Add-On namens "tatsächlicher Windows-Manager" verwende, weshalb ich dort eine zusätzliche Überprüfung mit WinExist für den tatsächlichen Windows-Manager habe ODER explorer.exe.

Hoffe das hilft.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.