Objective c 如何强制NSWindow始终处于活动/聚焦状态?

Objective c 如何强制NSWindow始终处于活动/聚焦状态?,objective-c,xcode,macos,cocoa,nswindow,Objective C,Xcode,Macos,Cocoa,Nswindow,我有一个透明的NSWindow,无论用户走到哪里,它都会跟随用户的屏幕(无论发生什么情况,NSWindow都会出现在每个应用程序的前面,甚至是全屏应用程序)。 在NSWindow中,我有一个显示弹出窗口的mouseDown事件。假设我在全屏模式下使用safari,我的窗口就在它前面,我点击safari,然后再次点击我的窗口:什么都没有发生,鼠标向下移动也没有发生。我必须再次单击以触发mouseDown事件。 如何强制我的NSWindow始终处于活动状态,这样当我单击后台应用程序并再次单击我的窗口

我有一个透明的
NSWindow
,无论用户走到哪里,它都会跟随用户的屏幕(无论发生什么情况,
NSWindow
都会出现在每个应用程序的前面,甚至是全屏应用程序)。
NSWindow
中,我有一个显示弹出窗口的
mouseDown
事件。假设我在全屏模式下使用safari,我的窗口就在它前面,我点击safari,然后再次点击我的窗口:什么都没有发生,鼠标向下移动也没有发生。我必须再次单击以触发
mouseDown
事件。
如何强制我的
NSWindow
始终处于活动状态,这样当我单击后台应用程序并再次单击我的窗口时,我就不必单击它2次来触发
mouseDown


谢谢大家!

我不确定这是否正是您想要的(这不是一个窗口范围内的设置),但是,从:

默认情况下,非关键点窗口中的鼠标按下事件 只需向前打开窗口并使其成为关键点;这一事件并非如此 发送到鼠标单击的
NSView
对象。这个
NSView
可以通过覆盖
acceptsFirstMouse:
返回
YES

此方法的参数是 在非关键点窗口中发生的鼠标悬停事件,该事件将 对象可以检查以确定是否要接收鼠标 事件,并可能成为第一响应者。您想要默认值 例如,此方法在影响 窗口中的选定对象

然而,在某些情况下,它是 适用于重写此行为,例如用于 即使窗口处于非活动状态,也应接收
mouseDown:
消息。 支持此点击行为的控件示例如下 窗口的标题栏按钮

或者你可以试着摆弄一下

- (void)sendEvent:(NSEvent *)theEvent

看看你是否可以用一种定制的方式处理事件。

我认为你真正应该做的是使用一个NSPanel(一种浮动调色板——一种特殊的NSWindow),它将以一种与操作系统一致的方式来做你想做的事情,而不是试图对抗预期的行为

以下是NSPanel文档:

以下是一些有用且精辟的信息:

默认情况下,当应用程序处于非活动状态时,NSPanel将消失,但您可以将其关闭

我很抱歉没有把它说得更详细。。。时间紧迫

编辑:

请注意,您可能只需执行以下操作即可使窗口按所需运行:

但是,NSView可以通过覆盖acceptsFirstMouse:以返回YES来声明初始鼠标按下事件


您需要对任何NSView子类执行此操作,以跳过“激活单击”。

如果您将无边界NSButton实例添加到窗口的视图中,并将图像设置为按钮的图像(并将其设置为备用图像,以使其更漂亮),则它将开箱即用:只需将按钮的操作方法连接到应用程序代理(或您要处理单击操作的对象)。单击图像(即按钮)将触发按钮的操作方法,无论哪个窗口处于活动状态。

这对我很有效,希望这会有所帮助,这将使您的窗口始终位于所有应用程序之上

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

我在文档中做了一些研究,但是我找不到任何有效的方法:/你是否尝试过制作-acceptsFirstMouse:返回是的?这将使控件在你的窗口中立即可用,即使它不是键,这听起来像你想要的。不,不是我想要的方式。我希望窗口始终处于活动/聚焦状态。Th在OSX中,at本质上是不可能的;一次只能有一个窗口作为关键窗口;最好的办法是复制该行为,这也很困难。我不知道是否修补-(void)sendEvent可以工作,但这是我的第一个猜测。通过这种方式,您可以直接截获鼠标事件,让我知道。它的行为类似于nswindow。我必须触摸它两次,才能在单击背景窗口后聚焦:/这是您必须覆盖的默认行为。如果您查看系统字符查看器--NSPanel--我t接受第一次点击并停留在前面。请看这里的文档:你能详细说明一下你的窗口的透明度吗:它不是完全透明的,是吗?图像完全透明谢谢!这正是我想要的方式!太简单了,我没有注意到。