我想要實現的功能是,當鍵盤無輸入、鼠標無移動或點擊動作時調用程序。首先想到的是用鉤子HOOK來獲取鍵盤或者鼠標的動作,如果無動作時調用程序。我嘗試的結果是HOOK來HOOK去總是有問題。
后來想到Windows的屏幕保護程序就是當鍵盤鼠標無動作時進入屏幕保護的,于是改變思路,想把程序做成這樣的形式,鍵盤鼠標無動作,系統進入屏幕保護,然后檢測系統是否運行屏幕保護程序,如果運行的話則調用程序。這種方式就是以屏幕保護程序作為中介,把檢測鍵盤鼠標動作的工作交給屏幕保護程序來完成了。SystemParametersInfo可以實現獲取屏幕保護信息的函數。參考代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
'API調用與常用定義: Private Declare Function SystemParametersInfo _ Lib "user32" _ Alias "SystemParametersInfoA" _ ( ByVal uiAction As Long , _ ByVal uiParam As Long , _ pvParam As Any, _ ByVal fWInIni As Long ) As Boolean Private Const SPI_GETSCREENSAVEACTIVE As Long = &H10 '屏保是否啟用的常量 Private Const SPI_GETSCREENSAVERRUNNING As Long = &H72 '屏保是否運行的常量 Private Sub Timer1_Timer() Dim bRunning As Boolean '屏保是否運行的變量,當然你可以定義全局變量 SystemParametersInfo SPI_GETSCREENSAVERRUNNING, 0, bRunning, False '調用API,bRunning返回屏保運行狀態 Debug.Print Time; "屏保運行=" ; bRunning '演示:打印屏保是否運行的信息 End Sub '另外,查看屏保是否啟用,也可以用下面方法: SystemParametersInfo SPI_GETSCREENSAVEACTIVE, 0, bActive, False 'bActive為返回值(邏輯型) |
可是不知道為什么我在WIN7下調試還是有問題,提示SystemParametersInfo SPI_GETSCREENSAVERRUNNING, 0, bRunning, False
中的bRunning類型錯誤,只能作罷。
最后來說一下最終實現的方案是使用GetLastInputInfo函數獲取系統的空閑時間,參考代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
Option Explicit Private Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As Boolean Private Declare Function GetTickCount Lib "kernel32" () As Long Private Type LASTINPUTINFO cbSize As Long dwTime As Long End Type Private Sub Form_Load() Timer1.Interval = 1000 End Sub Private Sub Timer1_Timer() Dim lii As LASTINPUTINFO lii.cbSize = Len(lii) If GetLastInputInfo(lii) Then If (GetTickCount - lii.dwTime) / 60000 >= 15 Then Call MsgBox( "由于本機15分鐘沒有操作,如果3分鐘后沒有反應,系統將強制關機" , vbYesNo + vbExclamation + vbDefaultButton2, "提示" ) End If End If End Sub |
以上所述就是本文的全部內容了,希望大家能夠喜歡。