Получение номера окна через OSX Accessibility API

Я работаю над приложением, которое перемещает окна сторонних приложений по экрану.

Чтобы получить обзор всех открытых в данный момент окон, я использую

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?

22
задан 0x90 30 May 2011 в 16:52
поделиться