สคริปต์เพื่อยกหน้าต่างเดียวขึ้นด้านหน้า


8

ในสคริปต์ฉันพยายามค้นหาหน้าต่าง Terminal.app ที่มีอุปกรณ์ tty ที่เฉพาะเจาะจงและยกหน้าต่างนั้นขึ้นไปด้านบน นี่คือสิ่งที่ฉันมีใน 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

ที่ที่ฉันติดอยู่เป็นส่วน "ยกหน้าต่าง"

นี่คือบางสิ่งที่ฉันไม่ต้องการ:

set frontmost of theWin to true - สิ่งนี้จะนำหน้าต่างไปที่ด้านหน้าของกลุ่มของหน้าต่าง Terminal.app แต่ไม่ยกขึ้นเหนือหน้าต่างอื่น ๆ

tell application "Terminal" to activate- นี่จะทำให้หน้าต่าง Terminal ทุกอันอยู่ด้านหน้าเป็นกองขนาดใหญ่ ฉันแค่ต้องการหน้าต่างเดียว

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

สิ่งนี้เกือบจะทำได้ แต่สิ่งที่ต้องทำคือการยกหน้าต่างเทอร์มินัลไปที่ตำแหน่ง # 2 ยังคงอยู่ใต้หน้าต่างที่ใช้งานอยู่ (หากแอปที่ใช้งานเป็นสิ่งอื่นที่ไม่ใช่เทอร์มินัลแอป)

click theSysWin at {10,50} - ดูเหมือนจะไม่ทำอะไรเลย

click first static text of theSysWin - ดูเหมือนจะไม่ทำอะไรเลย

มีวิธีทำเช่นนี้หรือไม่? ไม่จำเป็นต้องอยู่ใน Applescript

แก้ไขฉันพบหน้าเว็บนี้ ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ ) เพื่อแจ้งการโทร Obj-C / Cocoa:

SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly);

ฉันไม่คุ้นเคยกับ ObjC หรือ Cocoa และนี่คือการเรียกใช้จากเชลล์สคริปต์ในที่สุดดังนั้นจึงไม่แน่ใจว่าจะไปจากที่ใด

คำตอบ:


5

open ยกหน้าต่างเดียวเท่านั้น:

do shell script "open -a Terminal"

อีกวิธีในการเพิ่มหน้าต่างคือการตั้งค่าดัชนีเป็น 1 จากนั้นใช้ 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

ฉันหมายถึงการคลิกที่หน้าต่างมีผลที่ต้องการ ดังนั้นไม่แน่ใจว่าทำไมมันเป็นไปไม่ได้โดยทางโปรแกรม ฉันพบหน้าเว็บนี้ ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front ) ด้วยการโทร Obj-C / Cocoa: SetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); ฉันไม่คุ้นเคยกับ objc หรือโกโก้ ที่จะรู้ว่าจะไปจากที่นั่นแม้ว่า
เบียดเสียด

4

คุณสามารถคลิกรายการเมนูของแอปพลิเคชันที่ไม่ได้ใช้งาน ใช้มันเพื่อคลิกรายการเมนูที่สอดคล้องกับหน้าต่างในเมนูหน้าต่าง

นี่คือสิ่งที่คุณต้องการแทรกในสคริปต์ของคุณ:

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

แม้ว่าจะไม่เปิดใช้งานโปรแกรม แต่หน้าต่างอยู่ข้างหน้าสุด


เกือบ! มันยกหน้าต่างด้านบนหน้าต่างอื่น ๆ ทั้งหมดยกเว้นหน้าต่างด้านบนสุดของแอปพลิเคชันที่ใช้งานอยู่ ดังนั้นถ้าฉันมีเว็บเบราว์เซอร์ที่ขยายใหญ่สุดหรือบางสิ่งบางอย่างมันจะไม่มีเอฟเฟกต์ที่มองเห็นได้: /
เบียดเสียด

นี้แก้ไขปัญหาที่ฉันมีที่ฉันได้รับข้อผิดพลาดกับ "AXRaise" ไม่เข้าใจการกระทำ "ปฏิบัติ" ...
ttt

2

ฉันรู้ว่ากระทู้นี้ค่อนข้างเก่า แต่ฉันก็วิ่งข้ามมันไปพร้อมกับต่อสู้กับปัญหาเดียวกันและอื่น ๆ ก็อาจทำได้เช่นกัน เท่าที่ฉันสามารถบอกได้ว่าไม่สามารถทำได้ใน AppleScript แบบดิบ มันสามารถทำได้ใน AppleScriptObjC อย่างไรก็ตาม หากต้องการใช้ตัวอย่างจาก @Daniel Beck เวอร์ชันใหม่จะเป็นเช่นนี้

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

รหัสที่เพิ่มเข้ามาจะใช้คลาส Cocoa NSWorkspace เพื่อ "เรียกใช้" แอปพลิเคชันซึ่งจะยกเฉพาะหน้าต่างด้านหน้าสุดของแอปพลิเคชันนั้นไปยังด้านหน้าโดยให้ความสำคัญ สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับกระบวนการที่นำฉันไปนี้ผมมีเขียนขึ้นอย่างละเอียดมากขึ้นในเว็บไซต์ของฉันที่นี่


0

นี่คือความพยายามอื่นทดสอบบน macOS High Sierra อนิจจานี่ใช้ได้เฉพาะเมื่อหน้าต่างที่ระบุอยู่บนเดสก์ท็อปปัจจุบันเท่านั้น! AppleScript API เพื่อควบคุมหน้าต่างดูเหมือนว่าไม่สมบูรณ์ทำให้สิ่งนี้เป็นไปไม่ได้

ทดแทน "Safari" และ "WhatsApp" สำหรับกรณีการใช้งานของคุณ

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

อย่างไรก็ตามสิ่งนี้ (มองเห็นได้) ยกหน้าต่างในสองขั้นตอน มันยกหน้าต่างขึ้นไปด้านบนสุดของหน้าต่างแอปพลิเคชั่นแล้วยกขึ้นไปที่ด้านบนสุดของหน้าต่างทั้งหมด ไม่สมบูรณ์แบบ แต่ใช้งานได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.