문제

나를 찾으려고 문서(또는 문서화되지 않는다면,나의 옵션만)Api OS X 에서 쿼리 목록의 윈도우 창에서 서버를 다음의 원인은 옮겨와서 크기를 조정할 수 있습니다.할 수 있는 사람이 나를 오른쪽 방향으로 가야합니까?난 것을 시작으로 무언가가 다음과 같 FindWindowEx 이트에 대한 귀하의 의견을 이해하고 아래 Win32.

참고 하고 싶어서 이것을 외부 프로세스에서-난 어떻게 요구하 제어 응용 프로그램의 창의 크기와 위치입니다.

도움이 되었습니까?

해결책

를 사용하여 접근성이 API 를 사용합니다.이 API 를 사용하여 연결할 수 있는 프로세스의 목록을 얻 windows(실제로 배)에 위치 및 크기의 각 창도 창의 특성을 좋아하는 경우.

그러나 응용 프로그램를 사용 할 수 있습니다 이 API 는 경우에는 사용자가 활성화에 대한 액세스 보조 장치에서 자신의 환경(시스템 설정->유니버설 액세스),어떤 경우에는 모두 응용 프로그램을 사용할 수 있는 이 API 는 경우,또는 당신의 응용 프로그램은 신뢰할 수 있는 assitive 응용 프로그램(을 때 그것은 신뢰할 수 있는,그것도 API 를 사용하는 경우에도,이 옵션이 선택되지 않음).Accessibility API 를 제공해 필요한 기능을 응용 프로그램을 만들 신뢰할 수 있는 기본적으로 되어야 합니 뿌리(를 사용하여 보안 서비스 요청하는 루트 사용자 권한)다음 표시의 프로세스를 신뢰할 수 있습니다.나면 응용 프로그램이 표시되고 신뢰할 수 있는,그것은 다시 시작해야 합니다으로 신뢰할 수 있는 상태입니다만 확인에는 시작과 변경할 수 없는 응용 프로그램이 실행되는 동안.신뢰 상태가 영원하지 않는 한,사용자가 응용 프로그램이 어딘가 다른 사람 또는 해시 응용 프로그램의 이진 변화(예:후 업데이트).는 경우 사용자는 보조 장치를 사용하에서 자신의 환경 설정이 모두 응용 프로그램으로 처리되는 경우 그들 신뢰할 수 있습니다.일반적으로 내용을 확인하는 경우 이 옵션을 사용하는 경우에 당신의 물건입니다.하지 않을 경우,그것은 체크인 경우 이미 신뢰할 수 있는 경우,다시 그냥 그렇게 당신의 물건입니다.지 않은 경우를 만들려고 신뢰할 수 있는 자체 및 그 응용 프로그램을 다시 시작하지 않는 한 사용자가 감소하는 루트 권한 부여입니다.API 제공에 필요한 모든 기능을 확인하는 모든이다.

가 존재하는 전용 기능을 사용하여 동일한 작업을 수행하 Mac OS 창문 관리자,하지만 장점을 살 것이라 당신은 당신이 필요로 하지 않는 것을 신뢰할 수 있는 접근 응용 프로그램(는 한 시간에서의 작업을 처음 시작에서 가장 많은 경우).의 단점은 이 API 는 변경할 수 있습 시간(그것은 이미 과거에 변경),그것의 모든 언급되지 않음 및 기능만을 통해 알려진 리버스 엔지니어링입니다.접근성이 그러나 공개,그것은 문서화하지 않은 많이 변경 이후 첫 번째 OS X 버전을 소개하는(새로운 기능이 추가되었 10.4 에 다시 10.5 지만,많은 사람이 변경되었).

여기에는 코드 예제입니다.그것이 5 초 동안 기다립할 수 있도록,전환하는 다른 창이기 전에는 아무거나 다른 사람(그렇지 않으면 그것은 항상 일할 것이 터미널 창에서 오히려 지루한 테스트를 위해).그런 다음 그것을 얻을 것이다 앞 가장 프로세스,정면 대부분의 창의 이 과정은,그것을 인쇄하의 위치 및 크기하고 마지막으로 이동하여 25 픽셀 오른쪽에 있습니다.당신은 그것을 컴파일 명령에 따라 다음과 같은 줄 것(가정이라는 테스트입니다.c)

gcc -framework Carbon -o test test.c

