我正在用Python编写一个Windows服务,这个服务需要知道,当一个电源状态事件发生时,是什么引起了它。这可以是用户或电源政策。 现在,我使用WM_POWERBROADCAST成功检测到事件,但我没有找到任何关于实现目标的方法的文档。
这是我目前的领导: 当用户手动关闭计算机时,用户必须输入数据。在用户空间中,可以使用GetLastInputInfo功能检测到这一点。因此,当发生电源事件时,如果最近的用户输入是最近的,则电源改变是由用户引起的。这在会话0上执行的服务中不起作用,这是一个问题。我可以使用CreateProcessAsUser函数,但我想避免它。
是否有正确的方法来检测挂起/关闭消息是否是Windows服务中电源策略的结果?
更新:我尝试了GetLastInputInfo,当用户使用电源按钮(至少不在我的电脑上)时,它实际上不起作用。
答案 0 :(得分:0)
我最终使用了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视为空闲时发生电源事件,我认为它是由电源方案启动的。当然,这并不理想,但在大多数情况下都适用。我仍然有兴趣找到一个更好的方法,但似乎没有。