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

jim*_*eus 11 cocoa objective-c cursor nspanel

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

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

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

从我曾经把焦点放到另一个应用程序的那一刻起,我可以点击并将鼠标悬停在我的面板上,光标样式将不会再改变 - 它始终保持箭头状态,并且无法恢复正常行为.

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

所以我需要找到一种方法来创建一个NSPanel保持正常自动更改 - cursorstyle - 当悬停在面板边缘 - 行为时,即使您将焦点放在另一个应用程序上.

我已经尝试使用自定义的NSPanel类,我已经覆盖了 canBecomeKeyWindowcanBecomeMainWindow方法,所以他们返回YES但即使我制作我的Panel KeyWindowMainWindow...

[myPanel makeKeyAndOrderFront:self];
[myPanel makeMainWindow];
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

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

问题是我需要" - 选项 - non activating因为我正在创建一个状态栏屏幕捕获应用程序,应该显示并在其他所有操作之前运行,但不会停用任何正在运行的应用程序.我可以解决光标问题

[NSApp activateIgnoringOtherApps];

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

Wil*_*ley 1

我不认为当您的应用程序处于活动状态时,xe2x80x99 可以通过普通 API 更改光标。我\xe2\x80\x99m非常确定窗口系统不允许\xe2\x80\x99t允许它:它\xe2\x80\x99d会违反应用程序之间的边界\xe2\x80\x94如果您尝试从后台应用程序也尝试设置光标,谁会赢?

\n\n

系统当然可以做到这一点(就像你用 \xe2\x8c\x98\xe2\x87\xa74 截图一样),因为 \xe2\x80\x99 在窗口系统本身中。

\n