12

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

面板显示在其他所有内容的前面,当鼠标光标悬停在面板边缘时,它会从普通箭头光标变为适当的调整大小光标,因此用户知道他可以调整面板大小。

只要我不单击任何其他应用程序(例如 Safari 或 Finder),它就可以正常工作。

从我将焦点转移到另一个应用程序的那一刻起,我可以随意单击并将鼠标悬停在我的面板上,光标样式将不再改变 - 它始终保持箭头并且不可能返回到正常行为。

面板保持可选择状态,在前面,您仍然可以移动和调整它的大小,但鼠标光标始终保持箭头。然后,您甚至无法使用以下内容手动更改它:[[NSCursor crosshairCursor] set].

因此,我需要找到一种方法来创建一个NSPanel即使您将焦点放在另一个应用程序上也能保持正常的自动更改光标样式时悬停在面板边缘行为的方法。

我已经尝试使用自定义的NSPanel-class,我已经覆盖了 canBecomeKeyWindowand canBecomeMainWindow方法,以便它们返回 YES 但即使我制作了我的 PanelKeyWindowMainWindow...

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

...它不能解决光标问题。

如果有人可以在这里帮助我会很棒:)

PS.:我的项目中 Base SDK 和 Deployment Target 设置为 10.8


所以我发现所描述的问题与面板的窗口状态无关。将其设置为 key 还是 main 并不重要,而是光标问题(始终保持箭头)与应用程序的激活状态有关。

只要拥有面板的应用程序处于活动状态,一切都会正常工作,但是如果您单击另一个应用程序,我的应用程序将被停用并且不会再次激活 - 即使您单击面板 - 因为non-activating启用了“”-选项。

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

[NSApp activateIgnoringOtherApps];

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

4

1 回答 1

1

我认为当您的应用程序未处于活动状态时,无法通过普通 API 更改光标。我很确定窗口系统不允许这样做:这将违反应用程序之间的界限——如果您尝试从后台设置光标,而前台应用程序也尝试设置光标,谁会赢?

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

于 2014-02-09T11:45:22.907 回答