如何获取Windows及应用程序的空闲时长(上次键鼠操作后时长)
获取Windows系统及应用程序上次输入时长的方案
a) 获取Windows系统上次输入后的时长
直接调用Windows API GetLastInputInfo 即可实现,该API会返回系统最后一次输入事件(鼠标/键盘操作)的时间戳,通过与当前系统时间计算差值得到空闲时长:
#include <windows.h> DWORD GetSystemIdleTime() { LASTINPUT_INFO li = {0}; li.cbSize = sizeof(LASTINPUTINFO); if (GetLastInputInfo(&li)) { return GetTickCount64() - li.dwTime; // 返回空闲时长(毫秒) } return 0; }
LASTINPUTINFO结构体的dwTime字段存储了最后一次输入事件的系统Tick计数GetTickCount64()获取当前系统Tick计数,两者差值即为系统空闲的毫秒数
b) 获取当前应用程序上次输入后的时长
无需逐个处理组件的输入事件,只需在应用程序的消息处理层面统一捕获输入类消息,维护一个全局时间戳变量,每次收到输入消息时更新该时间戳,最终通过计算当前时间与该时间戳的差值得到应用内空闲时长:
Win32原生程序示例
#include <windows.h> DWORD g_lastAppInputTime = GetTickCount64(); // 初始化时间戳 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { // 捕获所有输入相关消息 switch (uMsg) { case WM_MOUSEMOVE: case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_KEYDOWN: case WM_CHAR: case WM_MBUTTONDOWN: case WM_XBUTTONDOWN: g_lastAppInputTime = GetTickCount64(); // 更新输入时间戳 break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } DWORD GetAppIdleTime() { return GetTickCount64() - g_lastAppInputTime; // 返回应用内空闲时长(毫秒) }
MFC程序示例
#include <afxwin.h> DWORD g_lastAppInputTime = GetTickCount64(); BOOL CMainFrame::PreTranslateMessage(MSG* pMsg) { // 在消息分发前捕获输入消息 if (pMsg->message == WM_MOUSEMOVE || pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_KEYDOWN || pMsg->message == WM_CHAR || pMsg->message == WM_MBUTTONDOWN) { g_lastAppInputTime = GetTickCount64(); } return CFrameWnd::PreTranslateMessage(pMsg); } DWORD GetAppIdleTime() { return GetTickCount64() - g_lastAppInputTime; }
内容的提问来源于stack exchange,提问作者Michael Hutter
相关产品推荐
相关产品推荐

