Подтвердить что ты не робот

Mac OS X Lion: обнаружит, работает ли другое приложение в полноэкранном режиме?

В приложении Cocoa есть ли способ узнать, находится ли другое приложение в настоящее время в полноэкранном режиме?

Мое приложение настроено на отображение во всех пространствах и прослушивает события mouseEntered, чтобы заказать себя спереди.

Проблема заключается в том, что когда другое приложение находится в полноэкранном режиме, и пользователь перемещает мышь по черной области, где находится мое окно приложения, оно выводится на передний план (происходит с несколькими мониторами).

Я видел только описанное выше поведение с [self setCollectionBehavior: NSWindowCollectionBehaviorCanJoinAllSpaces];.

Вот другой соответствующий код для моего приложения.

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

Ответ 1

Хм, вы исключили использование applescript/scriptingbridge? Вы можете получить размер окон из applescript и сравнить их с размером экрана. (или вы не знаете, на каком экране находится данное приложение?)
Некоторые приложения, которые доступны, будут иметь атрибут AXFullScreen в своих окнах. Например, это работает для некоторых приложений:

  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

Реальное действие похоже на углерод... MacWindows.h и CarbonEvents.h имеют ссылки на "FullScreen" в них.

Вам нужно исследовать это, хотя.

Ответ 2

Использовать уведомления. Например:

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

На самом деле вы, скорее всего, захотите использовать NSDistributedNotificationCenter, поскольку он проходит через процессы.

Вы добавляете свой объект в качестве наблюдателя, так что, когда что-то еще отправляет уведомление о том, что он войдет во весь экран, ваш объект получит это уведомление.

Селектор - это сообщение/метод, который вы хотите вызвать посредством процесса уведомления.

Параметр name - это фактическое имя уведомления. Они являются стандартными, если только вы не должны создавать настраиваемое уведомление для того, что вы будете использовать.

Параметр объекта предназначен для указания того, из какого объекта вы хотите получать уведомления. Поскольку вы хотите знать, когда приложение ANY будет отображаться в полноэкранном режиме, вам нужно оставить этот нуль.

Не забудьте удалить свой объект в качестве наблюдателя до его освобождения!

Ответ 3

Вышеупомянутые методы регистрации для

"NSWindowWillEnterFullScreenNotification"

не работает, их можно использовать для уведомления вашего собственного приложения, используя их, мы не можем определить, находится ли какое-либо другое приложение в полноэкранном режиме или нет.

Однако после того, как вы опробовали так много опций, обнаружил приложение детектора FullScreen в github этой полезной ссылке..:):)

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