2013-06-06 4 views
2

내가프로그래밍 방식으로 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)) 

참고.

다시 감사 드리며.

답변

1

링크 된 질문에 이미 답변의 일부가 포함되어 있습니다.
Windows의 정렬 된 목록 (ID와 레벨 포함)을 얻는 Objective-C 방법은 Quartz Window Services API (CGWindowList ...)입니다. ,

윈도우 정보 사전 명시 적으로 "맨 앞"키를 포함하지 않지만
https://developer.apple.com/library/mac/samplecode/SonOfGrab/ :

애플은 CGWindowListCopyWindowInfo에 의해 반환되는 모든 값을 탐색 할 수있는 "아들을 잡아의"샘플 코드 프로젝트를 제공합니다 kCGWindowLayer == 0 인 요소의 목록을 필터링하고 첫 번째 요소를 선택하여 올바른 창을 찾을 수 있어야합니다 (목록의 순서는 앞에서 뒤입니다).
사전에 kCGWindowOwnerPID 키가 포함되어 있습니다.

+0

감사합니다. "잡아 당김"예제는 다소 복잡해서 이해할 수는 없지만 원본 질문을 최종 솔루션으로 업데이트했습니다. – James

+0

기꺼이 도와 드리겠습니다. 파이썬 코드를 붙여 주셔서 감사합니다. –