我已经在XCode 4.6中使用NSPanel
而不是默认的NSWindow
创建了一个简单的Cocoa-Application。当我启用非激活
选项并启动应用程序,一切正常:
该面板显示在其他所有内容的前面,以及何时
鼠标光标悬停在面板的边缘上,它从正常状态变化
箭头光标到适当的调整大小光标,因此用户知道他可以调整大小
面板。
只要我不单击任何其他应用程序,此方法就可以正常工作
例如Safari或Finder。
从我一开始专注于另一个应用程序的那一刻起,
我可以点击并尽可能多地将鼠标悬停在面板上,
光标样式将不再更改-它始终保持箭头状态,并且不可能恢复正常状态。
面板保持可选状态,并且在前面,您仍然可以移动面板并调整其大小,
但是鼠标光标始终保持箭头。然后,您甚至无法更改它
手动使用类似:[[NSCursor crosshairCursor] set]
。
所以我需要找到一种方法来创建一个NSPanel
来保持正常
悬停在面板边缘行为时自动更改光标样式
即使您将重点放在另一个应用程序上。
我已经尝试使用自定义的NSPanel
-class,
我覆盖了canBecomeKeyWindow
的地方canBecomeMainWindow
方法,以便它们返回YES
但是即使我将面板的KeyWindow
和MainWindow
设置为...
[myPanel makeKeyAndOrderFront:self];
[myPanel makeMainWindow];
...它不能解决光标问题。
如果有人可以在这里帮助我,那就太好了:)
PS .:我的项目中的基本SDK和部署目标设置为10.8
因此,我发现所描述的问题与面板的窗口状态无关。设置为key还是main都没有关系,而是光标问题(始终保持箭头状态)与应用程序的激活状态有关。
只要拥有该面板的应用程序处于事件状态,一切都可以正常工作,但是如果您单击另一个应用程序,则我的应用程序将被停用,并且即使您单击该面板,也不会再次被激活-因为启用了“
non-activating
”选项。问题是我需要“
non activating
”选项,因为我正在创建一个状态栏屏幕捕获应用程序,该应用程序应显示并在其他所有功能之前运行,而不停用任何正在运行的应用程序。我可以通过解决光标问题[NSApp activateIgnoringOtherApps];
但是如果对Safari中运行的全屏视频进行截图,则会停用Safari并将视频最小化,这是我所不希望的。
最佳答案
我认为在您的应用未激活时,无法通过常规API更改光标。我非常确定窗口系统不允许这样做:这将违 react 用程序之间的界限,如果您尝试从后台设置光标,而前台应用程序也尝试设置光标,谁会赢?
当然,系统可以做到这一点(例如用⌘⇧4拍摄屏幕截图时),因为那是在窗口系统本身中。
关于objective-c - "Non-Activating"-Mode中的NSPanel并不总是显示正确的游标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18132778/