VB键盘鼠标无动作调用程序的尝试
我想要实现的功能是,当键盘无输入、鼠标无移动或点击动作时调用程序。首先想到的是用钩子HOOK来获取键盘或者鼠标的动作,如果无动作时调用程序。我尝试的结果是HOOK来HOOK去总是有问题。
后来想到Windows的屏幕保护程序就是当键盘鼠标无动作时进入屏幕保护的,于是改变思路,想把程序做成这样的形式,键盘鼠标无动作,系统进入屏幕保护,然后检测系统是否运行屏幕保护程序,如果运行的话则调用程序。这种方式就是以屏幕保护程序作为中介,把检测键盘鼠标动作的工作交给屏幕保护程序来完成了。SystemParametersInfo可以实现获取屏幕保护信息的函数。参考代码如下:
'API调用与常用定义: PrivateDeclareFunctionSystemParametersInfo_ Lib"user32"_ Alias"SystemParametersInfoA"_ (ByValuiActionAsLong,_ ByValuiParamAsLong,_ pvParamAsAny,_ ByValfWInIniAsLong)AsBoolean PrivateConstSPI_GETSCREENSAVEACTIVEAsLong=&H10'屏保是否启用的常量 PrivateConstSPI_GETSCREENSAVERRUNNINGAsLong=&H72'屏保是否运行的常量 PrivateSubTimer1_Timer() DimbRunningAsBoolean'屏保是否运行的变量,当然你可以定义全局变量 SystemParametersInfoSPI_GETSCREENSAVERRUNNING,0,bRunning,False'调用API,bRunning返回屏保运行状态 Debug.PrintTime;"屏保运行=";bRunning'演示:打印屏保是否运行的信息 EndSub '另外,查看屏保是否启用,也可以用下面方法: SystemParametersInfoSPI_GETSCREENSAVEACTIVE,0,bActive,False'bActive为返回值(逻辑型)
可是不知道为什么我在WIN7下调试还是有问题,提示SystemParametersInfoSPI_GETSCREENSAVERRUNNING,0,bRunning,False
中的bRunning类型错误,只能作罢。
最后来说一下最终实现的方案是使用GetLastInputInfo函数获取系统的空闲时间,参考代码如下:
OptionExplicit PrivateDeclareFunctionGetLastInputInfoLib"user32"(pliiAsLASTINPUTINFO)AsBoolean PrivateDeclareFunctionGetTickCountLib"kernel32"()AsLong PrivateTypeLASTINPUTINFO cbSizeAsLong dwTimeAsLong EndType PrivateSubForm_Load() Timer1.Interval=1000 EndSub PrivateSubTimer1_Timer() DimliiAsLASTINPUTINFO lii.cbSize=Len(lii) IfGetLastInputInfo(lii)Then If(GetTickCount-lii.dwTime)/60000>=15Then CallMsgBox("由于本机15分钟没有操作,如果3分钟后没有反应,系统将强制关机",vbYesNo+vbExclamation+vbDefaultButton2,"提示") EndIf EndIf EndSub
以上所述就是本文的全部内容了,希望大家能够喜欢。