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. 参考