Kịch bản để nâng một cửa sổ lên phía trước


8

Trong một kịch bản, tôi đang cố gắng tìm cửa sổ Terminal.app chứa một thiết bị tty cụ thể và nâng cửa sổ đó lên trên cùng. Đây là những gì tôi có trong Applescript cho đến nay:

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

Nơi tôi đang bị mắc kẹt là phần "nâng cao cửa sổ".

Đây là một số thứ không hoàn toàn như tôi muốn:

set frontmost of theWin to true - điều này đưa cửa sổ ra phía trước nhóm các cửa sổ Terminal.app nhưng không nâng nó lên trên bất kỳ cửa sổ nào khác.

tell application "Terminal" to activate- điều này đưa mọi cửa sổ Terminal lên phía trước trong một ngăn xếp lớn. Tôi chỉ muốn một cửa sổ.

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

Điều này gần như làm điều đó, nhưng những gì nó làm là nâng cửa sổ đầu cuối lên vị trí số 2, vẫn ở bên dưới cửa sổ hoạt động (nếu ứng dụng đang hoạt động là thứ gì đó không phải là Terminal.app.)

click theSysWin at {10,50} - dường như không làm gì cả.

click first static text of theSysWin - dường như không làm gì cả.

Có cách nào để làm việc này không? Nó không phải là trong Applescript.

EDIT Tôi đã tìm thấy trang web này ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) trích dẫn một cuộc gọi Obj-C / Ca cao:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

Tôi không quen thuộc với ObjC hoặc Ca cao, và điều này (cuối cùng) được gọi từ một kịch bản shell, vì vậy không chắc chắn sẽ đi đâu từ đó.

Câu trả lời:


5

open chỉ tăng một cửa sổ duy nhất:

do shell script "open -a Terminal"

Một cách khác để nâng cửa sổ là đặt chỉ mục của nó thành 1 và sau đó sử dụng 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

Ý tôi là, nhấp vào cửa sổ có hiệu quả mong muốn. Vì vậy, không chắc chắn tại sao nó sẽ không thể lập trình. Tôi đã tìm thấy trang web này ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) với Obj-C / Cuộc gọi ca cao: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); Tôi không đủ quen thuộc với objc hoặc ca cao để biết nơi để đi từ đó mặc dù.
đông đúc

4

Bạn có thể nhấp vào các mục menu của các ứng dụng không hoạt động. Sử dụng nó để bấm vào mục menu tương ứng với cửa sổ trong menu Window .

Đây là những gì bạn cần chèn vào tập lệnh của mình:

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

Mặc dù nó không kích hoạt chương trình, nhưng cửa sổ ở phía trước.


Hầu hết! Nó nâng cửa sổ lên trên tất cả các cửa sổ khác NGOẠI TRỪ cửa sổ trên cùng của ứng dụng đang hoạt động. Vì vậy, nếu tôi có một trình duyệt web được tối đa hóa hoặc một cái gì đó, nó sẽ không có hiệu ứng rõ ràng: /
đông đúc vào

Điều này đã giải quyết vấn đề tôi gặp phải khi gặp lỗi "AXRaise" không hiểu hành động "thực hiện" ...
ttt

2

Tôi nhận ra chủ đề này khá cũ, nhưng tôi đã chạy qua nó trong khi chiến đấu với cùng một vấn đề và những người khác cũng có thể. Theo như tôi có thể nói thì không thể thực hiện được trong AppleScript thô. Nó có thể được thực hiện trong AppleScriptObjC. Để sử dụng ví dụ từ @Daniel Beck, phiên bản mới sẽ như thế này.

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

Mã được thêm vào sẽ sử dụng lớp Ca cao cấp NSWorkspace để "khởi chạy" ứng dụng, chỉ tăng cửa sổ ngoài cùng của ứng dụng đó lên phía trước với tiêu điểm. Để biết thêm chi tiết về quá trình đưa tôi đến vấn đề này, tôi có một bài viết kỹ lưỡng hơn trên trang web của tôi ở đây .


0

Đây là một nỗ lực khác, đã được thử nghiệm trên macOS High Sierra. Than ôi, điều này chỉ hoạt động khi cửa sổ đã cho là trên máy tính để bàn hiện tại! API AppleScript để kiểm soát các cửa sổ dường như chưa hoàn chỉnh, khiến điều này là không thể.

Thay thế "Safari" và "WhatsApp" cho trường hợp sử dụng của bạ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

Điều này (rõ ràng) nâng các cửa sổ trong hai bước, tuy nhiên. Đầu tiên, nó nâng cửa sổ lên trên cùng của các cửa sổ của ứng dụng và chỉ sau đó mới nâng nó lên trên cùng của tất cả các cửa sổ. Không hoàn hảo, nhưng chức năng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.