복붙노트

[PYTHON] Mac OS X에서 현재 활성 창 / 문서의 제목 가져 오기

PYTHON

Mac OS X에서 현재 활성 창 / 문서의 제목 가져 오기

이전 질문에서 나는 현재 활성 문서의 제목을 얻는 방법을 알고 싶다.

위의 질문에 대한 답변에서 스크립트 언급을 시도했습니다. 이 작동하지만 응용 프로그램의 이름 만 제공합니다. 예를 들어 나는이 질문을 쓰고있다. 스크립트를 실행하면 응용 프로그램의 이름 (예 : "Firefox")이 표시된다. 이것은 꽤 산뜻하지만 도움이되지 않습니다. 오히려 현재 활성 문서의 제목을 캡처하고 싶습니다. 이미지를 참조하십시오.

Firefox 제목 http://img.skitch.com/20090126-nq2egknhjr928d1s74i9xixckf.jpg

Leopard를 사용하고 있으므로 이전 버전과의 호환성은 필요하지 않습니다. 또한 NSWorkspace 클래스에 액세스하기 위해 Python의 Appkit을 사용하고 있지만 Objective-C 코드를 사용하면 Python으로 변환 할 수 있습니다. 좋아, 나는 매우 만족스럽지 않은 해결책을 가지고 있는데, 왜 내가 Koen Bok의 답을 표시하지 않는지. 적어도 아직은.

tell application "System Events"
set frontApp to name of first application process whose frontmost is true
end tell
tell application frontApp
if the (count of windows) is not 0 then
    set window_name to name of front window
end if
end tell

스크립트로 저장하고 쉘에서 osascript로 호출하십시오.

해결법

  1. ==============================

    1.내가 아는 한 최선의 방법은 AppleScript를 래핑하는 것입니다. 하지만 AppleScript는 나에게 마법이므로 질문자를위한 운동으로 남겨 둡니다 :-)

    내가 아는 한 최선의 방법은 AppleScript를 래핑하는 것입니다. 하지만 AppleScript는 나에게 마법이므로 질문자를위한 운동으로 남겨 둡니다 :-)

    이것은 약간 도움이 될 것입니다 : 화면을 채우기 위해 맨 앞의 두 창 크기를 조절하는 스크립트 - Mac OS X 힌트

  2. ==============================

    2.Objective-C에서 간단한 코코아 및 대개 탄소 접근성 API를 사용하는 간단한 대답은 다음과 같습니다.

    Objective-C에서 간단한 코코아 및 대개 탄소 접근성 API를 사용하는 간단한 대답은 다음과 같습니다.

    // Get the process ID of the frontmost application.
    NSRunningApplication* app = [[NSWorkspace sharedWorkspace]
                                  frontmostApplication];
    pid_t pid = [app processIdentifier];
    
    // See if we have accessibility permissions, and if not, prompt the user to
    // visit System Preferences.
    NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @YES};
    Boolean appHasPermission = AXIsProcessTrustedWithOptions(
                                 (__bridge CFDictionaryRef)options);
    if (!appHasPermission) {
       return; // we don't have accessibility permissions
    
    // Get the accessibility element corresponding to the frontmost application.
    AXUIElementRef appElem = AXUIElementCreateApplication(pid);
    if (!appElem) {
      return;
    }
    
    // Get the accessibility element corresponding to the frontmost window
    // of the frontmost application.
    AXUIElementRef window = NULL;
    if (AXUIElementCopyAttributeValue(appElem, 
          kAXFocusedWindowAttribute, (CFTypeRef*)&window) != kAXErrorSuccess) {
      CFRelease(appElem);
      return;
    }
    
    // Finally, get the title of the frontmost window.
    CFStringRef title = NULL;
    AXError result = AXUIElementCopyAttributeValue(window, kAXTitleAttribute,
                       (CFTypeRef*)&title);
    
    // At this point, we don't need window and appElem anymore.
    CFRelease(window);
    CFRelease(appElem);
    
    if (result != kAXErrorSuccess) {
      // Failed to get the window title.
      return;
    }
    
    // Success! Now, do something with the title, e.g. copy it somewhere.
    
    // Once we're done with the title, release it.
    CFRelease(title);
    

    또는이 StackOverflow 답변에서 언급 한 것처럼 CGWindow API를 사용하는 것이 더 간단 할 수 있습니다.

  3. from https://stackoverflow.com/questions/480866/get-the-title-of-the-current-active-window-document-in-mac-os-x by cc-by-sa and MIT license