Cocoa NSView未检测到鼠标移动事件
我正在尝试制作一个简单的应用程序,其中有一个空的红色矩形,每当鼠标移动到矩形的上半部分边界上时,光标就会被手动关闭Cocoa NSView未检测到鼠标移动事件,cocoa,macos,Cocoa,Macos,我正在尝试制作一个简单的应用程序,其中有一个空的红色矩形,每当鼠标移动到矩形的上半部分边界上时,光标就会被手动关闭 我从选择基础命令行项目开始。制作了一个透明的 NSWIdOW并在其中嵌入了一个A NSVIEW/CODE >矩形,使窗口接受鼠标移动事件(方法: -StAccExtMsSouthEffestEvss)。我已重写了-canBecomeKeyWindow和-canBecomeMainWindow窗口以返回YES。但不知何故,-mouseMoved事件都没有被NSView接收到 当我通过
我从选择基础命令行项目开始。制作了一个透明的<代码> NSWIdOW并在其中嵌入了一个A<代码> NSVIEW/CODE >矩形,使窗口接受鼠标移动事件(方法:<代码> -StAccExtMsSouthEffestEvss<代码>)。我已重写了
-canBecomeKeyWindow
和-canBecomeMainWindow
窗口以返回YES。但不知何故,-mouseMoved
事件都没有被NSView
接收到
当我通过创建cocoa应用程序项目并在-applicationdFinishLaunching
方法中创建窗口来放置相同的代码时,我的视图能够接收-mouseMoved
事件
为什么在使用基础命令行实用程序时不接收鼠标移动事件?< /P>
我也观察到,每当我通过基础CMD线实用程序做一个窗口(碳或可可)时,即使点击标题栏,窗口也不会变成键。点击标题栏颜色仍然是浅灰色而不是变暗灰色。为什么会这样
我已经覆盖了
NSwindow的-canBecomeKeyWindow
和-canBecomeMainWindow
以返回YES。您没有事件循环来检测事件并将其传递到您的窗口,因为您的程序没有启动NSApplication。请参阅典型Cocoa应用程序的main.m文件
描述一下您通过采用这种方法试图实现的目标可能会有所帮助。我的猜测是,您正在构建一个守护进程,但希望有一个GUI界面来管理“无头”守护进程。或者你正在构建一个新的登录管理系统。在这两种情况下,都有具体的方法可以做到这一点,但不是这样。:-) 我同意约书亚已经说过的话。任何要显示用户界面的应用程序,都是一个不可见的后台进程,或者显示在坞中的一个应用程序,应该是一个应用程序包的形式,而不是一个普通的老MaG-O可执行文件,如基础工具模板将创建。
此外,视图默认情况下不响应mouseMoved:
事件的原因还有:
鼠标移动的事件可以快速淹没事件队列
通常没有什么理由使用mouseMoved:
,因为跟踪区域是
更加有效和高效
不久前,我编写了一个小测试应用程序,演示了这两种方法之间的差异:
在上视图中移动鼠标大约20秒会产生1000个事件,而在使用跟踪区域的下视图中,不到50个事件
GitHub项目示例:
同样,正如约书亚所提到的,如果你能描述一下你正在努力实现的目标,那会很有帮助。如果你的应用程序需要是一个后台应用程序(LSUIElement==1),并且在没有出现在Dock中的情况下提供一个界面,那么有一些方法可以做到这一点(正如Josh所提到的,命令行、非捆绑应用程序是不行的).Joshua我的视图可以接收其他事件,如mouseDown和mouseDragged。唯一的问题是接收mousesMoved事件。实际上,我正在将一个应用程序从carbon迁移到cocoa。我不能使用interface builder和nib文件,因为它们在最初的carbon代码中没有使用。当我试图制作一个透明的捕获窗口时,我被这个问题困住了。在这个窗口中,当用户将鼠标移动到矩形的边界上时,鼠标指针应该变为Closed,光标表示用户可以移动窗口。您说:“单击标题栏时,颜色保持浅灰色,而不是变为深灰色。”问题仍然存在:您没有正确地与窗口服务器进行接口。命令行工具并不能做到这一点。我进一步建议您最好创建一个新的、普通的Cocoa应用程序,并使用适当的Cocoa设计模式重新构建应用程序。通过将现有代码塞进命令行程序的咽喉,尝试直接“移植”碳应用程序,这是一个痛苦的世界。这比不明智更糟糕。