背景:一般Windows idle time的获取都是通过调用Windows API GetLastInputInfo和GetTickCount,使用获取的系统的运行时间和获取的上次输入操作的时间,计算差值得到windows的空闲时间。网上例子很多这里不进行讨论。但是这种方式只适合Windows单用户监测,即此用户的空闲时间;不能做到真正意义上的Windows节点空闲时间监测。
这里介绍一种真正的全局多用户监测空闲时间(Windows节点的空闲时间)的解决方案。大概步骤为: 使用pythoncom和pyhook这两个工具,监听当前电脑上鼠标和键盘的事件发生时间。根据记录的事件发生时间和当前时间的差值,算出电脑空闲时间。
我的环境清单,大致如下:
1、操作系统 Win7 SP1操作系统
2、Python 2.7.10
3、pyHook 1.5.1
4、pywin32 221(pythoncom)
5、PyInstaller 3.2.1
编写记录鼠标和键盘的事件发生时间的脚本myHook.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import getpass
import pyHook
import pythoncom
hookFile = None
def onMouseEvent(event):
global hookFile
with open(hookFile, 'w') as objFile:
objFile.write("%s\n" % event.Time)
return True
def onKeyboardEvent(event):
global hookFile
with open(hookFile, 'w') as objFile:
objFile.write("%s\n" % event.Time)
return True
def main():
global hookFile
# 记录鼠标键盘事件发生时间的文件路径,文件名使用用户名区分,一个用户一个文件
hookFile =r"C:\temp\hook.%s.dat" % (getpass.getuser())
# 创建保存鼠标键盘事件发生时间的文件,权限赋值可读可写
objFile=open(hookFile, 'w')
objFile.close()
os.chmod(hookFile, 0o666)
# 创建hook实例
hm = pyHook.HookManager()
# 注册键盘事件处理函数,并启动监听
hm.KeyDown = onKeyboardEvent
hm.HookKeyboard()
# 注册鼠标事件处理函数,并启动监听
hm.MouseAll = onMouseEvent
hm.HookMouse()
# 接收系统的事件
pythoncom.PumpMessages()
if __name__ =="__main__":
main()
使用PyInstaller将脚本打包成myHook.exe可执行文件。
使用vbs脚本包装myHook.exe,使其在开机启动时候运行。使用此方法的原因:服务属于后台进程,后台进程获取不到鼠标和键盘事件,所以这里使用vbs脚本将监控程序加入开机启动项。当开机用户登录后,就可以实时的记录鼠标和键盘事件的时间。
编写myHook.vbs:
Set shell = Wscript.createobject("wscript.shell")
a = shell.run ("./myHook.exe",0)
将myHook.exe和myHook.vbs放到对应的路径下,我这里规划路径如下
myHook.exe和myHook.vbs放到C:\目录(路径可以自己规划)
创建myHook.vbs的快捷方式到C:\ProgramData\Microsoft\Windows\StartMenu\Programs\StartUp
这样开机启动后,在C:\temp\目录下会看到各用户记录的鼠标键盘事件发生时间;然后我们在另一个程序里周期的读取所有用户记录的事件发生的时间值,找到最新的时间和当前时间计算差值就可以知道机器空闲了多长时间。
网友评论