script à restaurer / mettre en avant d'un programme, ou l'ouvrir s'il n'est pas actif

11

J'essaie de développer un script qui devrait faire ce qui suit. Par exemple, !Wdevrait:

  • vérifier si Word est actif (peut être ouvert ou réduit)
  • s'il est minimisé, il doit être restauré à la taille et à l'emplacement qu'il avait avant la minimisation
  • s'il est ouvert, mais "caché" derrière d'autres fenêtres ouvertes, le script doit le placer au premier plan, ce qui en fait la fenêtre la plus en avant / active
  • s'il n'est ni minimisé ni ouvert, le programme doit être fraîchement démarré

Je voudrais le faire pour plusieurs programmes: !Wpour Word, !Npour Notepad ++, !Xpour excel, !Ppour powerpoint, !Fpour Firefox.

Si plusieurs instances d'un programme sont en cours d'exécution ou si plusieurs onglets sont disponibles, il doit effectuer les opérations ci-dessus pour l'instance ou l'onglet le plus récent. Ainsi, lorsque plusieurs fenêtres de Firefox sont ouvertes, il devrait restaurer (ou mettre en avant) la fenêtre la plus récemment affichée avec l'onglet le plus récemment ouvert. De même, si plusieurs documents Word sont ouverts, il devrait le faire pour celui sur lequel je travaillais en dernier. Et, si aucun document Word n'est ouvert ou réduit, il devrait ouvrir une nouvelle instance de mot.

Je peux faire certaines de ces choses, pour certains programmes, mais pas systématiquement, ni dans un raccourci clavier (j'apprends toujours le langage de script). Comment pourrais-je y parvenir?

Peter Verbeet
la source

Réponses:

14

Ma compréhension du fonctionnement de l'activation de la fenêtre est assez simple. Il restaure la dernière fenêtre d'utilisation de ce type. Ce comportement par défaut rend le codage de ce que vous voulez très simple. En fait, je fais quelque chose de presque identique à ce que vous recherchez avec deux blocs de code simples.

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

J'ai créé une synergie intéressante pour travailler avec plusieurs moniteurs. Notez que sur Windows 7, en maintenant la touche Maj + Windows enfoncée et en utilisant les flèches pour naviguer vers la gauche et la droite, la fenêtre active entre les moniteurs se déplace à la vitesse de la lumière. J'ai donc essayé quelque chose d'un mot un peu intelligent et mappé pour déplacer + fenêtre + w. Il restaure le mot s'il est déjà ouvert ou exécute une nouvelle instance sinon. La beauté de l'approche est que je n'ai jamais lâché la touche Maj + Windows. Ce faisant, je peux à la fois activer / démarrer le mot et le déplacer exactement à la position que je veux en utilisant les touches fléchées gauche droite (le haut sera maximisé par le chemin et le bas minimisera). Map + # r pour restaurer la fenêtre active et vous contrôlez complètement toutes les fenêtres que vous utilisez normalement sans effort sans la souris. Tout ce dont vous devez vous souvenir est la première lettre de l'application que vous essayez d'activer.

En réponse à votre question sur la façon de rendre le script plus générique:

1) Pensez à utiliser

; 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

Ou une autre 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,

Remarque: Le code ci-dessus n'était qu'une adaptation de la sortie générique du scripteur automatique. C'est quelque peu redondant mais efficace. Pour trouver quelque chose comme ahk_class d'une fenêtre, envisagez d'utiliser l'espion de fenêtre AutoIt3.

Si vous avez besoin de découvrir le titre d'une fenêtre, vous pouvez obtenir le titre actif comme indiqué dans l'exemple de fichier d'aide ahk

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

Une autre astuce que vous pouvez utiliser consiste à définir le titre actif à l'aide de WinSetTitle

Modifier: Étant donné que vous avez plusieurs instances d'Excel / Word / Powerpoint flottant, envisagez également de résoudre ce problème avec l'édition gratuite d'Officetabs. Il vous permettra de conserver tous les fichiers Excel ouverts dans une seule instance par exemple au lieu de vous éparpiller dans la barre des tâches.

Coldrainwater
la source
C'est parfait! Grands conseils et code très utile. Je vais ajouter un deuxième moniteur, de sorte qu'une partie de la réponse est également très appréciée.
Peter Verbeet
Au fait, j'aime aussi le conseil des officetabs. Je ne savais pas que ça existait, mais ça a l'air très utile.
Peter Verbeet
Heureusement, la commande "Run, winword" fonctionne, il semble donc que je n'ai pas à fournir le chemin complet.
Peter Verbeet
@Coldrainwater: Comment faudrait-il changer votre script ci-dessus pour le faire fonctionner pour Google Chrome? Le problème est que le titre change en fonction du site Web ouvert.
Lernkurve du
1

Je vois que vous connaissez déjà le magnifique langage Autohotkey;). J'utiliserais:

  • ifWinActive; vérifier si la fenêtre est active
  • WinGet, sortie, MinMax; vérifier si la fenêtre est réduite
  • ifWinExists; vérifier si la fenêtre existe (mais pas active)
  • Courir ; exécuter le programme si aucun processus n'est associé
  • Z-order / WinList; ceux-ci vous aideront à répertorier toutes les instances / à déterminer quelle instance est la première

Si vous avez d'autres questions, vous devriez certainement les poser sur le 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
la source
Merci. J'ai joué avec ceux-ci, mais je ne sais pas vraiment comment obtenir une boucle if-else efficace là-dedans. Donc, si IfWinActive est faux, comment puis-je lancer la commande Exécuter appropriée dans le cadre d'une commande else?
Peter Verbeet
@PeterVerbeet: voir l'édition. J'ai utilisé la version anglaise de Word 2007. Appuyez sur Maj + 1 + w pour voir comment fonctionne le script.
colemik
Je l'ai édité plusieurs fois.
colemik
Merci trismarck, c'est vraiment utile. Cela fonctionne très bien. Existe-t-il un moyen de le rendre plus "générique"? Je voudrais que cela s'exécute quel que soit le document en cours de modification par Word. Il me semble que je devrais changer le nom manuellement dans le script à chaque fois (j'utilise beaucoup Word et j'utilise rarement "Document1". Peut-on le faire en vérifiant si Word lui-même est actif, quel que soit le document qu'il s'agit actif
Peter Verbeet
1

Ce n'est peut-être pas aussi compliqué que certains, mais voici ce que j'utilise pour lancer la plupart de mes programmes. La bascule vous permet de réduire la fenêtre si elle est déjà active.

^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
la source
ne bascule pas toujours à 0?
Sam Hasler
0

C'est ainsi que j'ai résolu ce problème par moi-même. /superuser//a/1405409/997992 J'ai oublié de mentionner dans le message d'origine que j'utilise un module complémentaire Windows appelé gestionnaire de fenêtres réel, c'est pourquoi j'ai un contrôle supplémentaire avec WinExist là-bas pour soit le realwindowsmanager OU explorer.exe.

J'espère que cela t'aides.

Brandon G
la source