7

我的可可应用程序运行后台任务,我想在用户空闲时停止(没有键盘/鼠标输入),然后在用户再次活跃时恢复。有没有办法注册空闲状态通知?

4

4 回答 4

6

有一个 Carbon API 会在一段时间后没有用户事件时发送通知EventLoopIdleTimer。Uli Kusterer 为这里编写了一个 Cocoa 包装器(查找 UKIdleTimer)

如果您想要一些较低级别的东西,您可以结合使用计时器和 CoreGraphics 函数CGEventSourceSecondsSinceLastEventType(在 中提供<CoreGraphics/CGEventSource.h>)来实现您想要的行为。

于 2011-01-10T04:44:49.877 回答
6

如果您无法链接到 Carbon(即您想要编译 x86_64 位二进制文​​件),您可以在计时器中包装此函数(以秒为单位返回当前空闲时间,分辨率为 double - CFTimeInterval):

#include <IOKit/IOKitLib.h>

CFTimeInterval CFDateGetIdleTimeInterval() {
    mach_port_t port;
    io_iterator_t iter;
    CFTypeRef value = kCFNull;
    uint64_t idle = 0;
    CFMutableDictionaryRef properties = NULL;
    io_registry_entry_t entry;

    IOMasterPort(MACH_PORT_NULL, &port);
    IOServiceGetMatchingServices(port, IOServiceMatching("IOHIDSystem"), &iter);
    if (iter) {
        if ((entry = IOIteratorNext(iter))) {
            if (IORegistryEntryCreateCFProperties(entry, &properties, kCFAllocatorDefault, 0) == KERN_SUCCESS && properties) {
                if (CFDictionaryGetValueIfPresent(properties, CFSTR("HIDIdleTime"), &value)) {
                    if (CFGetTypeID(value) == CFDataGetTypeID()) {
                        CFDataGetBytes(value, CFRangeMake(0, sizeof(idle)), (UInt8 *) &idle);
                    } else if (CFGetTypeID(value) == CFNumberGetTypeID()) {
                        CFNumberGetValue(value, kCFNumberSInt64Type, &idle);
                    }
                }
                CFRelease(properties);
            }
            IOObjectRelease(entry);
        }
        IOObjectRelease(iter);
    }

    return idle / 1000000000.0;
}

您需要将代码链接到IOKit.framework

于 2012-01-06T09:34:04.307 回答
1

Apple 的技术问答 QA1340 注册和取消注册睡眠和唤醒通知可能是您正在寻找的内容。

如果您需要比NSWorkspaceWillSleepNotification更多的控制(清单 1),请使用 I/O Kit 并注册以接收电源通知(清单 3)。

于 2011-01-10T04:25:58.017 回答
1

我使用了不同的方法。子类化 UIApplication 我重写了 sendEvent 方法过滤触摸(实际上你可以过滤任何类型的事件、加速、触摸等)。使用共享变量和后台计时器,我管理了“空闲”。每次用户触摸屏幕时,都会使用当前时间间隔(当前时间)设置变量。计时器触发方法检查自上次触摸以来经过的时间,如果大于阈值(在我的情况下约为 90 秒),您可以发布自己的通知。

我使用这种简单的方法创建了一组自定义应用程序,这些应用程序在一些空闲时间后会自动调用“屏幕保护程序”应用程序。

没有什么聪明的,它只是做这项工作。

希望有帮助。

于 2012-02-22T21:04:01.817 回答