2012-06-06 32 views
5

我有一个透明的NSWindow,它随处可见用户的屏幕(NSWindow停留在每个应用程序前面,不管是甚么全屏应用程序)。
在那NSWindow我有一个mouseDown事件,显示一个弹出。假设我在全屏模式下进行Safari浏览,并在其前面有我的窗口,我点击Safari浏览器,然后再次点击我的窗口:没有任何反应,mouseDown不会发生。我必须再次点击才能触发mouseDown事件。
我如何强制我的NSWindow始终处于活动状态,因此我不必点击它2次即可触发mouseDown当我点击一个后台应用程序并再次单击我的窗口时?
谢谢!如何强制NSWindow始终保持主动/专注?

+0

能否请您阐述一下你的窗口的透明度:它不是完全透明的,是它? – Tim

+0

与图像 –

回答

2

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

+0

谢谢!那只是我想要的方式!这么简单,我没有注意到。 –

2

我不知道这是否是你想要的东西(它不是相当的窗口范围的设置),但是,从documentation

默认情况下,在一个窗口中的鼠标按下事件不是关键窗口 只是把窗口向前并使其成为关键;该事件不是 发送到发生鼠标点击的对象NSViewNSView可以声明一个初始的鼠标按下事件,但是,通过覆盖 acceptsFirstMouse:返回YES

该方法的参数是发生在非键窗口,其中该视图 对象可以检查以确定其是否想要接收鼠标事件 和潜在的成为第一响应的 鼠标按下事件。例如,您希望此方法的默认行为为 ,例如,影响窗口中所选对象的控件。

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

或者你可以尝试用

- (void)sendEvent:(NSEvent *)theEvent 

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

+0

我做了文档中的一些研究,但我无法找到任何工作完全透明:/ –

+0

你尝试做-acceptsFirstMouse:回报是?这将使控件立即可用于您的窗口,即使它不是关键,这听起来像你想要的。 – Vervious

+0

不行,不按我想要的方式工作。我希望窗口始终处于活动/关注的状态。 –

-2

我觉得你真正应该做的是使用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子类来跳过“点击激活”来做到这一点。

+0

它的行为与nswindow类似。点击背景窗口后,我必须触摸它2次才能聚焦:/ –

+0

这是您必须覆盖的默认行为。如果您查看系统字符查看器(NSPanel),它会接受第一次点击并保留在前面。请参阅文档:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html – podperson

1

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

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