2015-08-08 1 views
3

Исполнив список всех окон (в г порядке спереди назад я думаю/надеюсь) с помощью CGWindowListCopyWindowInfo но я имею вопрос с получением в NSWindow* от него, так что я могу использовать с orderFront: и т.д.Получить NSWindow * от CGWindowListCopyWindowInfo

Кажется, я даже не получаю от него CGWindowID.

Это мой код, это js-ctypes.

var cfarr_win = ostypes.API('CGWindowListCopyWindowInfo')(ostypes.CONST.kCGWindowListOptionAll | ostypes.CONST.kCGWindowListExcludeDesktopElements, ostypes.CONST.kCGNullWindowID); 

var cnt_win = ostypes.API('CFArrayGetCount')(cfarr_win); 

for (var i = 0; i < cnt_win; i++) { 
    var thisWin = {}; 
    // trying to get NSWindow* to the window here, so i can use with orderFront: etc 

    // example on how i get pid: 
    var rez_pid = ostypes.API('objc_msgSend')(c_win, ostypes.HELPER.sel('objectForKey:'), myNSStrings.get('kCGWindowOwnerPID')); 
    var int_pid = ostypes.API('objc_msgSend')(rez_pid, ostypes.HELPER.sel('integerValue')); 
    thisWin.pid = int_pid; 

    // please help me on how to get NSWindow* 

} 

PS: Даже если я использую исключение рабочего стола элементов флага Я все еще получают настольные элементы, такие как курсор и док-станцию, любой шанс, если Отвечающим может пролить некоторый свет на то, как исправить это тоже, что было бы удивительным!

+1

Во-первых, вы можете использовать 'NSWindow' для окон приложения, в котором работает код. Что вы на самом деле пытаетесь сделать? В каких окнах вы пытаетесь заказать фронт и почему? Если вы работаете с собственными окнами приложения, вы можете использовать '[NSWindow windowNumbersWithOptions: 0]', чтобы получить номера окон Cocoa и '[NSApp windowWithWindowNumber: someWindowNumber]', чтобы получить 'NSWindow * '. –

+0

Aw drats @KenThomases благодарит за то, что вы всегда смотрите. У меня есть две потребности в двух разных аддонах. (1) Я создал вещь, в которой перечислены все окна для Windows, Linux/Unix и OSX. Тогда люди могут выбрать, какой из них они хотят остаться «Всегда на вершине». (2) И затем в другом приложении я пытаюсь сфокусировать последнее окно PID, поэтому я пересекаю окна в порядке z, и первый, который подходит к этому PID, я хочу сфокусировать его. Для этого второго случая мой единственный вариант, чтобы получить номер окна с этим методом, а затем использовать скрипт Apple? У меня нет резервных идей для первой необходимости :( – Noitidart

+0

(3) Моя третья потребность, которая была для моего аддона экрана, заключалась в том, чтобы получить границы всех окон, для функции «Window Wand», используя это, а затем щелкнув по окну на скриншоте выбирает его, я смог справиться с этим. – Noitidart

ответ

5

Ключ, который вы должны использовать для получения идентификаторов окна, - kCGWindowNumber.

И получить NSWindow из номера окна, you could use [NSApp windowWithWindowNumber:windowNumber].

К сожалению, это будет работать только для окон, которые принадлежат вашему приложению, а не для других приложений.

Кроме того, если вы действительно хотите использовать NSWindow, как только вы получите идентификатор окна для других окон приложения, это плохое предположение: not all CGWindows are NSWindows. И вне этого вызова Apple не предоставляет способ получить от CGWindow до NSWindow. Чтобы работать с окнами других приложений (при условии, что другое приложение является совместным), вам придется придерживаться работы с объектами CGWindow.

+0

Aw drats thanks @ Майкл. Вы знаете, как сделать окно «всегда сверху» с CGWindowID? :(Вы случайно знаете, как включены элементы рабочего стола, даже если я их вычеркнул? – Noitidart

+0

Окно, которое принадлежит вашему приложению/процессу или какое-то другое окно приложения? –

+0

Для того, чтобы всегда было на самом деле не только мое собственное приложение, Я сделал аддон для Firefox, в котором перечислены все (а не только мое приложение /, которое является firefox) для Windows, Linux/Unix и OSX. В Windows и Linux/Unix они могут отмечать окно, и оно установит его всегда был на высоте отлично, но OSX меня заводила, так как только способ, которым я знаю, как сделать сверху, - это получить NSWindow, а затем setLevel для плавающего типа. – Noitidart

Смежные вопросы