2

NSWorkspace を使用しNSWorkspaceDidActivateApplicationNotificationて、アクティブなアプリケーションがいつ変更されたかを検出しています。NSRunningApplication通知の userInfo キーから取得します。

アクティブなドキュメントが変更されたときに通知を受け取る必要があります。アクセシビリティ フレームワークのNSAccessibilityDocumentAttributeキーを使用して、アクティブなドキュメントを取得できますAXUIElementCopyAttributeValue()

ポーリング以外でドキュメントの変更をより正確に検出する方法が必要です。複数のウィンドウを使用するアプリケーションもあれば、複数のタブを持つ 1 つのウィンドウを使用するアプリケーションもあります。タブ付きアプリケーションでは、ウィンドウは現在表示されているドキュメントを返します。

アクセシビリティ フレームワークを使用する必要はありません。AppleScript (スクリプト ブリッジ) もウィンドウのドキュメントを取得できるようですが、アクセシビリティ フレームワークはより多くのアプリケーションで動作するようです。

アクティブなドキュメント、アクティブなウィンドウ、アクティブなアプリケーションだけを気にします。現在、システムに焦点を当てているもの。

Sublime Text 2 や Xcode などのアプリケーションでテストしてきました。Sublime は現在選択されているタブを返し、Xcode はアクティブなプロジェクトを返します。

4

1 に答える 1

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);

これは最もエレガントな解決策かもしれません。他の誰かがより良いアイデアを持っている場合は、共有してください。また、Apple のデモ アプリSon of Grab もご覧ください。

于 2012-11-21T10:24:36.020 に答える