Обнаружение полноэкранного режима на Mac

Я пишу клиент обмена мгновенными сообщениями для Mac (на Python, но здесь подойдет решение Objective C/Cocoa). Я хочу определить, смотрит ли пользователь в данный момент фильм или играет в игру на переднем плане, или делает что-то еще, что занимает весь экран. Если это так, я не буду воспроизводить звук при поступлении нового мгновенного сообщения, но если нет, я воспроизведу звук.

Как я могу обнаружить это? Есть ли способ получить окно переднего плана с помощью Applescript и посмотреть его размеры? Или есть какой-то другой вызов API?


person zak23    schedule 11.03.2009    source источник
comment
Вслед за Vasi, может быть, вместо этого конфигурация вашего приложения может включать список приложений, которые, если они находятся на переднем плане, заставят вас подавлять уведомления? Вы можете заполнить по умолчанию быстрым игроком, первым рядом и популярными играми (увы, короткий список).   -  person John Fouhy    schedule 11.03.2009


Ответы (4)


Чтобы проверить полноэкранный режим, вызовите CGDisplayIsCaptured(screenID) на каждом экране.

Но я не уверен, правильно ли вы проверяете. Во-первых, я мог бы захватить один экран («полный экран»), а второй не захватить, что вы хотите сделать в этом случае?

Кроме того, полноэкранный режим действительно что-то значит? Если я использую GarageBand для работы над песней, я, вероятно, не хочу слышать случайные звуки, независимо от того, полноэкранный режим или нет. Или я могу запустить виртуальную машину Windows в полноэкранном режиме, но все равно хочу получать уведомления о мгновенных сообщениях.

person vasi    schedule 11.03.2009
comment
Или даже просто написать документ! (Особенно на небольших экранах, таких как 13 ноутбуков.) - person SilverWolf; 22.11.2017

не совсем уверен, как это сделать, но яблочные документы говорят:

Чтобы отслеживать изменения в режиме представления сеанса входа в систему, вы можете обработать событие kEventAppSystemUIModeChanged Carbon.

person cobbal    schedule 11.03.2009
comment
Это работает для некоторых приложений (например, VLC), но не для других (например, Safari и другие приложения Cocoa, поддерживающие новый полноэкранный режим). - person Thomas Tempelmann; 27.05.2014

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

person Jens Ayton    schedule 11.03.2009

В Mountain Lion (и, возможно, раньше) вы можете отслеживать наличие строки меню, отслеживая рассылаемые уведомления com.apple.HIToolbox.hideMenuBarShown и com.apple.HIToolbox.hideMenuBarShown. Обычно нет строки меню == полноэкранный режим. Это работает во всех приложениях, поэтому вы можете сказать, когда, скажем, VLC переходит в полноэкранный режим или когда кто-то переключается на iCal в полноэкранном режиме.

Для этого зарегистрируйтесь на эти два уведомления:

[[NSDistributedNotificationCenter defaultCenter] addObserver:self
        selector:@selector(windowDidEnterFullScreen:)
        name:@"com.apple.HIToolbox.hideMenuBarShown"
        object:nil];

[[NSDistributedNotificationCenter defaultCenter] addObserver:self
       selector:@selector(windowDidExitFullScreen:)
       name:@"com.apple.HIToolbox.frontMenuBarShown"
       object:nil];

затем создайте свои собственные селекторы для обработки этих случаев. frontMenuBarShown срабатывает все время, поэтому, чтобы поймать реальный возврат из полноэкранного режима, следите за первым 'didExit', который следует за 'didEnter'...

person ecume des jours    schedule 15.08.2012