MacのCocoaでは、別のアプリに属するウィンドウが移動、サイズ変更、または再描画されたときを検出したいと思います。これどうやってするの?私のアプリは別のアプリのウィンドウの変更をどのように検知できますか?
答えて
ApplicationServicesフレームワーク内にあるプレーンCのアクセシビリティAPIを使用する必要があります。例えば:
まず、アプリケーションオブジェクトを作成します。
AXUIElementRef app = AXUIElementCreateApplication(targetApplicationProcessID);
その後、あなたはここからウィンドウを取得します。ウィンドウリストを要求して列挙するか、最前面のウィンドウを取得できます(使用するすべての属性名についてはAXAttributeConstants.hを参照してください)。
AXUIElementRef frontWindow = NULL;
AXError err = AXUIElementCopyAttributeValue(app, kAXMainWindowAttribute, &frontWindow);
if (err != kAXErrorSuccess)
// it failed -- maybe no main window (yet)
このウィンドウのプロパティが変更されると、Cコールバック関数を介して通知を要求できます。これは、4段階のプロセスです:
まず、通知を受信するコールバック関数を必要とする:
void MyAXObserverCallback(AXObserverRef observer, AXUIElementRef element,
CFStringRef notificationName, void * contextData)
{
// handle the notification appropriately
// when using ObjC, your contextData might be an object, therefore you can do:
SomeObject * obj = (SomeObject *) contextData;
// now do something with obj
}
次のコールバック・ルーチンを管理AXObserverRefを、必要とします。これは、あなたが上記の「アプリ」要素を作成するために使用したのと同じプロセスIDが必要です。
AXObserverRef observer = NULL;
AXError err = AXObserverCreate(applicationProcessID, MyObserverCallback, &observer);
if (err != kAXErrorSuccess)
// handle the error
あなたのオブザーバーを得たが、次のステップは、特定の物事の通知を要求することです。最後のパラメータはcontextDataとし「自己」のオブジェクトが渡されることを
AXObserverAddNotification(observer, frontWindow, kAXMovedNotification, self);
AXObserverAddNotification(observer, frontWindow, kAXResizedNotification, self);
注:完全なリストについては、しかし、ウィンドウのAXNotificationConstants.hを参照してくださいあなたはおそらく唯一のこれら二つが必要になります変更します。これは保持されないので、このオブジェクトがなくなるとAXObserverRemoveNotification
に電話することが重要です。
CFRunLoopAddSource([[NSRunLoop currentRunLoop] getCFRunLoop],
AXObserverGetRunLoopSource(observer),
kCFRunLoopDefaultMode);
AXUIElementRef
秒:
は、あなたが今、あなたは(実際に全くまたは)、非同期的にこれらの通知を送ることができるように、実行ループにオブザーバーを添付したい、あなたのオブザーバーを持って、通知要求を追加しましたCoreFoundationスタイルのオブジェクトなので、完全に破棄するにはCFRelease()
を使用する必要があります。例えばここでは、フロントウインドウの要素を取得したら、CFRelease(app)
を使用します。これは、アプリケーションが不要になるためです。
ガベージ・コレクションに関する注意:そうのようにそれを宣言し、メンバ変数としてAXUIElementRefを保つために:
__strong AXUIElementRef frontWindow;
これはそれまで、この参照を追跡するために、ガベージコレクタを指示します。それを割り当てるときは、GCと非GCとの互換性のために、次のように使用してください:
frontWindow = (AXUIElementRef) CFMakeCollectable(CFRetain(theElement));
さらなる研究は、「クォーツ表示サービス」を自分のニーズに
興味深い機能がCGRegisterScreenRefreshCallbackされるまでになりました。
- 1. 1つのアプリで別のアプリの設定を変更できますか?
- 2. どのように私のアプリをスピードアップできますか?
- 3. LSUIElementエージェントアプリケーションがコアデータを更新した後、別のアプリにどのように通知できますか?
- 4. 別のアプリDjangoで変更を加えたアプリやユーザーの変更を検出します。
- 5. iOSで他のアプリの通知を変更するアプリを作成することはできますか?
- 6. Xcodeを使ってiPhoneアプリを作るとき、アプリのアイコンをどのように変更しますか?
- 7. 別のポートでIonicアプリをどのように提供できますか?
- 8. 内部アプリからアプリの通知を変更する
- 9. アプリのインストール中に、ユーザーが別のAndroidアプリ(私のアプリが依存する)をインストールするようにするにはどうすればよいですか?
- 10. フォアグラウンドで私のAndroidアプリがどのように検出されますか?
- 11. どのように私は名前が変更されたギアs2にtizenアプリをインストールできますか?
- 12. アプリの言語をリアルタイムでどのように変更しますか?
- 13. Android - 別のアプリを変更することは可能ですか?もしそうなら、どのように?
- 14. どのようにウィンドウユニバーサルアプリケーションのウィンドウで1つのアプリからのグループのすべてのトースト通知を10アクションセンター
- 15. 無料アプリをサブスクリプションベースのアプリに変更することはできますか?
- 16. はどのように私は、タイムラインでFacebookアプリのアイコンを変更することができ
- 17. アプリのデフォルトテーマを別のアプリテーマに変更するにはどうすればよいですか?
- 18. apkpureはどのようにiPhoneアプリを変換しますか?
- 19. G-Suiteマーケットプレイスのアプリはどのようなアプリですか?
- 20. AngularJsアプリは別のウィンドウからlocalStorageの変更を聞くことができません
- 21. iPadアプリでビューのサイズを変更できるようにしますか?
- 22. ウィンドウのxmonadの親をどのように変更できますか?
- 23. エリクシール/フェニックスのアプリは、どのようにWebSocket URIを知っていますか?
- 24. XULウィンドウのタイトルを(JavaScriptから)どのように変更できますか?
- 25. 私のアプリがバックグラウンドのときにアンドロイドアプリのウィンドウの外観をアプリリストで変更するには?
- 26. アプリで受け取ったプッシュ通知とアプリの外部からのプッシュ通知を区別するにはどうすればよいですか?
- 27. 私はどのようにグリッドパネル上をウィンドウできますか?
- 28. は、どのように私はアクションバーをリフレッシュすることができますか?私のアプリの中で
- 29. イオンでは、アプリが通知領域の開け方をどのように検出しますか?
- 30. 私のアプリを別のアプリに開いてその中のボタンをクリックすることはできますか?
非常に不評で興味深い答えです。ありがとう! –
素晴らしい出発点! https://developer.appleのドキュメントを忘れないでください。com/library/mac/documentation/Accessibility/Reference/AccessibilityLowlevel/AccessibilityLowlevel.pdfとサンプルアプリケーションhttps://developer.apple.com/library/mac/#samplecode/iChatStatusFromApplication/Introduction/Intro.html – vinzenzweber
また、UIElementInspectorサンプルプロジェクトは非常に役に立つと思われます。https://developer.apple.com/library/mac/#samplecode/UIElementInspector/Introduction/Intro.html – vinzenzweber