我有一个透明NSWindow
的,无论他走到哪里都跟随用户的屏幕(不管怎样,它都会出现NSWindow
在每个应用程序的前面,甚至是全屏应用程序)。
在那NSWindow
我有一个mouseDown
显示弹出窗口的事件。假设我在全屏模式下使用 safari,并且我的 Window 在它前面,我单击 safari 并再次单击我的 Window:没有任何反应,mouseDown 没有发生。我必须再次单击才能mouseDown
触发事件。
如何强制我始终处于活动状态,这样当我点击后台应用程序并再次点击我的窗口时,
NSWindow
我不必点击 2 次来触发?谢谢!mouseDown
4 回答
我不确定这是否正是您想要的(它不是一个窗口范围的设置),但是,从文档中:
默认情况下,不是关键窗口的窗口中的鼠标按下事件只会将窗口向前移动并使其成为关键窗口;该事件不会发送到
NSView
发生鼠标单击的对象。但是 ,可以通过覆盖returnNSView
来声明初始的鼠标按下事件 。acceptsFirstMouse:
YES
此方法的参数是在非键窗口中发生的鼠标按下事件,视图对象可以检查该事件以确定它是否想要接收鼠标事件并可能成为第一响应者。例如,您希望在影响窗口中选定对象的控件中使用此方法的默认行为。
但是,在某些情况下,覆盖此行为是合适的,例如对于
mouseDown:
即使在窗口处于非活动状态时也应接收消息的控件。支持这种点击行为的控件示例是窗口的标题栏按钮。
或者你可以尝试摆弄
- (void)sendEvent:(NSEvent *)theEvent
看看您是否可以以自定义方式处理事件。
如果您将无边框 NSButton 实例添加到窗口的视图并将您的图像设置为按钮的图像(并作为其备用图像,以使其更漂亮),它将开箱即用:只需将按钮的操作方法连接到您的应用程序委托(或您要处理单击操作的对象)。单击图像(即按钮)将触发按钮的操作方法,无论哪个窗口处于活动状态。
这对我有用,希望对您有所帮助,这将使您的窗口始终位于所有应用程序的顶部
[self.window makeKeyAndOrderFront:nil];
[self.window setLevel:NSStatusWindowLevel];
我认为你真正应该做的是使用一个 NSPanel(一个浮动调色板——一种特殊的 NSWindow),它会以一种与操作系统一致的方式完全按照你的意愿去做,而不是试图对抗预期的行为。
这是 NSPanel 文档:
这里有一些有用且精辟的信息:
http://cocoadev.com/wiki/NSPanel
默认情况下,当应用程序处于非活动状态时,NSPanel 会消失,但您可以将其关闭。
我很抱歉没有更全面地展示它……时间紧迫。
编辑:
请注意,您可能可以简单地让您的窗口按需要运行:
“NSView 可以声明一个初始的鼠标按下事件,但是,通过覆盖acceptFirstMouse: 来返回YES。”
您需要对任何 NSView 子类执行此操作以跳过“激活单击”。