Tek bir pencereyi öne yükseltecek komut dosyası


8

Bir komut dosyasında belirli bir tty aygıtı içeren Terminal.app penceresini bulmaya ve bu pencereyi yukarı kaldırmaya çalışıyorum. Applescript'te şu ana kadar neler var:

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

Sıkıştığım yer "pencereyi kaldırmak" kısmı.

İşte tam olarak istediğim şey olmayan bazı şeyler:

set frontmost of theWin to true - Bu, pencereyi Terminal.app pencereleri grubunun önüne getirir, ancak diğer pencerelerin üzerine yükseltmez.

tell application "Terminal" to activate- Bu, her Terminal penceresini büyük bir yığın halinde öne getirir. Sadece bir pencere istiyorum.

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

Bu neredeyse yapar, ancak yaptığı şey, terminal penceresini hala etkin pencerenin altında # 2 konumuna yükseltmektir (etkin uygulama Terminal.app dışında bir şeyse).

click theSysWin at {10,50} - hiçbir şey yapmıyor gibi görünüyor.

click first static text of theSysWin - hiçbir şey yapmıyor gibi görünüyor.

Bunu yapmanın bir yolu var mı? Applescript'te olması gerekmez.

EDIT Obj-C / Kakao çağrısı alıntı yapan bu web sayfasını ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) buldum :

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Ben ObjC veya Kakao ya aşina değilim ve bu (nihayetinde) bir kabuk komut dosyasından çağrılıyor, bu yüzden oradan nereye gitmek emin değilim.

Yanıtlar:


5

open sadece tek bir pencere açar:

do shell script "open -a Terminal"

Bir pencereyi yükseltmenin başka bir yolu, dizinini 1 olarak ayarlamak ve ardından AXRaise kullanmaktır:

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

Yani, pencereye tıklamak istenen etkiye sahiptir. Neden programlı olarak imkansız olacağını bilmiyorum. Bu web sayfasını ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) Obj-C / Kakao çağrısı ile SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); buldum : objc veya kakao hakkında yeterince bilgim yok oradan nereye gidileceğini bilmek.
kalabalık

4

Etkin olmayan uygulamaların menü öğelerini tıklayabilirsiniz. Pencere menüsündeki pencereye karşılık gelen menü öğesine tıklayın .

Senaryonuza eklemeniz gerekenler:

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

Programı etkinleştirmese de, pencere en öndedir.


Neredeyse! Etkin uygulamanın en üstteki penceresi DIŞINDA pencereyi diğer tüm pencerelerin üzerine kaldırır. Dolayısıyla, bir web tarayıcımı en üst düzeye çıkarmak veya başka bir şey varsa, bunun görünür bir etkisi yoktur: /
kalabalık

Bu, "AXRaise" ile "gerçekleştirme" eylemini anlamayan bir hatayla karşılaştığım sorunu çözdü ...
ttt

2

Bu iş parçacığının oldukça eski olduğunu anlıyorum, ancak aynı sorunla savaşırken karşılaştım ve diğerleri de olabilir. Anlayabildiğim kadarıyla ham AppleScript'te yapılamaz. Ancak AppleScriptObjC'de yapılabilir. @Daniel Beck'in örneğini kullanmak için yeni sürüm böyle olacak.

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

Eklenen kod, uygulamayı başlatmak için Cocoa sınıfı NSWorkspace'i kullanacak, bu da uygulamanın sadece en ön penceresini odaklanarak öne çekecektir. Beni buna getiren süreç hakkında daha fazla bilgi için, web sitemde daha ayrıntılı bir yazım var .


0

İşte macOS High Sierra'da test edilen başka bir girişim. Ne yazık ki, bu sadece verilen pencere geçerli masaüstünde olduğunda çalışır! Pencereleri kontrol etmek için AppleScript API'sı eksik görünüyor, bu da bunu imkansız hale getiriyor.

Kullanım durumunuz için "Safari" ve "WhatsApp" kullanın.

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

Ancak bu, pencereleri (adım adım) iki adımda kaldırır. Pencereyi önce uygulamanın pencerelerinin üstüne yükseltir ve ancak daha sonra tüm pencerelerin üstüne yükseltir. Mükemmel değil, işlevsel.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.