首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

取得鍵盤滑鼠閒置時間:Win2K GetLastInputInfo + Win9x/NT4 Hook 回調實現

     編輯:關於VC++

Win2K+ 原生 API

LASTINPUTINFO lii = { sizeof(lii) };
GetLastInputInfo(&lii);
DWORD idleMs = GetTickCount() - lii.dwTime; // 閒置毫秒數

Win9x/NT4 相容方案:全域 Hook 記錄最後輸入時間

IdleUI.dll 介面

BOOL IdleUIInit();           // 安裝鍵盤/滑鼠 Hook
void IdleUITerm();           // 卸載 Hook
DWORD IdleUIGetLastInputTime(); // 取得最後輸入 tick count

Hook 實作核心

HHOOK g_hKbdHook, g_hMouseHook;
DWORD g_lastInput = 0;

LRESULT CALLBACK KbdHook(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) g_lastInput = GetTickCount();
    return CallNextHookEx(g_hKbdHook, nCode, wParam, lParam);
}

LRESULT CALLBACK MouseHook(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) g_lastInput = GetTickCount();
    return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
}

BOOL IdleUIInit() {
    HINSTANCE hInst = GetModuleHandle(nullptr);
    g_hKbdHook = SetWindowsHookEx(WH_KEYBOARD, KbdHook, hInst, 0);
    g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseHook, hInst, 0);
    return g_hKbdHook && g_hMouseHook;
}

測試程式 TestIdleUI

void CMainFrame::OnTimer(UINT) {
    DWORD idleSec = (GetTickCount() - IdleUIGetLastInputTime()) / 1000;
    CString s; s.Format(L"閒置 %d 秒", idleSec);
    Invalidate(); // 觸發重繪
}

void CMainFrame::OnPaint() {
    CPaintDC dc(this);
    CString s; s.Format(L"鍵盤/滑鼠閒置 %d 秒", 
        (GetTickCount() - IdleUIGetLastInputTime())/1000);
    CRect r; GetClientRect(&r);
    dc.DrawText(s, &r, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}

部署結構


TestIdleUI.exe
IdleUI.dll

啟動測試程式,滑鼠/鍵盤不動計數器遞增,動一下歸零。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved