一条数据引发的问题
一、问题点
需要统计三方软件使用的时长,但是要求在电脑处于休眠/睡眠状态下的时间段不能作为使用时长统计进去。
其实这个问题点有两个需要解决的问题:、
- 软件在使用的标准是什么?
- 如何知道电脑什么时候从运行状态进入休眠/睡眠状态,或从休眠/睡眠状态进入运行状态?
二、软件在使用的标准
这个不是我今天主要讲解的重点,在这里只是提供一个简单的方案:拿到当前桌面显示的窗口(同一应用的不同窗口,只能作为一个应用),可以参考Windows自带的任务管理器查看到:
被红色线圈中的就是需要的。
三、如何知道电脑处于休眠/睡眠还是运行状态:
- windows系统是消息驱动,而且在Windows事件日志中记录着很多执行过的事件详细信息,其中就包括休眠/睡眠事件。 通过Windows系统自带的事件查看器,可以看到很多事件信息:发生时间、来源以及事件ID。系统也为我们提供了相关的api获取需要的事件信息。ReadEventLog:读取指定的事件日志信息;
通过相关api,获取到系统休眠/睡眠时间,比较之前的休眠/睡眠时间,判断出电脑是否出从休眠/睡眠状态到运行状态。
好像问题就这么解决了,但是忽略了一个问题,就是时序的问题。如果每次计算软件使用时长都要去获取是否从休眠/睡眠到唤醒状态,存在这样一种情况:当运行到读取休眠/睡眠到幻想状态后,统计软件使用时长前,电脑休眠了,等到唤醒后,就会将休眠的时间统计进去(如果设计的方式不够好的话)。
- Windows是靠消息驱动的,那么是否存在休眠/睡眠唤醒状态转换的消息呢,答案是有的,Windows就提供了相关的消息:WM_POWERBROADCAST wparam参数确定了休眠/睡眠 唤醒状态。只要在启动进程前创建一个窗口线程,监听这个消息,就能判断出状态是否发生改变,设置标志变量,进行逻辑处理。
参考:https://blog.csdn.net/wangkui1331/article/details/79446505