Я работаю над приложением, которое перемещает окна сторонних приложений по экрану.
Чтобы получить обзор всех открытых в данный момент окон, я использую
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?