问题描述:

I've created a simple Cocoa-Application in XCode 4.6 with an NSPanel instead of the default NSWindow. When I enable the Non-Activating

option and start the application everything works fine:

The panel is displayed in front of everything else and when

the mouse cursor hovers over the panel's edges it changes from a normal

arrow-cursor to the appropriate resize-cursor, so the user knows that he can resize

the panel.

This works fine as longs as I don't click on any other application

as for example Safari or Finder.

From the moment I once give focus to another application,

I can click on and hover over my panel as much as I want, the

cursor style will not change anymore - it always stays an arrow and it's not possible to return to the normal behavior.

The panel stays selectable and in the front, you still can move and resize it,

but the mouse cursor stays an arrow all the time. You then cannot even change it

manually using something like: [[NSCursor crosshairCursor] set].

So I need to find a way to create a NSPanel that keeps the normal

automatic-change-cursorstyle-when-hovering-over-panel-edges-behaviour

even when you give focus to another application.

I have already tried to use an customized NSPanel-class,

where I have overwritten the canBecomeKeyWindow and

canBecomeMainWindow methods, so that they return YES

but even when I make my Panel KeyWindow and MainWindow...

[myPanel makeKeyAndOrderFront:self];

[myPanel makeMainWindow];

...it doesn't solve the cursor issue.

Would be great if someone could help me here :)

PS.: the Base SDK and the Deployment Target are set to 10.8 in my project


So I found out that the described issue has nothing to to with the panel's window-state. It really doesn't matter if it is set to key or to main, instead the cursor-problem (stays arrow all the time)is related to the application's activation state.

Everything works fine as long as the application that owns the panel is active but if you click on another application my application is deactivated and does not get activated again - even if you click on the panel - because the "non-activating"-option is enabled.

The problem is that i need the "non activating"-option because I am creating a status-bar-screen-capturing app that should be displayed and operate in front of everything else but without deactivating any running application. I could solve the cursor problem by

[NSApp activateIgnoringOtherApps];

but then taking a screenshot of a fullscreen video running in Safari would deactivate Safari and minimize the video, which I don't want.

网友答案:

I don’t think it’s possible through normal APIs to change the cursor when your app isn’t active. I’m pretty sure the window system doesn’t allow it: it’d be a violation of the boundaries between apps—if you try to set a cursor from the background, and the foreground app also tries to set a cursor, who would win?

Of course the system can do it (like when you take a screenshot with ⌘⇧4), because that’s in the window system itself.

相关阅读:
Top