因此,我正在构建一个站在展览上供公众使用的程序,并且我有一个任务来使其处于非活动状态。只需从屏幕上的文件夹中显示一些随机视频,如屏幕保护程序,但在应用程序中。知道应用程序在可可Mac OSX中处于不活动状态的最佳方法是什么?
那么检查用户是否处于非活动状态的最佳方法是什么?
我在想的是某种全局计时器,它会在每个用户输入上得到重置,并且如果达到可以让1分钟进入非活动模式。有没有更好的方法?
因此,我正在构建一个站在展览上供公众使用的程序,并且我有一个任务来使其处于非活动状态。只需从屏幕上的文件夹中显示一些随机视频,如屏幕保护程序,但在应用程序中。知道应用程序在可可Mac OSX中处于不活动状态的最佳方法是什么?
那么检查用户是否处于非活动状态的最佳方法是什么?
我在想的是某种全局计时器,它会在每个用户输入上得到重置,并且如果达到可以让1分钟进入非活动模式。有没有更好的方法?
看看this article覆盖了使用IOKit从IOHID读取用户空闲时间。
这可能听起来像一个愚蠢的问题;但为什么不建立一个屏幕保护程序,用一个短保险丝?
如果您需要在用户走开时执行任何重置或清理,则可以侦听名为@“com.apple.screensaver.didstart”的NSNotification。
编辑:你也可以设置屏幕保护程序;等待它开火,然后在开始时自己做,在显示自己的视频时停止屏幕保护程序;但设置屏幕保护程序的正确方法是大概一个好主意。
我发现了一个使用HID管理器的解决方案,这似乎是在Cocoa中完成它的方式。 (有碳素另一种解决方案,但它并不适用于64位操作系统X上运行)
在Dan and Cheryl's Place博客引用丹尼尔·里斯:
#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字符的计算器限制。
看看UKIdleTimer,也许这是你在找什么。
您可以使用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;
}
我扩大对Parag Bafna的答案。在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
函数的文档here
这将是巨大的,如果有任何地方良好的屏保与我正在寻找的功能,必须从我的应用程序等视频放置一些自定义信息:( – tobros91 2011-02-18 10:03:01