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이를 위해:
- Automator 시작 (스포트라이트 유형
Automator.app
+ Enter) - 새 워크플로를 만듭니다.
- 메뉴에서 선택작업흐름>기록(또는