IDE:VS2019
项目类型:C++控制台应用
系统:WIN7或WIN10
原理:通过调用Windows操作系统API查看windows事件日志中指定的事件ID来获取开关机时间,该记录所能获取的数据量取决于系统事件日志的缓存大小配置。其中,事件ID12表示正常开机,事件ID13表示正常关机,事件ID6008表示意外关闭。
点击开始按钮,在搜索框中输入“event”可以看到查看事件日志功能,也直接进入控制面板查找该功能。
进入后点击左侧windows日志“系统”子菜单,即可查看所有系统日志信息。
点击左侧筛选当前日志,在弹出窗体中箭头位置输入要筛选的ID。
选中一条记录即可查看到该事件信息正常开机和关机可以直接使用事件记录的时间。
★要注意的是,意外关闭事件是在正常开机之后生成的,因此事件写入的时间并不是实际意外关机的时间,意外关闭的时间在详细信息中,需要先解析出来。
使用代码查询开关机记录与上述可视化查询思路相同,需要用到三个windows系统API(Linux系统原理相同但API和事件ID不同)分别是:OpenEventLog、ReadEventLog、CloseEventLog。前两者是C++宏函数,根据项目编码类型自动解析为多字节版本和Unicode版本。非C/C++调用需要直接调用系统动态库中的相应版本而不能使用该宏。
调用OpenEventLog打开windows事件日志(第二个参数为“System”,否则读的不是系统事件),获得日志句柄。然后使用while循环调用ReadEventLog可以一直读到日志末尾而不局限于缓冲区的大小。在每次的调用结果中解析EVENTLOGRECORD类型的事件,将其中事件ID不是12,13,6008的筛选掉,12和13可以直接显示事件的记录时间,6008事件先解析事件描述,在显示事件描述中的时间,要注意的是该事件描述中的时间显示格式为"