我想知道Mac的空闲时间。目前我使用此代码
CFMutableDictionaryRef properties = 0;
CFTypeRef obj;
mach_port_t masterPort;
io_iterator_t iter;
io_registry_entry_t curObj;
IOMasterPort(MACH_PORT_NULL, &masterPort);
/* Get IOHIDSystem */
IOServiceGetMatchingServices(masterPort, IOServiceMatching("IOHIDSystem"), &iter);
if (iter == 0)
{
return -1;
}
else
{
curObj = IOIteratorNext(iter);
}
if (IORegistryEntryCreateCFProperties(curObj, &properties, kCFAllocatorDefault, 0) == KERN_SUCCESS && properties != NULL)
{
obj = CFDictionaryGetValue(properties, CFSTR("HIDIdleTime"));
CFRetain(obj);
}
else
{
return -1;
}
uint64_t tHandle = 0;
if (obj)
{
CFTypeID type = CFGetTypeID(obj);
if (type == CFDataGetTypeID())
{
CFDataGetBytes((CFDataRef) obj, CFRangeMake(0, sizeof(tHandle)), (UInt8*) &tHandle);
}
else if (type == CFNumberGetTypeID())
{
CFNumberGetValue((CFNumberRef)obj, kCFNumberSInt64Type, &tHandle);
}
else
{
// error
tHandle = 0;
}
CFRelease(obj);
tHandle /= 1000000; // return as milliseconds
}
else
{
tHandle = -1;
}
CFRelease((CFTypeRef)properties);
IOObjectRelease(curObj);
IOObjectRelease(iter);
return (double)tHandle;
但是,如果有任何视频正在运行,我希望空闲时间保持为0。
是否需要检查代码示例或库? (包括在iTunes上运行的视频,VLC,浏览器上的youtube或任何其他视频应用程序)
答案 0 :(得分:2)
我可以用几种方式解释你的问题:
如何确定屏幕保护程序何时启动?
检查以下脚本(original answer):
#!/bin/bash
systemSleepTimeMinutes=`pmset -g | grep "^[ ]*sleep" | awk '{ print $2 }'`
if [ $systemSleepTimeMinutes -gt "0" ]; then
systemSleepTime=`echo "$systemSleepTimeMinutes * 60" | bc`
devicesIdleTime=`ioreg -c IOHIDSystem | awk '/HIDIdleTime/ {print $NF/1000000000; exit}'`
secondsBeforeSleep=`echo "$systemSleepTime - $devicesIdleTime" | bc`
echo "Time before sleep (sec): $secondsBeforeSleep"
exit 0
else
echo "The system is set to not sleep."
exit 0
fi
如果屏幕保护程序被抑制,例如VLC,则结果为:
系统设置为不睡眠。
否则它会返回屏幕保护程序启动前的时间,例如:
睡前时间(秒):899.88056
通过NSTask
或NSAppleScript
运行上面的脚本并解析结果
请注意,“睡眠”也可以响应屏幕保护程序,具体取决于首先启动哪一个。
如何确定屏幕保护程序是否被抑制?
以下几行可以解决问题:
pmset -g | grep "^[ ]*sleep" | awk '{ print $2 }'
如果屏幕保护程序被抑制,则返回0
通过NSTask
或NSAppleScript
运行上面的行并解析结果。
如何屏蔽屏幕保护程序?
官方Apple文档(包括代码段):
How can I prevent system sleep while my application is running?
编辑 (回复评论)
但是,是否存在与此脚本相同的内置方法?
我不熟悉这种方法。我实际上怀疑它存在。
快速NSAppleScript
示例:
NSString *source = @"do shell script \"pmset -g | grep \\\"^[ ]*sleep\\\" | awk '{ print $2 }'\"";
NSAppleScript *script= [[NSAppleScript alloc] initWithSource:source];
NSDictionary *scriptError = nil;
NSAppleEventDescriptor *descriptor=[script executeAndReturnError:&scriptError];
if(scriptError) {
NSLog(@"Error: %@",scriptError);
} else {
if ([[descriptor stringValue] intValue] == 0) {
NSLog(@"Screensaver suppressed.");
} else {
NSLog(@"Screensaver not suppressed.");
}
}
请不要对使用NSTask
或NSAppleScript
:)
答案 1 :(得分:0)
更好的是,请注意com.apple.screensaver.didstart和com.apple.screensaver.didstop