程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Windows中如何獲取鍵盤和鼠標處於空閒狀態的時間

Windows中如何獲取鍵盤和鼠標處於空閒狀態的時間

編輯:關於VC++

本文配套源碼

在編寫程序的過程中,我遇到了這樣的需求:在基於Windows 9x 或 Windows NT4.0 的程序中,要求確定鍵盤、鼠標處於空閒狀態的時間。查詢了有關資料文檔以後,發現Windows 9x和Windows NT4.0 沒有提供API或系統調用來實現這樣的功能。但是,在Windows 2000中提供了一個新的函數:GetLastInputInfo(),這個函數使用結構 LASTINPUTINFO 作為參數:LASTINPUTINFO lpi;
lpi.cbSize = sizeof(lpi);
GetLastInputInfo(&lpi);

調用函數GetLastInputInfo()以後, 結構成員lpi.dwTime 中的值便是自上次輸入事件發生以後的毫秒數。這個值也就是鍵盤、鼠標處於空閒狀態的時間。可惜的是這個函數只能在Windows 2000中使用,Windows 9x 或Windows NT4.0不提供此API函數。那麼,如何在Windows 9x 或Windows NT4.0中實現GetLastInputInfo()的功能呢?筆者的方法是利用系統鉤子對鍵盤、鼠標進行監控。

Windows中的鉤子實際上是一個回調函數,當用戶有輸入動作的時候,Windows要調用這個函數。比較典型的系統鉤子應用就是鍵盤鉤子和鼠標鉤子:HHOOK g_hHookKbd = NULL;
HHOOK g_hHookMouse = NULL;

在Windows中,一個系統(相對於一個特定進程而言)鉤子必須用一個動態鏈接庫(DLL)來實現。不妨將這個動態鏈接庫命名為IdleUI.dll。 這個動態鏈接庫在Windows 9x和Windows NT4.0 中實現了GetLastInputInfo()的功能。IdleUI.dll中有三個函數:BOOL IdleUIInit()
void IdleUITerm();
DWORD IdleUIGetLastInputTime();

IdleUIInit()是環境初始化函數,IdleUITerm()是環境清理函數,分別在MFC應用程序的InitInstance() 和 ExitInstance()中調用它們。當用IdleUIInit()做完初始化後,就可以調用第三個函數IdleUIGetLastInputTime()來獲取最後一次輸入事件後的時鐘。從而實現與GetLastInputInfo()一樣的功能。程序TestIdleUI.exe是用來測試IdleUI動態庫的,程序中調用了IdleUIInit 和 IdleUITerm,同時在程序的客戶區中間顯示鍵盤、鼠標空閒的秒數。void CMainFrame::OnPaint()
{
CPaintDC dc(this);
CString s;
DWORD nsec = (GetTickCount() - IdleUIGetLastInputTime())/1000;
s.Format( "鼠標或鍵盤空閒 %d 秒。",nsec);
CRect rc;
GetClientRect(&rc);
dc.DrawText(s, &rc, DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}

圖一顯示了TestIdleUI運行時的情形。

圖一 TestIdleUI運行畫面

為了連續的顯示,TestIdleUI設置刷新定時器間隔為一秒。void CMainFrame::OnTimer(UINT)
{
Invalidate();
UpdateWindow();
}

運行TestIdleUI,當鍵盤和鼠標什麼也不做時,可以看到計時器跳動,當移動鼠標或按鍵時,計時器又恢復到零,這樣就實現了對輸入設備空閒狀態的監控。實現細節請看下面對IdleUI.dll工作原理的描述:

首先調用IdleUIInit ()進行初始化,安裝兩個鉤子:一個用於監控鼠標輸入,一個用於監控鍵盤輸入。

HHOOK g_hHookKbd;
HHOOK g_hHookMouse;
g_hHookKbd = SetWindowsHookEx(WH_KEYBOARD,MyKbdHook,hInst, 0);
g_hHookMouse = SetWindowsHookEx(WH_MOUSE,MyMouseHook,hInst, 0);

當用戶移動鼠標或按下鍵盤鍵時,Windows調用其中的一個鉤子並且鉤子函數開始記錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved