如何强制一个NSWindow是始终主动/集中?(How to force an NSWindow t

2019-09-17 19:55发布

我有一个透明的NSWindow跟随用户的屏幕随处可见他去(在NSWindow停留在每一个应用程序的前面,不管是什么,甚至全屏应用程序)。
NSWindow我有一个mouseDown事件,显示一个弹出窗口。 比方说,我是在全屏模式下Safari和我有我在它前面的窗口,我点击Safari和我在我的窗口再次点击:没有任何反应,也不会发生鼠标按下。 我有这样的再次点击mouseDown事件被触发。
我怎么能强迫我NSWindow是始终处于活动状态,所以我不必点击2倍触发mouseDown当我在后台的应用程序单击,然后再次单击在我的窗口?
谢谢!

Answer 1:

如果添加了一个无国界的NSButton实例添加到窗口查看和设置您的图像作为按钮的图像(作为其替代图像,使其更漂亮),它会工作开箱即用:只要在按钮的操作方法连接到您的应用程序委托(或您要处理的点击操作的对象)。 然后将图像(如按钮)上的点击将触发按钮的操作方法,无论哪个窗口是活动的。



Answer 2:

我不知道这是否是你想要什么(这不是一个相当宽的窗口设置),但是,从文档 :

默认情况下,在一个窗口中的鼠标按下事件不是关键窗口只需将窗口前并使其关键; 该事件不被发送到NSView在其上单击鼠标时对象。 所述NSView ,可以根据权利要求的初始鼠标按下事件,但是通过重写acceptsFirstMouse:返回YES

该方法的参数是发生在非关键窗口,该窗口视图对象可以检查以确定其是否想要接收鼠标事件和可能成为第一响应鼠标按下事件。 你要这个方法的默认行为,例如,影响在窗口中选择目标的控制。

然而,在某些情况下,它是适当的覆盖此行为,如应接收控制mouseDown:即使消息时窗口是无效的。 的支持此点击行为控制的例子是一个窗口的标题栏按钮。

或者你可以尝试乱搞

- (void)sendEvent:(NSEvent *)theEvent

看看你是否可以在自定义的方式处理事件。



Answer 3:

这为我工作,希望会有所帮助,这将始终保持你的窗口上方的所有应用程序

[self.window makeKeyAndOrderFront:nil];
[self.window setLevel:NSStatusWindowLevel];


Answer 4:

我觉得你真正应该做的是使用NSPanel(浮动面板 - 一种特殊的NSWindow的),将做的正是你的方式,与操作系统保持一致,而不是试图对抗预期行为想要什么。

这里的NSPanel文档:

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nspanel_Class/Reference/Reference.html

下面是一些有用而有力的信息:

http://cocoadev.com/wiki/NSPanel

默认情况下,NSPanel会当应用程序处于非活动状态消失,但你可以关闭这个功能。

我不更充分地铺设出来道歉......时间紧迫。

编辑:

请注意,您可以可能得到表现你的窗口根据需要简单地:

“时,可以的NSView权利要求的初始鼠标按下事件,但是通过重写acceptsFirstMouse:返回YES”。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html

你需要任何的NSView子类来跳过“点击激活”来做到这一点。



文章来源: How to force an NSWindow to be always active/focused?