#objective-c #swift #macos #cocoa
#objective-c #swift #macos #какао
Вопрос:
Я хочу, чтобы наблюдатель NSWindow.didEnterFullScreenNotification
глобально запускался всеми приложениями. Как это сделать?
Справочная информация
Я отмечаю приложение безопасности водяных знаков, но оно не работает, когда какое-либо приложение переходит в полноэкранный режим, и оно работает, когда другое приложение выходит из полноэкранного режима, поэтому мои решения следующие:
- Наблюдатель
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")
}
- Пусть это приложение с водяными знаками всегда находится перед другими окнами. Но есть ли какой-либо способ добиться этого?
3.NSEvent.addGlobalMonitorForEvents
похоже, что там есть свойство window, но все еще не знаю, что делать - Я приложил скриншот для ваших ссылок, это мое приложение с водяными знаками.
Комментарии:
1. пробовали с
NSNotificationCenter addObserver
?2. Спасибо, что я попробовал, NSNotificationCenter addObserver может наблюдать только в моем приложении
Ответ №1:
Единственные уведомления, которые вы можете наблюдать «глобально», — это уведомления, отправленные в NSDistributedNotificationCenter. Все обычные уведомления, которые вы видите в API Cocoa, отправляются только во внутренний / «локальный» центр уведомлений приложения.
Вы можете увидеть, какие глобальные уведомления публикуются, добавив наблюдателя и передав nil
его имя и объект. Затем вы можете зарегистрировать название полученных уведомлений. Единственное уведомление, которое срабатывает, когда окно выходит на весь экран NSWorkspaceActiveSpaceDidChangeNotification
, но это просто означает, что пространство изменилось; нет способа узнать, что это произошло из-за того, что окно стало полноэкранным.