【问题标题】:mouse moved events are not detected by NSViewNSView 未检测到鼠标移动事件
【发布时间】:2010-12-13 09:25:38
【问题描述】:

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

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

当我通过制作一个可可应用程序项目并在-applicationDidFinishLaunching 方法中创建我的窗口来输入相同的代码时,我的视图能够接收-mouseMoved 事件。

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

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

我已覆盖 NSwindow 的 -canBecomeKeyWindow 和 -canBecomeMainWindow 以返回 YES。

【问题讨论】:

    标签: cocoa macos


    【解决方案1】:

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

    另外,视图默认不响应mouseMoved:事件也是有原因的:

    1. 鼠标移动的事件会迅速淹没事件队列
    2. 通常没有理由使用mouseMoved:,因为跟踪区域是 更加有效和高效。

    不久前,我编写了一个小测试应用程序来演示这两种方法之间的差异:

    在上视图中移动鼠标大约 20 秒会产生 1000 个事件,而在使用跟踪区域的下视图中,则少于 50 个。

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

    同样,正如 Joshua 所提到的,如果您能描述一下您想要完成的工作,将会很有帮助。如果您的应用程序需要成为后台应用程序(LSUIElement == 1),并且呈现一个界面而不出现在 Dock 中,那么有办法做到这一点(正如 Josh 所提到的,命令行、非捆绑应用程序不是方式)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • Joshua 我的视图能够接收其他事件,例如 mouseDown 和 mouseDragged。唯一的问题是接收 mousesMoved 事件。实际上,我正在将应用程序从 carbon 迁移到 cocoa。我不能使用 interface builder 和 nib 文件,因为它们没有在原始 carbon 代码中使用。当我试图制作一个透明的捕获窗口时,我遇到了这个问题,当用户将鼠标移到矩形的边框上时,鼠标指针应该变为 closedHand 光标,描绘用户可以移动窗口。
      • 您说,“单击标题栏时,颜色保持为浅灰色,而不是变为深灰色。”问题仍然存在:您没有与窗口服务器正确连接。命令行工具并不意味着这样做。我进一步建议您最好创建一个新的、普通的 Cocoa 应用程序并使用正确的 Cocoa 设计模式重建您的应用程序。您正在寻求一个痛苦的世界,试图通过将现有代码撞到命令行程序的喉咙来直接“移植”Carbon 应用程序。这比不明智的做法更糟糕。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 2019-10-07
      • 1970-01-01
      相关资源
      最近更新 更多