为啥我的 NSWindow 第一次只接收 mouseOver 事件?

Posted

技术标签:

【中文标题】为啥我的 NSWindow 第一次只接收 mouseOver 事件?【英文标题】:Why does my NSWindow only receive mouseOver events the first time?为什么我的 NSWindow 第一次只接收 mouseOver 事件? 【发布时间】:2010-05-17 00:19:21 【问题描述】:

我有一个应用程序,其中使用 orderOut 和 orderFront 显示和隐藏无边框窗口。当它可见时,我希望它在鼠标移到它上面时成为关键窗口。 到目前为止,我已经这样做了:

在 awakeFromNib 中,我已将其第一响应者设置为自身。 在窗口的构造函数中,我将接受鼠标事件设置为 YES。 在 mouseMoved 方法中,我使用 makeKeyAndOrderToFront。

我的问题是,这只在我第一次将鼠标移到窗口上时才有效。 之后,它不会收到任何 mouseOver 事件。 我试过检查 firstResponder 但据我所知它永远不会从窗口改变。

任何想法我可以做些什么来让它工作?

【问题讨论】:

【参考方案1】:

如果您想接收mouseMoved 事件,您需要添加tracking area(我假设这就是您的意思,因为Cocoa 没有mouseOver 事件之类的东西)。

我编写了一个名为 Shroud 的小应用程序,它做了类似的事情 - 它隐藏了一个无边框窗口,当您将鼠标移到菜单栏上时它会覆盖菜单栏。 code 很简单,作为示例可能很有用。

【讨论】:

【参考方案2】:

这是在@NicholasRiley的answer的帮助下编写的示例:

NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:[self.view frame] options:NSTrackingMouseEnteredAndExited | NSTrackingInVisibleRect | NSTrackingActiveAlways owner:self userInfo:nil];
[self.view addTrackingArea:area];

-(void)mouseEntered:(NSEvent *)theEvent 
    NSLog(@"mouseEntered");


-(void)mouseExited:(NSEvent *)theEvent 
    NSLog(@"mouseExited");

【讨论】:

以上是关于为啥我的 NSWindow 第一次只接收 mouseOver 事件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥设置约束后不能再调整 NSWindow 的大小?

为啥添加约束会消除调整 NSWindow 大小的能力?

PCL:NSWindow 拖动区域应该只在主线程上无效

为啥这个简单的 NSWindow 创建代码会在 ARC 下关闭时触发自动释放池崩溃?

mouse without borders为啥老连接不上?

窗口NSWindow