VB键盘鼠标无动作调用程序的尝试
实现键盘鼠标无动作时调用程序,曾尝试HOOK钩子与Windows屏保检测均失败。最终用GetLastInputInfo函数获取系统空闲时间,成功触发操作,例如空闲15分钟弹出关机提示。
实现这样一个功能——当键盘无输入、鼠标无移动或点击时自动触发程序——听起来很直接。最先想到的自然是HOOK钩子,监控键盘鼠标的动作。然而实际折腾下来,HOOK来HOOK去,总在某个环节卡住,始终没能跑通。
换个思路:Windows的屏幕保护程序本身就是检测键盘鼠标空闲后启动的。那为什么不让它做中介呢?先让屏保正常运行,然后程序里检测屏保是否正在运行——如果屏保启动了,说明系统已空闲,这时就可以调用目标程序。而检测屏保是否运行,用SystemParametersInfo这个API就能搞定。参考代码如下:
'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_GETSCREENSA VEACTIVE As Long = &H10 '屏保是否启用的常量
Private Const SPI_GETSCREENSA VERRUNNING As Long = &H72 '屏保是否运行的常量
Private Sub Timer1_Timer()
Dim bRunning As Boolean '屏保是否运行的变量,当然你可以定义全局变量
SystemParametersInfo SPI_GETSCREENSA VERRUNNING, 0, bRunning, False '调用API,bRunning返回屏保运行状态
Debug.Print Time; "屏保运行="; bRunning '演示:打印屏保是否运行的信息
End Sub
'另外,查看屏保是否启用,也可以用下面方法:
SystemParametersInfo SPI_GETSCREENSA VEACTIVE, 0, bActive, False 'bActive为返回值(逻辑型)
然而在Windows 7下调试时,又遇到了新问题:SPI_GETSCREENSA VERRUNNING这个调用报bRunning类型错误。这个方案也只能暂时搁置。
最终落地的方案其实更简洁——直接使用GetLastInputInfo函数获取系统空闲时间。参考代码如下:
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
以上就是从HOOK方案、屏保方案到最终GetLastInputInfo方案的完整实现过程。当然,具体使用时可以根据需要调整空闲时间阈值,或者替换弹窗为其他操作。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















