Получение уникального идентификатора окна другого приложения

Я новичок в разработке Cocoa и разрабатываю свое первое приложение. Я хочу прочитать уникальный идентификатор из любого окна любого приложения - будь то Cocoa или Carbon. Приложения какао делают свои идентификаторы окон доступными для AppleScript (хотя я уверен, что есть гораздо лучший способ сделать это с помощью правильного маршрута Objective C), но я пытаюсь получить доступ к идентификаторам окон из документов в приложениях Adobe. Кажется, это намного сложнее. Все, что я могу найти в справочных библиотеках, это HIWindowGetCGWindowID:

"Эта функция возвращает идентификатор окна, назначенный сервером окон при создании окна. Идентификатор окна обычно не используется с какой-либо другой функцией Carbon, но может использоваться с другими функциями Mac OS X, которые требуют идентификатора окна, например, с функциями в OpenGL ".

Можно ли использовать это для получения идентификатора из моей программы? Или это просто функция, которую можно использовать в одном приложении?

Если бы кто-то мог указать мне правильное направление, я был бы бесконечно благодарен.


person John Gallagher    schedule 23.11.2008    source источник
comment
Что именно вы хотите сделать с полученным идентификатором окна?   -  person Jason Coco    schedule 23.11.2008
comment
Я делаю приложение для учета рабочего времени и хочу получить активный путь к документу. Получение идентификатора активного окна означает, что я могу отслеживать время для несохраненных документов и означает, что у меня есть уникальный идентификатор, когда файл удаляется или переименовывается.   -  person John Gallagher    schedule 24.11.2008


Ответы (1)


Функция HIWindowGetCGWindowID() может возвращать CGWindowID только для одного из окон вашего приложения, поскольку WindowRef из другой программы не будет действительным в вашем.

Функция CGWindowListCopyWindowInfo() из CGWindow.h вернет массив словарей, по одному для каждого окна, которое соответствует заданным вами критериям, в том числе в других приложениях. Он позволяет фильтровать только окна над данным окном, окна под данным окном и «экранные» окна, но возвращаемый словарь включает идентификатор процесса для приложения-владельца, который вы можете использовать для сопоставления окна с приложением. В каждом возвращаемом словаре клавиша kCGWindowNumber будет указывать на идентификатор окна как CFNumber. Также существует функция CGWindowListCreate(), которая возвращает только массив из CGWindowIDs. По сути, документации для этих функций нет, кроме заголовка CGWindow.h и Son of Grab пример кода. Кроме того, это всего лишь 10,5.

person Boaz Stuller    schedule 23.11.2008
comment
Фантастика. Большое спасибо, Вооз! Правила переполнения стека. - person John Gallagher; 24.11.2008