Лучший способ узнать, если приложение неактивно в Mac OSX какао? - PullRequest
5 голосов
/ 18 февраля 2011

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

Итак, каков наилучший и правильный способ проверить, неактивен ли пользователь?

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

Ответы [ 6 ]

3 голосов
/ 15 июля 2013

Вы можете использовать CGEventSourceSecondsSinceLastEventType

Возвращает время, прошедшее с последнего события кварцевого события. источник.

/*
 To get the elapsed time since the previous input event—keyboard, mouse, or tablet—specify kCGAnyInputEventType.
 */
- (CFTimeInterval)systemIdleTime
{       
    CFTimeInterval timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType);
    return timeSinceLastEvent;
}
2 голосов
/ 10 марта 2014

Я расширяю ответ Параг Бафны. В Qt вы можете сделать

#include <ApplicationServices/ApplicationServices.h>

double MyClass::getIdleTime() {
    CFTimeInterval timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType);
    return timeSinceLastEvent;
}

Вы также должны добавить каркас к вашему .pro-файлу:

QMAKE_LFLAGS += -F/System/Library/Frameworks/ApplicationServices.framework
LIBS += -framework ApplicationServices

Документация по функции здесь

1 голос
/ 18 февраля 2011

Взгляните на UKIdleTimer , возможно, это то, что вы ищете.

1 голос
/ 18 февраля 2011

Я нашел решение, которое использует HID-менеджер, похоже, именно так оно и есть в Какао.(Есть другое решение для Carbon, но оно не работает для 64-битной OS X.)

Ссылаясь на Дэниела Риза в блоге Дэн и Шерил :

#include <IOKit/IOKitLib.h>

/*
 Returns the number of seconds the machine has been idle or -1 on error.
 The code is compatible with Tiger/10.4 and later (but not iOS).
 */
int64_t SystemIdleTime(void) {
    int64_t idlesecs = -1;
    io_iterator_t iter = 0;
    if (IOServiceGetMatchingServices(kIOMasterPortDefault,
                                     IOServiceMatching("IOHIDSystem"),
                                     &iter) == KERN_SUCCESS)
    {
        io_registry_entry_t entry = IOIteratorNext(iter);
        if (entry) {
            CFMutableDictionaryRef dict = NULL;
            kern_return_t status;
            status = IORegistryEntryCreateCFProperties(entry,
                                                       &dict,
                                                       kCFAllocatorDefault, 0);
            if (status == KERN_SUCCESS)
            {
                CFNumberRef obj = CFDictionaryGetValue(dict,
                                                       CFSTR("HIDIdleTime"));
                if (obj) {
                    int64_t nanoseconds = 0;
                    if (CFNumberGetValue(obj,
                                         kCFNumberSInt64Type,
                                         &nanoseconds))
                    {
                        // Convert from nanoseconds to seconds.
                        idlesecs = (nanoseconds >> 30);
                    }
                }
                CFRelease(dict);
            }
            IOObjectRelease(entry);
        }
        IOObjectRelease(iter);
    }
    return idlesecs;
}

Код был немного изменен, чтобы он соответствовал пределу в 80 символов в стеке.

1 голос
/ 18 февраля 2011

Взгляните на эту статью , посвященную использованию IOKit для чтения времени простоя пользователей из IOHID.

1 голос
/ 18 февраля 2011

Это может звучать как глупый вопрос;но почему бы просто не настроить экранную заставку с коротким предохранителем?

Вы можете прослушать NSNotification с именем @ "com.apple.screensaver.didstart", если вам нужно выполнить какие-либо сбросы или очистки, когда пользователь блуждаетпрочь.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...