2012-02-04 5 views
2

OSX에서 상태 표시 줄의 모든 요소를 ​​가져와야합니다.OSX에서 NSStatusBar의 모든 NSStatusItem 요소를 얻는 방법은 무엇입니까?

시스템의 NSStatusBar ID를 얻으려고했으나 [NSStatusBar systemStatusBar] id하지만 NSStatusItem을 어떻게 얻을 수 있는지 알지 못합니다. 나는 개인 방법은 NSStatusBar에서 _items 이름하지만 난 그것을 호출 할 수 없습니다 발견

[[NSStatusBar systemStatusBar] _items];

엑스 코드는 그 방법이 존재하지 않는다고 나를 tould.

NSStatusBar에서 모든 NSStatusItem 요소를 가져 오는 방법은 무엇입니까?

감사

답변

6

그들이 있기 때문에 당신은 NSStatusItem 개체로 모든 항목을 얻을 수는 없습니다 모든 프로세스에 속한다.

기술적으로 상태 항목이 (경계선 없음) 창이므로 화면에있는 위치와 앱을 소유 한 앱에만 관심이있는 경우 CGWindow API로 처리 할 수 ​​있습니다. 모든 상태 표시 줄 항목에 대한 정보를 기록하는 예는 다음과 같습니다.

NSArray *windowInfos = (NSArray *)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); 
for (NSDictionary *windowInfo in windowInfos) { 
    if (([[windowInfo objectForKey:(id)kCGWindowLayer] intValue] == 25) 
     && (![[windowInfo objectForKey:(id)kCGWindowOwnerName] isEqual:@"SystemUIServer"])) { 
     NSLog(@"Status bar item: %@", windowInfo); 
    } 
} 
[windowInfos release]; 

시스템의 항목은 포함되어 있지 않습니다. 그들은 모두 "SystemUIServer"에 속한 하나의 창에 결합됩니다. 또한이 방법은 상태 표시 줄 항목의 창 레이어가 변경 될 수 있으므로 특히 신뢰할 수는 없습니다 (여기서는 25로 가정하지만 어디에도 설명되어 있지 않음).

+0

감사합니다. 나는 그것을 시도 할 것이다 –

+0

안녕하세요, 나는 상태 표시 줄에 애플 리케이션을 얻을 필요가있다. 보관 용 계정, 배터리 상태 등의 아이콘 ... 목록 상자에 목록으로 표시하고 싶습니다. 모든 창을 나열하도록 코드를 변경했지만 드롭 박스와 다른 앱이 결과에 나타나지 않습니다. –

+0

@ JonathanChacón, 솔루션을 찾았습니까? – jimwan