하나의 창을 앞으로 올리는 스크립트


8

스크립트에서 특정 tty 장치가 포함 된 Terminal.app 창을 찾고 해당 창을 맨 위로 올리려고합니다. 지금까지 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이것은 모든 터미널 창을 큰 스택으로 전면으로 가져옵니다. 나는 단지 하나의 창을 원한다.

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 위치로 올리는 것입니다 (활성 응용 프로그램이 Terminal.app 이외의 다른 경우).

click theSysWin at {10,50} -아무것도하지 않는 것 같습니다.

click first static text of theSysWin -아무것도하지 않는 것 같습니다.

이것을 할 수있는 방법이 있습니까? Applescript에있을 필요는 없습니다.

편집 Obj-C / Cocoa 호출을 인용하는 이 웹 페이지 ( http://blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front/ )를 찾았습니다 .

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

내 말은, 클릭 창에 원하는 효과가 있습니다. 프로그래밍 방식으로 불가능한 이유는 확실하지 않습니다. Obj-C / Cocoa 호출 이있는이 웹 페이지 ( blog.coriolis.ch/2008/03/04/bring-any-window-to-the-front )를 찾았습니다 .objcSetFrontProcessWithOptions(&psn, kSetFrontProcessFrontWindowOnly); 또는 cocoa에 익숙하지 않습니다. 그래도 어디로 가야하는지 알고
군중

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가 불완전하여 불가능한 것으로 보입니다.

"사파리"와 "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.