【问题标题】:How to force an NSWindow to be always active/focused?如何强制 NSWindow 始终处于活动/集中状态?
【发布时间】:2012-06-10 18:21:06
【问题描述】:

我有一个透明的NSWindow,无论用户走到哪里,它都会跟随用户的屏幕(NSWindow 始终位于每个应用程序的前面,无论如何,甚至是全屏应用程序)。
在那个NSWindow 我有一个mouseDown 事件显示一个弹出窗口。假设我在全屏模式下使用 safari,并且我的 Window 在它前面,我单击 safari 并再次单击我的 Window:没有任何反应,mouseDown 没有发生。我必须再次单击才能触发mouseDown 事件。
如何强制我的NSWindow 始终处于活动状态,这样当我点击后台应用程序并再次点击我的窗口时,我不必点击它两次来触发mouseDown
谢谢!

【问题讨论】:

  • 能否详细说明您的窗口的透明度:它不是完全透明的,是吗?
  • 图片完全透明

标签: objective-c xcode macos cocoa nswindow


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢!这正是我想要的方式!这么简单,我没注意到。
    【解决方案3】:

    我认为您真正应该做的是使用 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 可以声明一个初始的鼠标按下事件,但是,通过覆盖acceptFirstMouse: 来返回YES。”

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

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

    【讨论】:

    • 它的行为类似于 nswindow。单击背景窗口后,我必须触摸它 2 次才能获得焦点:/
    • 这是您必须覆盖的默认行为。如果您查看系统字符查看器——一个 NSPanel——它会接受第一次点击并停留在前面。在此处查看文档:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
    【解决方案4】:

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

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

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

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

    或者你可以尝试摆弄

    - (void)sendEvent:(NSEvent *)theEvent
    

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

    【讨论】:

    • 我在文档中做了一些研究,但我找不到任何有用的东西:/
    • 您是否尝试过制作 -acceptsFirstMouse:返回 YES?这将使控件立即在您的窗口中可用,即使它不是关键,这听起来像您想要的。
    • 不,没有按照我想要的方式工作。我希望窗口始终处于活动状态/焦点。
    • 这在 OSX 中是不可能的;您一次只能有一个窗口作为关键窗口;最好的办法是复制行为,这也很困难。
    • 我不知道修补 -(void)sendEvent 是否可行,但这是我的第一个猜测。这样你也许可以直接拦截鼠标事件,让我知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多