单击外部关闭无边界浮动 NSWindow

Close borderless floating NSWindow on click outside

我想创建一个无边框 window 浮动在主 window 上方。 mainwindow应该是keywindow(我想让它处理键盘鼠标事件)。此外,浮动 window 应该在用户点击它的外部时关闭。基本上,我正在创建一个非常自定义的上下文菜单,就像 NSMenu 一样。它应该表现得一样。

所以我这样创建了 window:

NSWindow *menuWindow = [NSWindow windowWithContentViewController:menuViewController];

menuWindow.styleMask = NSBorderlessWindowMask;
menuWindow.level = NSFloatingWindowLevel;

[menuWindow makeKeyAndOrderFront:self];

效果很好,但我如何处理外部点击以关闭它? window 不会调用委托的 windowDidResignKey,因为它不是密钥 window。如果它确实重载了 canBecomeKeyWindow(所以它 returns 是),那么浮动 window 会获取用户输入,这不是我想要的。

那么,有什么办法可以自动关闭无边框window? NSPanel 有帮助吗?我尝试使用它,但没有成功(becomesKeyOnlyIfNeeded 选择器没有满足我的需要)。

要检测 window 之外但在您的应用内的点击,您可以使用 +[NSEvent addLocalMonitorForEventsMatchingMask:handler:] 安装事件监视器。如果您还想在用户单击其他应用程序时关闭 window,您可以观察 NSApplicationDidResignActiveNotification 通知。

NSWindow 有一个 属性 hidesOnDeactivate 应该可以为您完成此操作。

来自 Apple 文档:

The value of this property is true if the window is removed from the screen when its application is deactivated; false if it remains onscreen. The default value for NSWindow is false; the default value for NSPanel is true.