script per ripristinare / portare in primo piano un programma o aprirlo se non è attivo


11

Sto cercando di sviluppare una sceneggiatura che dovrebbe fare quanto segue. Ad esempio, !Wdovrebbe:

  • controlla se Word è attivo (può essere aperto o ridotto a icona)
  • se è ridotto a icona, dovrebbe essere ripristinato alle dimensioni e alla posizione che aveva prima della minimizzazione
  • se è aperto, ma "nascosto" dietro altre finestre aperte, lo script dovrebbe portarlo in primo piano, rendendolo la finestra più in primo piano / attiva
  • se non è né minimizzato né aperto, il programma dovrebbe essere appena avviato

Vorrei farlo per diversi programmi: !Wper Word, !Nper Notepad ++, !Xper Excel, !Pper PowerPoint, !Fper Firefox.

Se sono in esecuzione più istanze di un programma o se sono disponibili più schede, dovrebbe eseguire quanto sopra per l'istanza o la scheda più recenti. Quindi, quando più finestre di Firefox sono aperte, dovrebbe ripristinare (o portare in primo piano) la finestra visualizzata più di recente con la scheda aperta più di recente. Allo stesso modo, se sono aperti più documenti di parole, dovrebbe farlo per quello su cui stavo lavorando l'ultima volta. E, se nessun documento di Word è aperto o minimizzato, dovrebbe aprire una nuova istanza di word.

Posso fare alcune di queste cose, per alcuni programmi, ma non in modo coerente, né in un tasto di scelta rapida (sto ancora imparando il linguaggio di scripting). Come ho potuto raggiungere questo obiettivo?

Risposte:


14

La mia comprensione di come funziona Window Activation è piuttosto semplice. Ripristina la finestra di utilizzo più recente di quel tipo. Questo comportamento predefinito rende molto semplice la codifica di ciò che desideri. In effetti, faccio qualcosa di quasi identico a quello che stai cercando con due semplici blocchi di codice.

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

Ho creato un'interessante sinergia per lavorare con più monitor. Si noti che su Windows 7, tenendo premuto MAIUSC + tasto Windows e utilizzando le frecce per spostarsi a sinistra e a destra, la finestra attiva verrà spostata tra i monitor alla velocità della luce. Quindi ho provato qualcosa di un po 'intelligente e mappato parola per spostare + finestra + w. Ripristina word se è già aperto o esegue una nuova istanza in caso contrario. La bellezza dell'approccio è che non ho mai lasciato andare maiusc + tasto windows. In questo modo posso sia attivare / avviare la parola che spostarla esattamente nella posizione desiderata usando i tasti freccia destra sinistra (su aumenterà al massimo e in basso minimizzerà). Mappa + # r per ripristinare la finestra attiva e controlli completamente tutte le finestre che normalmente usi senza sforzo senza il mouse. Tutto quello che devi ricordare è la prima lettera dell'app che stai cercando di attivare.

In risposta alla tua domanda su come rendere lo script più generico:

1) Prendi in considerazione l'utilizzo

; 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

O un'altra possibilità:

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

Nota: il codice sopra era solo un adattamento dell'output generico dello scrittore automatico. È in qualche modo ridondante ma efficace. Per trovare qualcosa come ahk_class di una finestra, considera l'utilizzo della spia della finestra di AutoIt3.

Se è necessario scoprire il titolo di una finestra, è possibile ottenere il titolo attivo come mostrato nel file della guida di esempio ahk

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

Un altro trucco che puoi usare è impostare il titolo attivo usando WinSetTitle

Modifica: dato che hai più istanze di excel / word / powerpoint che fluttuano intorno, considera anche di risolvere quel problema con l'edizione gratuita di officetabs. Ti permetterà di mantenere tutti i file Excel aperti in una singola istanza, ad esempio invece di sparpagliati sulla barra delle applicazioni.


Questo è perfetto! Ottimi consigli e codice molto utile. Ho intenzione di aggiungere un secondo monitor, in modo che anche una parte della risposta sia molto apprezzata.
Peter Verbeet,

A proposito, mi piace anche la punta di officetabs. Non sapevo che esistesse, ma sembra molto utile.
Peter Verbeet,

Fortunatamente, il comando "Esegui, winword" funziona, quindi sembra che non debba fornire il percorso completo.
Peter Verbeet,

@Coldrainwater: come si dovrebbe cambiare lo script sopra per farlo funzionare per Google Chrome? Il problema è che il titolo cambia a seconda del sito Web aperto.
Lernkurve,

1

Vedo che conosci già il magnifico linguaggio Autohotkey;). Vorrei usare:

  • ifWinActive; controlla se la finestra è attiva
  • WinGet, output, MinMax; controlla se la finestra è ridotta a icona
  • ifWinExists; controlla se esiste una finestra (ma non attiva)
  • Correre ; eseguire il programma se nessun processo associato
  • Z-order / WinList; quelli ti aiuteranno a elencare tutte le istanze / determinare quale istanza è la prima

Se hai altre domande, dovresti assolutamente farle sul forum di 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

Grazie. Ho giocato con questi, ma non so davvero come ottenere un loop if-else efficace lì dentro. Quindi, se IfWinActive è falso, come posso avviare il comando Esegui appropriato come parte di un altro comando?
Peter Verbeet,

@PeterVerbeet: vedi la modifica. Ho usato la versione inglese di Word 2007. Premi Maiusc + 1 + w per vedere come funziona lo script.
Colemik,

L'ho modificato alcune volte.
colemik,

Grazie trismarck, è davvero utile. Funziona benissimo. C'è un modo per renderlo più "generico"? Vorrei che questo funzionasse indipendentemente dal documento che è attualmente in fase di modifica da Word. Mi sembra che dovrei cambiare il nome manualmente nello script ogni volta (uso molto Word e uso raramente "Document1". Può essere fatto controllando se Word stesso è attivo, indipendentemente dal documento che è attivo su?
Peter Verbeet,

1

Potrebbe non essere così complicato come alcuni, ma ecco quello che uso per avviare la maggior parte dei miei programmi. La levetta consente di ridurre a icona la finestra se è già attiva.

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

non sarà sempre lo 0?
Sam Hasler

0

È così che ho risolto questo problema da solo. /superuser//a/1405409/997992 Ho dimenticato di menzionare nel post originale che sto usando un componente aggiuntivo di Windows sul gestore di finestre chiamato reale, motivo per cui ho un controllo extra con WinExist sia per il realwindowsmanager O explorer.exe.

Spero che questo ti aiuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.