Уведомление, когда система простаивает или нет на OS X - PullRequest
10 голосов
/ 21 июня 2011

Я знаю, что есть какой-то способ заставить систему простаивать с помощью инфраструктуры IOKit на OS X, но я хочу знать, есть ли доступные уведомления.

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

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

Есть ли способ получить уведомление об этом?(кажется, у iChat есть)

Ответы [ 2 ]

8 голосов
/ 26 июля 2011

Это от http://developer.apple.com/library/mac/#qa/qa1340/_index.html (из комментария Билла Ящерицы)

- (void) receiveSleepNote: (NSNotification*) note
{
    NSLog(@"receiveSleepNote: %@", [note name]);
}

- (void) receiveWakeNote: (NSNotification*) note
{
    NSLog(@"receiveWakeNote: %@", [note name]);
}

- (void) fileNotifications
{
    //These notifications are filed on NSWorkspace's notification center, not the default 
    // notification center. You will not receive sleep/wake notifications if you file 
    //with the default notification center.
    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self 
            selector: @selector(receiveSleepNote:) 
            name: NSWorkspaceWillSleepNotification object: NULL];

    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self 
            selector: @selector(receiveWakeNote:) 
            name: NSWorkspaceDidWakeNotification object: NULL];
}
1 голос
/ 28 февраля 2017
NSTimeInterval GetIdleTimeInterval() {

    io_iterator_t iter = 0;
    int64_t nanoseconds = 0;

    if (IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching("IOHIDSystem"), &iter) == KERN_SUCCESS) {
        io_registry_entry_t entry = IOIteratorNext(iter);
        if (entry) {
            CFMutableDictionaryRef dict;
            if (IORegistryEntryCreateCFProperties(entry, &dict, kCFAllocatorDefault, 0) == KERN_SUCCESS) {
                CFNumberRef obj = CFDictionaryGetValue(dict, CFSTR("HIDIdleTime"));
                if (obj)
                    CFNumberGetValue(obj, kCFNumberSInt64Type, &nanoseconds);
                CFRelease(dict);
            }
            IOObjectRelease(entry);
        }
        IOObjectRelease(iter);
    }

    return (double)nanoseconds / 1000000000.0;
}
...