Mac OS X Lion: Detect if another application is ru

2019-03-23 21:04发布

问题:

In a Cocoa app, is there a way to tell if another application currently is in full screen mode?

My application is configured to show up on all Spaces and listens for mouseEntered events to order itself to the front.

Problem is that when another app is in full screen mode and the user happens to move the mouse across the black area where my app's window is located, it is brought to the front (happens with multiple monitors).

I've only seen the above behavior with [self setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces]; enabled.

Here the other relevant code for my app.

- (void) mouseEntered:(NSEvent *)theEvent
{
    // Don't do this when another app is in full screen mode:
    [[self window] orderFront:self];
}

回答1:

Hmm, have you ruled out using applescript/scriptingbridge? You can get the size of windows from applescript and compare them to the size of the screen. (or do you not know which screen a given app is on?)
Certain apps which are accessible will have an 'AXFullScreen' attribute on their windows. For example this works for some apps:

  tell application "System Events"
    tell process "Pages"
        repeat with myWin in windows
            get value of attribute "AXFullScreen" of myWin
        end repeat
    end tell 
end tell

The real action seems to be down in carbon... MacWindows.h and CarbonEvents.h have references to "FullScreen" in them.

You will need to research this though.



回答2:

Use notifications. For example:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(willEnterFull:)
                                             name:NSWindowWillEnterFullScreenNotification
                                           object:nil];

Actually, you'll probably want to use NSDistributedNotificationCenter instead, since it goes across processes.

You're adding your object as an observer, so that when something else posts a notification that it will enter full screen, your object will receive that notification.

The selector is the message/method you want called by the notification process.

The name parameter is the actual name of the notification. These are standard, unless you were to create a custom notification for something you would be using.

The object parameter is for specifying which object you want to receive notifications from. Since you want to know when ANY app is going full screen, you'd want to leave this nil.

Remember to remove your object as an observer before it's deallocated!



回答3:

The above mentioned methods of registering for

"NSWindowWillEnterFullScreenNotification"

does not work, they can be used to notify your own app, using them we cannot detect whether any other application is in full screen mode or not.

However After trying out so many options found out FullScreen detector app at github this usefull link ..:):)

https://github.com/shinypb/FullScreenDetector.git