Кто-нибудь использовал класс NSNotificationCenter из Mac API от Delphi?
Что мне нужно, это добавить наблюдателя, который будет уведомлять мое приложение на MacOS, когда компьютер просыпается от сна (или перед тем, как он переходит в спящий режим). Для этого существует метод addObserver
, который регистрирует метод, вызываемый для какого-либо события. В моем случае это событие NSWorkspaceDidWakeNotification .
Код в Swift выглядит примерно так:
func OnWake(notif: NSNotification) {
// Do something ...
}
.....
NSWorkspace.shared().notificationCenter.addObserver(
self, selector: #selector(OnWake(notif:)),
name: Notification.Name.NSWorkspaceDidWake, object: nil)
Я не уверен, как перевести вышеперечисленное в Delphi 10.1. Объявление метода в Macapi.Foundation
равно
procedure addObserver(notificationObserver: Pointer; selector: SEL; name: Pointer; &object: Pointer); cdecl;
Из документов Apple кажется, что последним параметром может быть ноль, но я не знаю, как передать указатель наблюдателя, селектор и имя.
Я сделал несколько попыток, подобных приведенной ниже, но безуспешно. Я либо получаю AV, либо ошибок нет, но уведомления также не принимаются.
Передача имени уведомления как NSString вызывает AV, поэтому ему, очевидно, нужно что-то еще.
Интересно, имеет ли здесь значение указатель Self
, потому что это объект TObject, хотя мне, возможно, придется реализовать ILocalObject
и использовать GetObjectID
для получения указателя объекта ObjectiveC.
procedure TSomeClass.onWake(aNote: NSNotification); cdecl;
begin
// Do something
end;
.....
// Inside another TSomeClass method
NSWorkspace.Wrap(TNSWorkspace.OCClass.sharedWorkspace).notificationCenter.
addObserver(Self, (@onWake), StrToNSStr('NSWorkspaceDidWake'), nil);
Итак, у кого-нибудь есть идея, как реализовать addObserver в Delphi?
Спасибо.