я думал это уведомление когда просто мышка наезжает на менюбар
повесить (пример):
Objective-C
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myHandler:) name:NSMenuDidBeginTrackingNotification object:nil];
...
- (void)myHandler:(NSNotification *)notification
{
}
селектор — обжсшный указатель на метод (типа SEL) грубо говоря (хотя вроде @selector() преобразовывает метод в некую особую строку...), но не знаю прокатит ли это в С++-классе; self — аналог this; object указан нулевым, что означает, что ловиться будет уведомление от любого объекта, который постит данное уведомление (в данном случае постит его лишь единственный экземпляр менюшки, поэтому можно и нил указать; если там указывать конкретный объект, то ловиться уведомления будут только от него). Когда обсервер удаляется, необходимо сделать
Objective-C
[[NSNotificationCenter defaultCenter] removeObserver:self name:name:NSMenuDidBeginTrackingNotification object:nil];
чтобы не заработать краш при посылке уведомления на мертвый объект.
решение через блок (должно работать и в С++-классе):
Objective-C
id<NSObject> observer = [[NSNotificationCenter defaultCenter] addObserverForName:NSMenuDidBeginTrackingNotification object:nil queue:nil usingBlock:(void (^)(NSNotification *note)) {
// handler code
}];
// save the returned value `observer`
queue — объект типа NSOperationQueue (поток грубо говоря), в котором будет исполняться блок: nil означает, что блок будет выполняться в текущем потоке. Потом в деструкторе текущего класса надо отписаться от уведомления:
Objective-C
[[NSNotificationCenter defaultCenter] removeObserver:observer]; // `observer` that was saved before
отсеять попапки (интересен только main bar)
отсеять - вероятно по
highlightedItem