用户在OS X上变得闲置后的通知?

4
什么是检测用户闲置 X 分钟后再立即变活跃的最佳方法?
我知道有 NSWorkspace 提供了将/已休眠/唤醒通知,但我不能依赖它,因为休眠设置通常在约 15 分钟到永不之间。我需要能够检测用户是否闲置了约 1-2 分钟。
答案 提供了一种获取空闲时间的方法。如果可能的话,我想避免轮询。

为什么要避免轮询?你可能不需要频繁轮询。你需要什么分辨率?1分钟?1秒钟?每分钟轮询一次并不低效。即使每秒钟轮询一次也不会太糟糕。 - user1118321
每秒轮询会在笔记本电脑上泄漏电池电量。你真的不应该这样做。 - Glyph
1个回答

2
投票是我所知道的唯一选择。正如用户1118321所指出的那样,每隔O(分钟)进行一次投票不太可能引起任何问题,无论是性能还是其他方面。
如果您的应用程序具有GUI并且已收到UI事件,则可以通过+ [NSEvent addLocalMonitorForEventsMatchingMask:handler:] 安装处理程序,在每个事件上重置定时器。这将有助于在用户始终活动时减少或消除轮询,至少在您自己的应用程序中。
一旦确定用户空闲时间足够长,您就可以安装全局事件挂钩以监视下一个事件。例如,请参见-[NSEvent addGlobalMonitorForEventsMatchingMask:handler:]。
注意:您应该尽可能使用{{link1:CGEventSourceSecondsSinceLastEventType}}而不是 poking into the IO registry。它是正式支持的API,可能更有效率。更不用说它更简单了。还有UKIdleTimer,但它依赖于Carbon,因此可能不适用。

最终我使用了 CGEventSourceSecondsSinceLastEventType 来计算何时触发 NSTimer(60 秒 - idleTime)。当用户处于空闲状态时,我使用 CGEventTapEnable 启用我的事件监听器。当用户再次活跃时,我使用相同的命令禁用它。事件监听器在开始时使用 kCGEventMaskForAllEventskCGEventTapOptionListenOnly 创建。看起来效果很好! - Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接