창을 이동하고 크기를 조정 Api OS X
문제
나를 찾으려고 문서(또는 문서화되지 않는다면,나의 옵션만)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 잘 작동 합니다.