我想要實現的功能是,當鍵盤沒有輸入、滑鼠無移動或點擊動作時調用程式。首先想到的是用鉤子HOOK來取得鍵盤或滑鼠的動作,如果無動作時呼叫程式。我嘗試的結果是HOOK來HOOK去總是有問題。
後來想到Windows的螢幕保護程式就是當鍵盤滑鼠無動作時進入螢幕保護的,於是改變思路,想把程式做成這樣的形式,鍵盤滑鼠無動作,系統進入螢幕保護,然後偵測系統是否運行螢幕保護程序,如果運行的話則呼叫程式。這種方式就是以螢幕保護程式作為中介,把偵測鍵盤滑鼠動作的工作交給螢幕保護程式來完成了。 SystemParametersInfo可以實現取得螢幕保護資訊的函數。參考代碼如下:
'API呼叫與常用定義:Private Declare Function SystemParametersInfo _ Lib "user32" _ Alias "SystemParametersInfoA" _ (ByVal uiAction As Long, _ ByVal uiParam As Long, _ pvParam As Any, _ ByVal fWInENSIr. As Long = &H10 '螢幕保護是否啟用的常數Private Const SPI_GETSCREENSAVERRUNNING As Long = &H72 '屏保是否運行的常量Private Sub Timer1_Timer() Dim bRunning As Boolean '屏幕保是否運行的變量,當然你可以定義全局變量SystemParametersInfo SPI_GETS,AVERRUNN. '呼叫API,bRunning返回屏保運行狀態Debug.Print Time; "屏保運行="; bRunning '演示:打印屏保是否運行的信息End Sub '另外,查看屏保是否啟用,也可以用下面方法:SystemParametersInfo SPI_GETSCREENSAVEACTIVE, 0 , bActive, False 'bActive為傳回值(邏輯型)
但不知道為什麼我在WIN7下調試還是有問題,提示SystemParametersInfo SPI_GETSCREENSAVERRUNNING, 0, bRunning, False
中的bRunning類型錯誤,只能作罷。
最後來談談最終實作的方案是使用GetLastInputInfo函數來取得系統的空閒時間,參考程式碼如下:
Option ExplicitPrivate Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As BooleanPrivate Declare Function GetTickCount Lib "kernel32" () As LongPrivate Type LASTINPUTINFO cbSize Sub Private Sub Timer1_Timer() Dim lii As LASTINPUTINFO lii.cbSize = Len(lii) If GetLastInputInfo(lii) Then If (GetTickCount - lii.dwTime) / 60000如果3分鐘後沒有反應,系統將強制關機", vbYesNo + vbExclamation + vbDefaultButton2, "提示") End If End IfEnd Sub
以上所述就是本文的全部內容了,希望大家能夠喜歡。