2017-11-02 16 views
2

CGWindowListCopyWindowInfo에서 반환 된 값을 기준으로 activate (bring to the fore)의 창을 사용할 수 있습니까? (즉 window ID (kCGWindowNumber) or something else 사용.)MacOS - 윈도우 ID가 주어진 창 활성화

편집 :

나는 내 애플 (접근 권한으로 실행하는 것이다) 다른 응용 프로그램의 창에 대해이 작업을 수행 할 수 있어야한다는 지정해야합니다.

질문을 올린 후 AXUIElementPerformAction을 발견했습니다. 이것으로 올바른 방향으로 가고 있습니까?

또는 내 코드 내에서 AppleScript 브리지를 실행하는 것이 가장 좋습니다.

+0

자신의 앱이나 다른 앱을 실행하고 있습니까? –

+0

다른 앱의 경우. 편집을 참조하십시오. –

답변

0

프로세스에 pid로 연결하여 창을 가져올 수 있습니다. 다음과 같이 전면을 가지고 kAXRaiseAction를 사용

AXUIElementRef element = AXUIElementCreateApplication(pid); 
if (element) { 
    CFArrayRef array; 
    AXUIElementCopyAttributeValues(element, kAXWindowsAttribute, 0, 99999, &array); 

    if (array == nullptr) 
    return; 

    NSArray *windows = (NSArray *)CFBridgingRelease(array); 
    for (NSUInteger i = 0; i < windows.count; ++i) { 
    AXUIElementRef ref = (__bridge AXUIElementRef)(windows[i]); 
    AXError error = AXUIElementPerformAction(element, kAXRaiseAction); 
    // handle error 
    } 
} 

CFRelease(element); 

필요 없음을 배열이나 창문을 해제 할 수 있습니다. 배열에있는 자식은 자동으로 처리되고 배열은 ARC에서 해제 한 NSArray에 연결됩니다.

+0

특별히 윈도우를 식별하기 위해 윈도우 ID를 사용하고 싶었습니다. 내가 찾은 질문을 게시 한 이후에는 직접 할 방법이 없다. 그래도 수행 할 수있는 작업은 제목, 위치 및 크기를 기반으로 Windows와 일치합니다 (AXUIElementCopyAttributeValues ​​()가 반환하는 CGWindowListCopyWindowInfo()에 의해 반환 됨). 드문 경우로 유일한 일치를 찾을 수 없으므로 AXI API를 사용하여 창 크기를 1 픽셀 정도 변경하여 관심있는 CGWindow와 정확히 일치하는 것을 찾을 수 있습니다. –

+0

그래, AXRaise는 이후에해야 할 일입니다. NSRunningApplication.activate()이 뒤에옵니다. –