画面上でサードパーティ製アプリケーションのウィンドウを移動するアプリケーションに取り組んでいます。
現在開いているすべてのウィンドウの概要を取得するには、次を使用します
CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
これは、開いているすべてのウィンドウを定義する辞書の配列を返します。返される辞書の例を次に示します。
{
kCGWindowAlpha = 1;
kCGWindowBounds = {
Height = 442;
Width = 475;
X = 3123;
Y = "-118";
};
kCGWindowIsOnscreen = 1;
kCGWindowLayer = 0;
kCGWindowMemoryUsage = 907184;
kCGWindowName = Untitled;
kCGWindowNumber = 7328;
kCGWindowOwnerName = TextEdit;
kCGWindowOwnerPID = 20706;
kCGWindowSharingState = 1;
kCGWindowStoreType = 2;
kCGWindowWorkspace = 3;
},
ディクショナリには、他の場所で使用される優れた情報が満載ですが、ウィンドウの位置を変更するために使用できるアクセシビリティ オブジェクトがありません。ウィンドウは、ウィンドウ番号によって明確に識別されます。
現在、PID (kCGWindowOwnerPID) を使用して、ウィンドウのアプリケーションのアクセシビリティ オブジェクトを作成しています。
AXUIElementRef app = AXUIElementCreateApplication(pid);
次に、AXUIElementCopyAttributeValues を使用して、アプリケーションが開いたすべてのウィンドウのリストを取得します。
NSArray *result;
AXUIElementCopyAttributeValues(
(AXUIElementRef) app,
kAXWindowsAttribute,
0,
99999,
(CFArrayRef *) &result
);
これは機能し、AXUIElements の配列を返します。これは私が立ち往生しているところです。アクセシビリティ オブジェクトのウィンドウ番号を取得するための API 呼び出しはないようです。いずれかの方法はありますか
a) アクセシビリティ オブジェクトのウィンドウ番号を検索します (最終的に配列を反復処理して、適切なウィンドウを見つけます)。
また
b) それ以外の場合、CGWindowListCopyWindowInfo によって返される配列に記述されたウィンドウが、AXUIElementCopyAttributeValues によって返されるアクセシビリティ オブジェクトに明確に一致しますか?