单击 _statusItem 时执行操作,NSMenu 和 window 不在焦点似乎是不可能的

Performing an action when _statusItem is clicked, with a NSMenu and the window not in focus seems impossible

关于 SO 也有类似的问题,但这有一点不同。

我需要在用户单击位于菜单栏上的我的应用程序图标时触发一个操作。动作是把它的window放到前面,或者换句话说,

  [[[NSApplication sharedApplication] keyWindow] makeKeyAndOrderFront:self];

通常我会这样做:

[_statusItem setTarget:self];
[_statusItem setAction:@selector(bringToFront:)];

但是这个 _statusItem 有一个 NSMenu.

如果我禁用菜单,bringToFront: 会被触发。

所以我想,我会实现NSMenuDelegate方法menuWillOpen

- (void)menuWillOpen:(NSMenu *)menu {
  [[[NSApplication sharedApplication] keyWindow] makeKeyAndOrderFront:self];
}

但是有个问题。如果应用程序 window 是 selected,这将起作用,但假设应用程序是 运行 而我 select safari。然后,我的应用程序 window 不再是焦点,落后于 2000 Safari windows。现在我在菜单栏上单击我的应用程序图标,menuWillOpen 将不会被触发。

如果我想通过单击菜单栏上的应用程序图标来使 window 聚焦,必须使 window 聚焦才能使其工作没有意义。

NSApplication 发布通知以响应您的应用 gaining/resigning 活动状态。处理这些通知和 enable/disable 您的状态项的菜单,以便在您的应用程序处于后台时调用您的操作。