Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSView未检测到鼠标移动事件_Cocoa_Macos - Fatal编程技术网

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设计模式重新构建应用程序。通过将现有代码塞进命令行程序的咽喉,尝试直接“移植”碳应用程序,这是一个痛苦的世界。这比不明智更糟糕。