Какао доступность API и пробелы? - PullRequest
3 голосов
/ 19 января 2010

У меня проблема с приложением, которое я пишу (http://code.google.com/p/blazingstars/issues/detail?id=25),), где моя программа представляет собой приложение в виде меню (строки меню), которое использует API-интерфейс Accessibility для взаимодействия с другой программой и управления ею.обычные вещи, такие как регистрация для уведомлений API и получение списка окон через вызовы API и т. д., но некоторое время назад я понял, что если моя программа запускается во втором пространстве (виртуальном рабочем столе) после запуска программы, с которой я взаимодействуюво-первых, моя программа падает и горит, потому что она не может получить доступ к какой-либо информации о своей цели. (Есть ли способ обойти эту проблему, которую я пропускаю?)

Простым решением было бы всплывающее окнодиалоговое окно с просьбой перезапустить программу в правильном пространстве, но я не могу понять, как определить, в каком пространстве находится моя цель, с помощью NSWorkspace или API доступа, чтобы сравнить ее спространство, в котором я нахожусь. Есть идеи?

Обратите внимание, что установка поведения коллекции в NSWindowCollectionBehaviorCanJoinAllSpaces не принесет мне никакой пользы, потому что я должен выполнить кучу работы при запуске, поэтому я должен быть в том же пространстве, что и моя цель с самого начала.

Ответы [ 2 ]

4 голосов
/ 21 января 2010

Я думаю, вы можете сделать это с помощью API в CGWindow.h..
В частности см. CGWindowListCopyWindowInfo() и kCGWindowWorkspace.

Я использовал эти API для выполнения любых задач, таких как получение содержимого окна, оконных рам и т. Д.

Если это не сработает, вы можете попробовать этот закрытый API:

 extern CGSError CGSGetWindowWorkspace(const CGSConnectionID cid,
                                       CGSWindowID wid,
                                       CGSWorkspaceID *workspace);

Хитрость заключается в получении идентификатора соединения целевого процесса.

0 голосов
/ 19 января 2010

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

В Leopard нет простого способа сделать это, потому что нет официальных уведомлений о "изменении пространства", но пост в блоге и комментарии к этой странице могут помочь.

...