Script per sollevare una singola finestra in primo piano


8

In uno script sto cercando di trovare la finestra Terminal.app contenente un dispositivo tty specifico e sollevare quella finestra in alto. Ecco cosa ho finora in Applescript:

tell application "System Events"
  set foundWin to false
  if (name of processes) contains "Terminal" then
    tell application "Terminal"
      set theTabs to first tab of every window where tty is "$(tty)"
      repeat with theTab in theTabs
        if class of theTab is tab then
          set theWin to (first window whose tabs contains theTab)
          set selected tab of theWin to theTab
          set foundWin to true
        end if
      end repeat
    end tell
  end if
  if foundWin then
    --RAISE THE WINDOW?!
  end if
end tell

Dove mi sto bloccando è la parte "alzare la finestra".

Ecco alcune cose che non sono proprio quello che voglio:

set frontmost of theWin to true - questo porta la finestra in primo piano nel gruppo di finestre Terminal.app ma non la solleva sopra qualsiasi altra finestra.

tell application "Terminal" to activate- questo porta ogni finestra del Terminale in primo piano in un grande stack. Voglio solo una finestra.

tell application "System Events"
    set theSysWin to first window of process "Terminal" whose name is (name of theWin)
    perform action "AXRaise" of theSysWin
end tell

Questo quasi lo fa, ma ciò che fa è alzare la finestra del terminale in posizione # 2, sempre sotto la finestra attiva (se l'app attiva è qualcosa di diverso da Terminal.app.)

click theSysWin at {10,50} - sembra non fare nulla.

click first static text of theSysWin - sembra non fare nulla.

C'è un modo per fare questo? Non deve essere in Applescript.

EDIT Ho trovato questa pagina web ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) citando una chiamata Obj-C / Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Non ho familiarità con ObjC o Cocoa, e questo viene (alla fine) invocato da uno script di shell, quindi non sono sicuro di dove andare da lì.

Risposte:


5

open solleva solo una singola finestra:

do shell script "open -a Terminal"

Un altro modo per aprire una finestra è impostare il suo indice su 1 e quindi utilizzare AXRaise:

tell application "Terminal"
    set index of window 2 to 1
end tell
tell application "System Events" to tell process "Terminal"
    perform action "AXRaise" of window 1
end tell

Voglio dire, facendo clic sulla finestra si ottiene l'effetto desiderato. Quindi non sono sicuro del motivo per cui sarebbe impossibile programmaticamente. Ho trovato questa pagina web ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) con la chiamata Obj-C / Cocoa: non SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); ho abbastanza familiarità con objc o cacao per sapere dove andare da lì però.
affollamento del

4

È possibile fare clic sulle voci di menu delle applicazioni che non sono attive. Usalo per fare clic sulla voce di menu corrispondente alla finestra nel menu Finestra .

Questo è ciò che devi inserire nel tuo script:

tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
    end tell
end tell

Sebbene non attivi il programma, la finestra è in primo piano.


Quasi! Solleva la finestra sopra tutte le altre finestre TRANNE la finestra più in alto dell'applicazione attiva. Quindi se ho un browser web ingrandito o qualcosa del genere, non ha un effetto visibile: /
affollamento del

Ciò ha risolto il problema che stavo riscontrando quando stavo ricevendo un errore con "AXRaise" che non capiva l'azione "esegui" ...
ttt

2

Mi rendo conto che questo thread è piuttosto vecchio, ma mi sono imbattuto in esso mentre combattevo lo stesso problema e anche altri potrebbero. Per quanto ne so, non è possibile farlo con AppleScript non elaborato. Tuttavia, può essere eseguito in AppleScriptObjC. Per usare l'esempio di @Daniel Beck, la nuova versione sarebbe così.

property NSWorkspace : class "NSWorkspace"
set workspace to NSWorkspace's sharedWorkspace()
tell application "System Events"
    tell application process "Terminal"
        click menu item (name of theWin) of menu of menu bar item "Window" of menu bar 1
        workspace's launchApplication_("Terminal")
    end tell
end tell

Il codice aggiunto utilizzerà la classe Cocoa NSWorkspace per "avviare" l'applicazione, che solleva in primo piano solo la finestra più in primo piano di quell'applicazione. Per maggiori dettagli sul processo che mi ha portato a questo, ho una scrittura più approfondita sul mio sito Web qui .


0

Ecco un altro tentativo, testato su macOS High Sierra. Purtroppo, questo funziona solo quando la finestra data è sul desktop corrente! L'API AppleScript per il controllo di Windows sembra essere incompleta, rendendolo impossibile.

Sostituisci "Safari" e "WhatsApp" per il tuo caso d'uso.

tell application "System Events"
    tell process "Safari"
        try
            set theWindow to (first window whose name contains "WhatsApp")
            perform action "AXRaise" of theWindow
            do shell script "open -a Safari"
        end try
    end tell
end tell

Tuttavia, ciò (visibilmente) solleva le finestre in due passaggi. Innanzitutto solleva la finestra nella parte superiore delle finestre dell'applicazione e solo successivamente la solleva nella parte superiore di tutte le finestre. Non perfetto, ma funzionale.

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.