【问题标题】:Identify if power state change is caused by user or by power policy确定电源状态更改是由用户还是由电源策略引起的
【发布时间】:2014-07-24 09:33:29
【问题描述】:
我正在用 Python 编写一个 Windows 服务,该服务需要知道,当电源状态事件发生时,是什么原因造成的。这可能是用户或电源策略。
现在,我使用 WM_POWERBROADCAST 成功检测到了这些事件,但我没有找到任何关于实现目标的方法的文档。
这是我目前的线索:
当用户手动打开计算机时,用户确实需要输入数据。在用户空间中,这可以通过GetLastInputInfo 函数检测到。因此,当电源事件发生时,如果最后用户输入是最近的,则电源变化是由用户引起的。这在会话 0 上执行的服务中不起作用,这是一个问题。我可以使用CreateProcessAsUser 函数,但我想避免它。
是否有适当的方法来检测挂起/关闭消息是否是 Windows 服务中电源策略的结果?
更新:我尝试了 GetLastInputInfo,但当用户使用电源按钮时它实际上不起作用(至少在我的计算机上没有)。
【问题讨论】:
标签:
python
windows
winapi
windows-services
【解决方案1】:
我最终使用了 CallNtPowerInformation:
class SYSTEM_POWER_INFORMATION(Structure):
_fields_ = [
("MaxIdlenessAllowed", c_ulong),
("Idleness", c_ulong),
("TimeRemaining", c_ulong),
("CoolingMode", c_ubyte)
]
call_nt_power_information = windll.powrprof.CallNtPowerInformation
call_nt_power_information.restype = c_uint
def get_idle_timer():
# Get the time remaining before idle
info = SYSTEM_POWER_INFORMATION()
r = call_nt_power_information(SystemPowerInformation, None, 0, pointer(info), sizeof(SYSTEM_POWER_INFORMATION))
if r != 0:
raise Exception("Call to CallNtPowerInformation failed with code " + r)
return info.TimeRemaining
如果在 Windows 认为系统空闲时发生电源事件,我假设它是由电源方案启动的。当然,这并不理想,但在大多数情况下都有效。我仍然有兴趣找到更好的方法,但似乎没有。