내가프로그래밍 방식으로 10.6의 프로세스 ID에서 OSX 창 ID를 가져 오는 방법은 무엇입니까? (AppleScript를를 사용하여, 목표 - C, 무엇이든)
tell application "Safari" to id of window 1
사파리의 윈도우 ID를 취득 할 수있는 것을 알고있다. 그러나 이것은 Applescriptable 응용 프로그램에서만 작동합니다. PID를 입력으로 사용하여 창 ID를 출력하는 프로그램을 작성하려고합니다. 궁금한 점이 있으면 문서화되지 않은 "CGSMoveWorkspaceWindowList"에 창 ID를 제공하여 10.6에서 공백 사이에서 응용 프로그램을 이동할 수 있습니다.
this 질문에 따르면, 문서화되지 않은 방법으로 할 수 있습니다 Objective-C를 사용하는 OSX Accessibility API의 API 불행히도 저자는 그것에 대한 추가 정보를 명시하지 않았습니다.
물론 Objective-C와 결혼하지 않았기 때문에 가능한 모든 수단을 통해 PID에서 WID를 가져 오려고합니다. 한가지 다른 가능성은 누군가가 현재 활성화/프론트 엔드 프로세스에서 WID를 얻는 것입니다 (주어진 PID를 활성화하는 명령 줄 도구가 있음).
편집 : weichsel에게 올바른 길을 가르쳐 주신 덕분에 모든 창 데이터를 출력하는 프로그램을 만들었습니다.
#include <Carbon/Carbon.h>
// compile as such:
// gcc -framework carbon -framework foundation GetWindowList.c
int main(int argc, char **argv) {
CFArrayRef windowList;
if (argc != 1) {
printf("usage: %s\n", argv[0]);
exit(1);
}
windowList = CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID);
NSLog(CFSTR("Array: %@"), windowList);
CFRelease(windowList);
}
그럼, 내가 목표 - C에서 그 작업을 수행하는 방법에 대한 0 생각을 가지고 주로하기 때문에, 모든 데이터를 구문 분석 파이썬을 사용하고, 파이썬은 아마 어쨌든 코드를 덜 줄 것입니다. D = NSLog가 SYSTEM.LOG하는 모든 기록하므로이 방법은 무한 루프 검사에 적합하지 않은 것을
import os
import re
PID_WID_List = []
temp = os.popen('./GetWindowList 2>&1').read().strip().split('},')
for i in temp:
match = re.search('kCGWindowOwnerPID = (\d+);', i)
pid = match.group(1)
match = re.search('kCGWindowNumber = (\d+);', i)
wid = match.group(1)
PID_WID_List.append((pid, wid))
참고.
다시 감사 드리며.
감사합니다. "잡아 당김"예제는 다소 복잡해서 이해할 수는 없지만 원본 질문을 최종 솔루션으로 업데이트했습니다. – James
기꺼이 도와 드리겠습니다. 파이썬 코드를 붙여 주셔서 감사합니다. –