检测PC空闲时间

1. Windows平台

uint32_t idle_millisec = 0;
LASTINPUTINFO lpi;
lpi.cbSize = sizeof(lpi);
::GetLastInputInfo(&lpi);
idle_millisec = ::GetTickCount() - lpi.dwTime;

2. macOS平台

(1) 代码

#include <IOKit/IOKitLib.h>
#include <CoreFoundation/CFNumber.h>

uint32_t idle_millisec = 0;

int64_t nanoseconds = 0;
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;
		if (IORegistryEntryCreateCFProperties(entry, &dict, kCFAllocatorDefault, 0) == KERN_SUCCESS)
		{
			//CFNumberRef
			const void* obj = CFDictionaryGetValue(dict, CFSTR("HIDIdleTime"));
			if (obj)
			{
				if (CFNumberGetValue((CFNumberRef)obj, kCFNumberSInt64Type, &nanoseconds))
				{
					idle_millisec = nanoseconds / (1000 * 1000);
				}
			}
			CFRelease(dict);
		}
		IOObjectRelease(entry);
	}
	IOObjectRelease(iter);
}

(2) 需链入相应framework 

macOS下工程需要加入 IOKit 和 CoreFoundation framework,否则 link 时会报错。

a. 若是 cmake 构建, 在 CMakeLists.txt 中处理如下:

macro(ADD_FRAMEWORK appname fwname) 
   find_library(FRAMEWORK_${fwname} NAMES ${fwname} PATHS ${CMAKE_OSX_SYSROOT}/System/Library PATH_SUFFIXES Frameworks NO_DEFAULT_PATH) 
   if( ${FRAMEWORK_${fwname}} STREQUAL FRAMEWORK_${fwname}-NOTFOUND)
      MESSAGE(ERROR ": Framework ${fwname} not found") 
   else() 
      TARGET_LINK_LIBRARIES(${appname} "${FRAMEWORK_${fwname}}") 
      MESSAGE(STATUS "Framework ${fwname} found at ${FRAMEWORK_${fwname}}") 
   endif() 
endmacro(ADD_FRAMEWORK)


ADD_FRAMEWORK(XinGe-dev CoreFoundation)
ADD_FRAMEWORK(XinGe-dev IOKit)

此外,如果是跨平台构建,用标识操作系统的宏条件编译处理不同平台代码即可。

b. 若是 Xcode 工程,在 target 对应的 Build Phases 中,如下添加:

3. 参考

stackoverflow

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值