2010-04-20 3 views
2

프로그래밍 방식으로 해결하고자하는 다음과 같은 사소한 문제가 있습니다. 내 노트북에서 보조 모니터를 뽑을 때마다 모든 창은 이제 더 작은 해상도로 표시되도록 이동합니다. 내 외부 모니터를 다시 연결하면 창을 올바른 위치로 수동으로 교체해야합니다. 나는 매일 아침해야만한다 (한숨).탄소 접근성 API - 공백에서 창 정보 가져 오기

이제 모든 열린 윈도우의 위치를 ​​저장하고 위치를 복원하려고 할 때 위치를 바꿀 수있는 간단한 명령 행 프로그램을 작성하기로 결정했습니다.

나는 프로세스 공간에 포함되지 않은 창을 제어 할 수있는 내게 필요한 옵션 API를 사용하여 올바르게 작동하는 무언가를 처리했습니다. 나는 문제가있다 : 프로그램은 내 현재 공간에있는 창을 볼 수있다 (나는 OSX 공간 기능에 대해 이야기하고있다.). 즉

, 나는 창문의 위치를 ​​저장하는 내 프로그램을 실행할 때, 단지 공간에 창문의 위치를 ​​저장할 수 있습니다 내가 현재 해요. 내 프로그램에 대한

일부 자세한 내용은 :

  • 실행중인 모든 프로세스를 반복하고 해당 PID를 얻습니다.
  • 는 이들의 PID (AXUIElementCreateApplication)
  • 그것은이 응용 프로그램과 관련된 윈도우를 얻는다에서 응용 프로그램 요소를 만든 다음 자신의 위치

응용 프로그램 요소에서 창 요소를지고의 AXUIElementCopyAttributeValues은 나만을 반환 현재 공간의 창.

이제 다른 공간에서 모든 창을 제어 할 수있는 방법이 있습니까? 그렇지 않다면 모든 창을 가져 오기 위해 프로그래밍 방식으로 공간을 변경하는 데 신경 쓰지는 않겠지 만 그렇게 할 수는 없습니다.

도움이 될 것입니다.

답변

1

공백을 전환하는 문서화 된 방법을 모르겠습니다.

원할 것입니다. CGSPrivate.h - CGSSetWorkspace 외. 그 기능이 SPI이고 10.6.x 릴리스에서도 경고없이 중단 될 수 있음을 명심하십시오.

0

개인 API를 사용하지 않으려면 Mission Control에 다양한 공백으로 이동하기위한 키보드 단축키가 있으며 프로그래밍 방식으로 키 코드를 보내서 활성화 할 수 있습니다. 내가 그것에 대해 블로그 게시물을 에서 확인할 수있는 몇 가지 예제 코드가 Amethyst라는 작업을 타일링 창 관리자에 대한 (http://ianyh.com/blog/2013/06/05/accessibility/) 썼습니다.

CGEventRef keyboardDownEvent = CGEventCreateKeyboardEvent(NULL, kVK_RightArrow, true); 
CGEventRef keyboardUpEvent = CGEventCreateKeyboardEvent(NULL, kVK_RightArrow, false); 

CGEventSetFlags(keyboardDownEvent, kCGEventFlagMaskControl); 
CGEventSetFlags(keyboardUpEvent, 0); 

CGEventPost(kCGHIDEventTap, keyboardDownEvent); 
CGEventPost(kCGHIDEventTap, keyboardUpEvent); 

CFRelease(keyboardEvent); 
CFRelease(keyboardEventUp); 

당신은 모든 공간을 통과하고 윈도우 데이터를 수집 NSWorkspaceActiveSpaceDidChangeNotification 이것을 결합 수 : 짧은 버전은 공간 이동

인접 공간으로 이동하는 기본 ctrl + arrow key를 사용하여 같이 보입니다.

또한 흥미로운 메모로 접근성 API는 실제로 모든 공간에서 동시에 윈도우를 제공 할 수 있지만 시작된 API를 사용하는 프로세스 이후로 건너 뛴 공간의 창만 제공합니다. 나는 이것이 왜 그런지 전혀 모른다. 그러나 그것이있는 것처럼 보인다.