NSView未检测到鼠标移动事件

时间:2010-12-13 09:25:38

标签: cocoa macos

我正在尝试制作一个简单的应用程序,其中有一个空的红色矩形,每当鼠标移动到矩形的上半部分边框时,光标将变为闭合的手。

我开始选择基础命令行项目。创建一个透明的NSWindow并在其中嵌入NSView矩形,制作窗口以接受鼠标移动事件(方法:{{1} })。我已覆盖-setAcceptsMouseMovedEvents-canBecomeKeyWindow窗口以返回YES。但不知怎的,-canBecomeMainWindow没有收到-mouseMoved个事件。

当我通过制作cocoa应用程序项目并使用NSView方法创建窗口来放置相同的代码时,我的视图能够接收-applicationDidFinishLaunching个事件。

为什么在使用基础命令行实用程序项目时没有接收鼠标移动事件?

我还观察到,每当我通过基础cmd线实用程序项目创建一个窗口(碳或可可)时,即使单击标题栏,窗口也不会变为键。单击标题栏颜色仍为浅灰色而不是变成深灰色。为什么会这样?

我已覆盖-mouseMoved的{​​{1}}和-canBecomeKeyWindow以返回YES。

2 个答案:

答案 0 :(得分:13)

我同意约书亚已经说过的话。任何将要显示用户界面的应用程序,无论是不露面的后台进程还是在Dock中显示的应用程序,都应该采用应用程序包的形式,而不是基本工具模板之类的普通旧Mach-O可执行文件。创建

此外,默认情况下,视图无法响应mouseMoved:事件的原因有:

  1. 鼠标移动事件可以快速填充事件队列
  2. 通常没有理由使用mouseMoved:作为跟踪区域 更加有效和高效。
  3. 前段时间,我写了一个小测试应用程序,演示了这两种方法之间的差异:

    alt text

    将鼠标移动到上方视图大约20秒会导致1000个事件,而在下方视图中,使用小于50的跟踪区域。

    示例GitHub项目:https://github.com/NSGod/MouseMoved-vs-TrackingAreas

    再次,正如约书亚所说,如果你能描述一下你想要完成的事情,将会有所帮助。如果你的应用程序需要是一个后台应用程序(LSUIElement == 1),并且呈现一个没有出现在Dock中的界面,那么有办法做到这一点(正如Josh所说,一个命令行,非捆绑的应用程序不是方式)。

答案 1 :(得分:3)

您没有事件循环来检测事件并将它们传递给您的窗口,因为您的程序无法启动NSApplication。请参阅典型Cocoa应用程序的main.m文件。

通过采用这种方法描述您想要完成的任务可能会有所帮助。我的猜测是你正在构建一个守护进程,但想要一个GUI界面来管理其他“无头”守护进程。那或你正在建立一个新的登录管理系统。在任何一种情况下,都有特定的方法来做到这两点,这不是它。 : - )