참고로 실시하고 있지 않습니다 어떤 오류 검사에 대한 코드에서 단순(다양한 장소가있을 일으킬 수 있는 충돌하는 프로그램을 뭔가 잘못되면과 특정한 것들을 수도 있습니다 잘못 갈 수 있습니다).여기에는 코드:

/* Carbon includes everything necessary for Accessibilty API */
#include <Carbon/Carbon.h>

static bool amIAuthorized ()
{
    if (AXAPIEnabled() != 0) {
        /* Yehaa, all apps are authorized */
        return true;
    }
    /* Bummer, it's not activated, maybe we are trusted */
    if (AXIsProcessTrusted() != 0) {
        /* Good news, we are already trusted */
        return true;
    }
    /* Crap, we are not trusted...
     * correct behavior would now be to become a root process using
     * authorization services and then call AXMakeProcessTrusted() to make
     * ourselves trusted, then restart... I'll skip this here for
     * simplicity.
     */
    return false;
}


static AXUIElementRef getFrontMostApp ()
{
    pid_t pid;
    ProcessSerialNumber psn;

    GetFrontProcess(&psn);
    GetProcessPID(&psn, &pid);
    return AXUIElementCreateApplication(pid);
}


int main (
    int argc,
    char ** argv
) {
    int i;
    AXValueRef temp;
    CGSize windowSize;
    CGPoint windowPosition;
    CFStringRef windowTitle;
    AXUIElementRef frontMostApp;
    AXUIElementRef frontMostWindow;

    if (!amIAuthorized()) {
        printf("Can't use accessibility API!\n");
        return 1;
    }

    /* Give the user 5 seconds to switch to another window, otherwise
     * only the terminal window will be used
     */
    for (i = 0; i < 5; i++) {
        sleep(1);
        printf("%d", i + 1);
        if (i < 4) {
            printf("...");
            fflush(stdout);
        } else {
            printf("\n");
        }
    }

    /* Here we go. Find out which process is front-most */
    frontMostApp = getFrontMostApp();

    /* Get the front most window. We could also get an array of all windows
     * of this process and ask each window if it is front most, but that is
     * quite inefficient if we only need the front most window.
     */
    AXUIElementCopyAttributeValue(
        frontMostApp, kAXFocusedWindowAttribute, (CFTypeRef *)&frontMostWindow
    );

    /* Get the title of the window */
    AXUIElementCopyAttributeValue(
        frontMostWindow, kAXTitleAttribute, (CFTypeRef *)&windowTitle
    );

    /* Get the window size and position */
    AXUIElementCopyAttributeValue(
        frontMostWindow, kAXSizeAttribute, (CFTypeRef *)&temp
    );
    AXValueGetValue(temp, kAXValueCGSizeType, &windowSize);
    CFRelease(temp);

    AXUIElementCopyAttributeValue(
        frontMostWindow, kAXPositionAttribute, (CFTypeRef *)&temp
    );
    AXValueGetValue(temp, kAXValueCGPointType, &windowPosition);
    CFRelease(temp);

    /* Print everything */
    printf("\n");
    CFShow(windowTitle);
    printf(
        "Window is at (%f, %f) and has dimension of (%f, %f)\n",
        windowPosition.x,
        windowPosition.y,
        windowSize.width,
        windowSize.height
    );

    /* Move the window to the right by 25 pixels */
    windowPosition.x += 25;
    temp = AXValueCreate(kAXValueCGPointType, &windowPosition);
    AXUIElementSetAttributeValue(frontMostWindow, kAXPositionAttribute, temp);
    CFRelease(temp);

    /* Clean up */
    CFRelease(frontMostWindow);
    CFRelease(frontMostApp);
    return 0;
}

인 벤는 방법을 묻은 당신의 목록을 얻을 모든 윈도우에서 의견,다음 절차를 참조하십시오.

대신에"kAXFocusedWindowAttribute"당신이"사용 kAXWindowsAttribute"에 대한 AXUIElementCopyAttributeValue 기능입니다.그 결과가 없 AXUIElementRef 지만,CFArray 의 AXUIElementRef 요소 중 하나에 대한 각 창의 이 응용 프로그램에 있습니다.

다른 팁

는 것에 동의 접근성은 앞으로 가장 좋은 방법입니다.하지만 당신이 원하는 빠르고 더러운,AppleScript 잘 작동 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top