“非激活”模式中的NSPanel并不总是显示正确的游标

时间:2013-08-08 17:55:54

标签: objective-c cocoa cursor nspanel

我在XCode 4.6中使用NSPanel而不是默认NSWindow创建了一个简单的Cocoa-Application。当我启用非激活时 选项并启动应用程序一切正常:

面板显示在其他所有内容之前和之后 鼠标光标悬停在面板的边缘,它会从正常变化 arrow-cursor到适当的resize-cursor,因此用户知道他可以调整大小 小组。

这样可以正常工作,因为我没有点击任何其他应用程序 例如Safari或Finder。

从我曾经专注于另一个应用程序的那一刻起, 我可以点击并尽可能多地将鼠标悬停在我的面板上 光标样式不会再改变 - 它总是保持箭头,并且不可能返回到正常行为。

面板保持可选,在前面,您仍然可以移动并调整其大小, 但是鼠标光标始终保持箭头状态。然后你甚至无法改变它 手动使用类似:[[NSCursor crosshairCursor] set]

的内容

所以我需要找到一种方法来创建一个保持正常的NSPanel 自动变-cursorstyle-当悬停-过面板边缘行为 即使你把焦点放在另一个应用程序上也是如此。

我已经尝试使用自定义的NSPanel类, 在哪里我覆盖了canBecomeKeyWindow和。{ canBecomeMainWindow方法,以便返回YES 但即使我制作了专家组KeyWindowMainWindow ...

[myPanel makeKeyAndOrderFront:self];
[myPanel makeMainWindow];

...它无法解决游标问题。

如果有人可以帮助我,那会很棒。)

PS:在我的项目中,Base SDK和部署目标设置为10.8


所以我发现所描述的问题与面板的窗口状态无关。如果将其设置为key或main,则无关紧要,而是游标问题(始终保持箭头)与应用程序的激活状态相关。

只要拥有该面板的应用程序处于活动状态,但是如果您单击另一个应用程序,我的应用程序将被停用并且不会再次激活 - 即使您单击该面板 - 因为“{{1} }“ - 选项已启用。

问题在于我需要“non-activating”选项,因为我正在创建一个状态栏屏幕捕获应用程序,应该在其他所有应用程序之前显示和操作,但不会停用任何正在运行的应用程序。我可以通过

解决游标问题

non activating

但随后拍摄在Safari中运行的全屏视频的屏幕截图会停用Safari并最小化视频,这是我不想要的。

1 个答案:

答案 0 :(得分:1)

我不认为通过普通API可以在您的应用未激活时更改光标。我很确定窗口系统不允许它:它违反了应用程序之间的界限 - 如果你试图从后台设置光标,前台应用程序也试图设置光标,谁会赢了吗?

当然系统可以这样做(就像你用⌘⇧4截取屏幕截图一样),因为那是在窗口系统本身。