收录日期:2018/09/20 15:47:24 时间:2016/05/23 01:58:01 标签:控件
Windows中如何获取键盘和鼠标处于空闲状态的时间?
在一个timer控件中设一个变量比如stay,每秒加一,如果加到30就说明30秒鼠标没动过了。
用钩子函数,如果接收到鼠标或者键盘响应,就让stay=0
模块代码如下:
'以下程序是在Module1.bas内
Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
'idHook参数代表拦截的类型,主要有键盘、鼠标等(当拦截键盘输入时值为2)
'lpfn参数代表Hook函数的位址
'hmod代表.dll的hInstance
'dwThreadId代表执行拦截的ThreadId
Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WH_KEYBOARD = 2
Public Const WH_MOUSE = 0
Public hHook As Long
Public mHook As Long
Public Stay As Integer

Sub EnableHook() '定义EnableHook
'设置拦截
hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf Myfunc, App.hInstance, 0)
mHook = SetWindowsHookEx(WH_MOUSE, AddressOf Myfunc, App.hInstance, 0)
End Sub

Sub DisableHook() '定义DisableHook
Dim ret As Long
ret = UnhookWindowsHookEx(hHook) '取消拦截
ret = UnhookWindowsHookEx(mHook)
End Sub

Function Myfunc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 'wParam代表按键
 On Error GoTo ER
Stay = 0
Myfunc = 1
Exit Function
ER: MsgBox "错误号是:" & Err.Number
End Function


窗体代码如下:
Private Sub Form_Load()
EnableHook
End Sub

Private Sub Form_Unload(Cancel As Integer)
DisableHook
End Sub

Private Sub Timer1_Timer()
Stay = Stay + 1
Label1.Caption = Stay
If Stay = 10 Then
    MsgBox "鼠标键盘已有10秒未相应"
    Stay = 0
End If
End Sub

我刚会用钩子函数,有什么不对的地方,请高手指点。