Как наблюдать за didEnterFullScreenNotification глобально?

#objective-c #swift #macos #cocoa

#objective-c #swift #macos #какао

Вопрос:

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

Справочная информация

Я отмечаю приложение безопасности водяных знаков, но оно не работает, когда какое-либо приложение переходит в полноэкранный режим, и оно работает, когда другое приложение выходит из полноэкранного режима, поэтому мои решения следующие:

  1. Наблюдатель NSWindow.didEnterFullScreenNotification глобально, если я получаю какое-либо уведомление, я отправляю данные на сервер.
 // NotificationCenter.default.addObserver Can only observe within my watermark app
 NotificationCenter.default.addObserver(forName: NSWindow.didEnterFullScreenNotification, object: nil, queue: .main) { (noti) in
  print("didEnterFullScreenNotification")

 }
 
  1. Пусть это приложение с водяными знаками всегда находится перед другими окнами. Но есть ли какой-либо способ добиться этого?
    3. NSEvent.addGlobalMonitorForEvents похоже, что там есть свойство window, но все еще не знаю, что делать
  2. Я приложил скриншот для ваших ссылок, это мое приложение с водяными знаками.

Комментарии:

1. пробовали с NSNotificationCenter addObserver ?

2. Спасибо, что я попробовал, NSNotificationCenter addObserver может наблюдать только в моем приложении

Ответ №1:

Единственные уведомления, которые вы можете наблюдать «глобально», — это уведомления, отправленные в NSDistributedNotificationCenter. Все обычные уведомления, которые вы видите в API Cocoa, отправляются только во внутренний / «локальный» центр уведомлений приложения.

Вы можете увидеть, какие глобальные уведомления публикуются, добавив наблюдателя и передав nil его имя и объект. Затем вы можете зарегистрировать название полученных уведомлений. Единственное уведомление, которое срабатывает, когда окно выходит на весь экран NSWorkspaceActiveSpaceDidChangeNotification , но это просто означает, что пространство изменилось; нет способа узнать, что это произошло из-за того, что окно стало полноэкранным.