如何强迫NSWindow始终保持活跃/专注?

时间:2012-06-06 17:35:49

标签: objective-c xcode macos cocoa nswindow

我有一个透明的NSWindow跟随用户的屏幕到达每个应用程序的前面(NSWindow停留在每个应用程序前面,无论是什么,甚至是全屏应用程序。)
NSWindow我有一个显示弹出窗口的mouseDown事件。假设我在全屏模式下进行safari,我在它前面有我的窗口,我点击safari然后再次点击我的窗口:没有任何反应,mouseDown不会发生。我必须再次点击,以便触发mouseDown事件 如何强制我的NSWindow始终处于活动状态,因此当我点击后台应用并再次点击我的窗口时,我不必点击它2x来触发mouseDown
谢谢!

4 个答案:

答案 0 :(得分:2)

我不确定这是否正是你想要的(它不是一个窗口宽度设置),但是,来自documentation

  

默认情况下,窗口中的鼠标按下事件不是关键窗口   只需将窗户向前移动并使其成为关键;事件不是   发送到发生鼠标单击的NSView对象。该   但是,NSView可以通过覆盖来声明初始鼠标按下事件   acceptsFirstMouse:返回YES

     

这种方法的论点是   发生在非键窗口中的鼠标按下事件,即视图   对象可以检查以确定是否要接收鼠标   事件并可能成为第一响应者。你想要默认   此方法的行为,例如,影响该方法的控件   窗口中选定的对象。

     

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

或者你可以尝试摆弄

- (void)sendEvent:(NSEvent *)theEvent

并查看您是否可以自定义方式处理事件。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:-2)

我认为你真正应该做的是使用一个NSPanel(一个浮动的调色板 - 一种特殊的NSWindow),它将以与操作系统一致的方式完成你想要的,而不是试图打击预期的行为。 / p>

以下是NSPanel文档:

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

这里有一些有用且简洁的信息:

http://cocoadev.com/wiki/NSPanel

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

我很抱歉没有更充分地解决这个问题......时间紧迫。

编辑:

请注意,您可以简单地让窗口按照需要运行:

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

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

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