2012-11-17 32 views
1

我使用NSWorkspace的NSWorkspaceDidActivateApplicationNotification來檢測活動應用程序何時更改。我從通知的userInfo鍵中獲得NSRunningApplication通知OS X上的活動文檔更改?

我需要在活動文檔更改時收到通知。我可以通過使用可訪問性框架的NSAccessibilityDocumentAttribute密鑰AXUIElementCopyAttributeValue()來獲取活動文檔。

我需要一種更準確的方式來檢測文檔何時改變而不是輪詢。一些應用程序使用多個窗口,而另一些應用程序使用單個窗口和多個選項卡使用選項卡式應用程序時,窗口返回當前查看的文檔。

我不必使用輔助功能框架。 AppleScript(腳本橋)似乎也能夠獲得一個窗口的文檔,但可訪問性框架似乎與更多的應用程序一起工作。

我只關心活動應用程序的活動窗口的活動文檔。目前關注的是該系統。

我一直在測試Sublime Text 2和Xcode等應用程序。 Sublime返回當前選定的選項卡,其中Xcode返回活動項目。

回答

1

我實際上試圖達到完全相同的目的,我想我已經找到了解決方案。

我所做的就是用CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);

這會給你所有活動窗口的列表,包括你可能不關心窗口什麼。

我只關心那些kCGWindowLayer = 0;所以我篩選出的是在層中的窗口窗口0

我是這樣做的:

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID); 
NSMutableArray *data = [(__bridge NSArray *) windowList mutableCopy]; 

NSMutableArray *filteredData = [[NSMutableArray alloc] initWithCapacity:10]; 

for (NSMutableDictionary *theDict in data) { 
    id layer = [theDict objectForKey:(id)kCGWindowLayer]; 

    if ([layer intValue] == 0) { 
     [filteredData addObject:theDict]; 
    } 
} 

NSLog(@"window: %@", filteredData); 

這可能是最優雅的解決方案,因此,如果任何人有更好的主意,請分享。你也應該看看蘋果的演示程序Son of Grab

+0

這可能是不使用輔助功能框架的最佳方法。不幸的是,你仍然需要輪詢,而這不會給你當前文件的URL。但對於MAS來說,似乎是唯一的方法。 – Luke

+0

是的,我也這麼認爲。如果你想出其他東西,請讓我知道:) – Mikael