2

プログラムで解決したい次の(小さな)問題があります。ラップトップからセカンダリ モニターのプラグを抜くたびに、すべてのウィンドウが移動して、現在は小さい解像度で表示されます。外付けモニターを再び接続したら、手動でウィンドウを正しい位置に戻す必要があります。私は毎朝それをしなければなりません(ため息)。

ここで、開いているすべてのウィンドウの位置を保存し、それらの位置を復元したいときに再配置できる単純なコマンド ライン プログラムを作成することにしました。

Accessibility API を使用することで、問題なく機能することができました。この API を使用すると、プロセス空間の一部ではないウィンドウを制御できます。ただし、問題があります。プログラムは、現在のスペースにあるウィンドウしか表示できません(ここでは、OSX Spaces 機能について話しています)。

つまり、ウィンドウの位置を保存するためにプログラムを実行すると、現在いるスペース内のウィンドウの位置のみを保存できます。

私のプログラムに関する詳細:

  • 実行中のすべてのプロセスをループして、それらの PID を取得します。
  • これらの PID からアプリケーション要素を作成します ( AXUIElementCreateApplication)
  • このアプリケーションに関連付けられたウィンドウとその位置を取得します

アプリケーション要素からウィンドウ要素を取得するAXUIElementCopyAttributeValuesと、現在のスペースのウィンドウのみが返されます。

さて、ウィンドウを (異なる空間で) 制御する方法はありますか? そうでない場合は、すべてのウィンドウを取得するためにプログラムでスペースを変更してもかまいませんが、それは可能ではないようです。

どんな助けでも大歓迎です!

4

2 に答える 2

1

スペースを切り替える文書化された方法を知りません。

おそらくCGSPrivate.hが必要です-CGSSetWorkspaceその他。これらの関数は SPI であり、10.6.x リリースでも警告なしに壊れる可能性があることに注意してください。

于 2010-04-21T01:13:25.493 に答える
1

プライベート API の使用を避けたい場合は、Mission Control にさまざまなスペースに移動するためのキーボード ショートカットがあり、プログラムでキー コードを送信してアクティブにすることができるという事実を利用できます。Amethystと呼ばれるタイリング ウィンドウ マネージャーについて、ブログ記事 ( http://ianyh.com/blog/2013/06/05/accessibility/ )を書きました。で。-[AMWindow moveToSpace:]

短いバージョンのスペースへの移動は、デフォルトctrl + arrow keyを使用して隣接するスペースに移動するようなものです。

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すべてのスペースを走査し、ウィンドウ データを収集できます。

また、潜在的に興味深い点として、アクセシビリティ API は実際にはすべてのスペースに同時にウィンドウを表示できますが、API を利用するプロセスが開始されてから移動したスペースのウィンドウのみを表示します。なぜそうなるのかはわかりませんが、そのようです。

于 2013-08-19T23:27:43.290 に答える