VB鍵盤(pán)鼠標(biāo)無(wú)動(dòng)作調(diào)用程序的嘗試
我想要實(shí)現(xiàn)的功能是,當(dāng)鍵盤(pán)無(wú)輸入、鼠標(biāo)無(wú)移動(dòng)或點(diǎn)擊動(dòng)作時(shí)調(diào)用程序。首先想到的是用鉤子HOOK來(lái)獲取鍵盤(pán)或者鼠標(biāo)的動(dòng)作,如果無(wú)動(dòng)作時(shí)調(diào)用程序。我嘗試的結(jié)果是HOOK來(lái)HOOK去總是有問(wèn)題。
后來(lái)想到Windows的屏幕保護(hù)程序就是當(dāng)鍵盤(pán)鼠標(biāo)無(wú)動(dòng)作時(shí)進(jìn)入屏幕保護(hù)的,于是改變思路,想把程序做成這樣的形式,鍵盤(pán)鼠標(biāo)無(wú)動(dòng)作,系統(tǒng)進(jìn)入屏幕保護(hù),然后檢測(cè)系統(tǒng)是否運(yùn)行屏幕保護(hù)程序,如果運(yùn)行的話則調(diào)用程序。這種方式就是以屏幕保護(hù)程序作為中介,把檢測(cè)鍵盤(pán)鼠標(biāo)動(dòng)作的工作交給屏幕保護(hù)程序來(lái)完成了。SystemParametersInfo可以實(shí)現(xiàn)獲取屏幕保護(hù)信息的函數(shù)。參考代碼如下:
'API調(diào)用與常用定義: 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 '屏保是否運(yùn)行的常量 Private Sub Timer1_Timer() Dim bRunning As Boolean '屏保是否運(yùn)行的變量,當(dāng)然你可以定義全局變量 SystemParametersInfo SPI_GETSCREENSAVERRUNNING, 0, bRunning, False '調(diào)用API,bRunning返回屏保運(yùn)行狀態(tài) Debug.Print Time; "屏保運(yùn)行="; bRunning '演示:打印屏保是否運(yùn)行的信息 End Sub '另外,查看屏保是否啟用,也可以用下面方法: SystemParametersInfo SPI_GETSCREENSAVEACTIVE, 0, bActive, False 'bActive為返回值(邏輯型)
可是不知道為什么我在WIN7下調(diào)試還是有問(wèn)題,提示SystemParametersInfo SPI_GETSCREENSAVERRUNNING, 0, bRunning, False
中的bRunning類(lèi)型錯(cuò)誤,只能作罷。
最后來(lái)說(shuō)一下最終實(shí)現(xiàn)的方案是使用GetLastInputInfo函數(shù)獲取系統(tǒng)的空閑時(shí)間,參考代碼如下:
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("由于本機(jī)15分鐘沒(méi)有操作,如果3分鐘后沒(méi)有反應(yīng),系統(tǒng)將強(qiáng)制關(guān)機(jī)", vbYesNo + vbExclamation + vbDefaultButton2, "提示") End If End If End Sub
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
在VB中遍歷文件并用正則表達(dá)式完成復(fù)制及vb實(shí)現(xiàn)重命名、拷貝文件夾的方法
這篇文章主要介紹了在VB中遍歷文件并用正則表達(dá)式完成復(fù)制及vb實(shí)現(xiàn)重命名、拷貝文件夾的方法,需要的朋友可以參考下2018-12-12VB鍵盤(pán)鼠標(biāo)無(wú)動(dòng)作調(diào)用程序的嘗試
這篇文章主要介紹了VB鍵盤(pán)鼠標(biāo)無(wú)動(dòng)作調(diào)用程序的嘗試,記錄下整個(gè)思路和過(guò)程,有需要的小伙伴可以參考下。2015-06-06VB讀取線程、句柄及寫(xiě)入內(nèi)存的API代碼實(shí)例
這篇文章主要介紹了VB讀取線程、句柄及寫(xiě)入內(nèi)存的API代碼實(shí)例,需要的朋友可以參考下2014-07-07VBA中連接SQLSERVER數(shù)據(jù)庫(kù)例子
這篇文章主要介紹了VBA中連接SQLSERVER數(shù)據(jù)庫(kù)例子,VBA是指Visual Basic for Applications,是Visual Basic的一種宏語(yǔ)言,需要的朋友可以參考下2014-07-07