Mac OS X에서 어떤 프로세스가 어떤 창을 실행하고 있는지 식별하는 방법은 무엇입니까?

Mac OS X에서 어떤 프로세스가 어떤 창을 실행하고 있는지 식별하는 방법은 무엇입니까?

Mac OS X에서 창 생성/관리를 담당하는 프로세스를 식별할 수 있는지 알고 싶습니다.

예를 들어, 애플리케이션의 여러 인스턴스가 시작될 때 하나의 특정 창에 해당하는 프로세스 ID(PID)를 어떻게 얻을 수 있습니까? 또는 제목이 없는 모달 대화 상자 창이 있는 경우 해당 소유자의 PID를 어떻게 얻을 수 있습니까?

나는 Windows에서 다음을 사용하여 가능하다는 것을 알고 있습니다.시스인터널스 스위트일부 데이터로 실행되는 라이브러리를 검색하는 방법을 제공하는 도구입니다.

나는 다음과 같은 메커니즘을 찾고 있습니다.이 블로그 게시물.

이 경우 Sysinternals Suite(및 Process Explorer)를 사용하여 DLL 또는 하위 문자열(이 경우 장치의 물리적 이름 사용)을 검색하여 웹캠을 사용하고 있는 DLL/프로그램을 찾았습니다.

그렇다면 어떤 메커니즘이나 프로그램이 있나요? 아니면 Mac OS X에서 비슷한 것을 검색하는 방법에 대한 아이디어가 있나요? 어떤 프로세스가 창을 시작했는지 어떻게 확인할 수 있나요?

답변1

나는 사용했다이 Python 2 스크립트. 완벽하지는 않지만 나에게는 꽤 잘 작동합니다.

수행하는 작업에 대한 요약은 다음과 같습니다. CGWindowListCopyWindowInfo에서 가져온 을 사용하여 Quartz시스템에서 창 정보를 수집한 다음 사용자에게 원하는 창을 이동하도록 요청한 다음 창 정보를 다시 수집하고 변경된 정보를 표시합니다. 덤프된 정보에는 프로세스 ID가 포함됩니다 kCGWindowOwnerPID.

코드는 다음과 같습니다.

#!/usr/bin/env python

import time
from Quartz import CGWindowListCopyWindowInfo, kCGWindowListExcludeDesktopElements, kCGNullWindowID
from Foundation import NSSet, NSMutableSet

wl1 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID)
print 'Move target window'
time.sleep(5)
wl2 = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID)

w = NSMutableSet.setWithArray_(wl1)
w.minusSet_(NSSet.setWithArray_(wl2))
print '\nList of windows that moved:'
print w
print '\n'

스크립트는 5초 간격 내에 위치가 변경된 창에 대한 정보를 인쇄합니다. 따라서 출력은 다음과 같습니다.

List of windows that moved:
{(
        {
        kCGWindowAlpha = 1;
        kCGWindowBounds =         {
            Height = 217;
            Width = 420;
            X = 828;
            Y = 213;
        };
        kCGWindowIsOnscreen = 1;
        kCGWindowLayer = 8;
        kCGWindowMemoryUsage = 406420;
        kCGWindowName = "";
        kCGWindowNumber = 77;
        kCGWindowOwnerName = UserNotificationCenter;
        kCGWindowOwnerPID = 481;
        kCGWindowSharingState = 1;
        kCGWindowStoreType = 2;
    }
)}

답변2

라는 도구를 만들었습니다.lswin

#!/usr/bin/env python

# Install Quartz with 'pip install -U pyobjc-framework-Quartz'
import Quartz

#wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionOnScreenOnly | Quartz.kCGWindowListExcludeDesktopElements, Quartz.kCGNullWindowID)
wl = Quartz.CGWindowListCopyWindowInfo( Quartz.kCGWindowListOptionAll, Quartz.kCGNullWindowID)

wl = sorted(wl, key=lambda k: k.valueForKey_('kCGWindowOwnerPID'))

#print wl

print('PID'.rjust(7) + ' ' + 'WinID'.rjust(5) + '  ' + 'x,y,w,h'.ljust(21) + ' ' + '\t[Title] SubTitle')
print('-'.rjust(7,'-') + ' ' + '-'.rjust(5,'-') + '  ' + '-'.ljust(21,'-') + ' ' + '\t-------------------------------------------')

for v in wl:
    raw_chars = ( \
        str(v.valueForKey_('kCGWindowOwnerPID') or '?').rjust(7) + \
        ' ' + str(v.valueForKey_('kCGWindowNumber') or '?').rjust(5) + \
        ' {' + ('' if v.valueForKey_('kCGWindowBounds') is None else \
            ( \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('X')))     + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Y')))     + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Width'))) + ',' + \
                str(int(v.valueForKey_('kCGWindowBounds').valueForKey_('Height'))) \
            ) \
            ).ljust(21) + \
        '}' + \
        '\t[' + ((v.valueForKey_('kCGWindowOwnerName') or '') + ']') + \
        ('' if v.valueForKey_('kCGWindowName') is None else (' ' + v.valueForKey_('kCGWindowName') or '')) \
    )
    print(raw_chars)

답변3

원래 코드 계층 구조와 같은 관련 프로세스 외에 포괄적인 정보를 제공하는 각 창을 검사하기 위한 직접 사용자 친화적인 OS 기본 도구가 있습니다. 이 도구는 Xcode 개발자 도구 아래에 있으며 호출됩니다.Accessibility Inspector

답변4

당신은 사용할 수 있습니다Automator.app이를 위해:

  1. Automator 시작 (스포트라이트 유형 Automator.app+ Enter)
  2. 새 워크플로를 만듭니다.
  3. 메뉴에서 선택작업흐름>기록(또는

관련 정보