确定电源状态更改是由用户还是由电源策略引起的

2024-10-03 19:28:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python编写一个windows服务,这个服务需要知道,当电源状态事件发生时,是什么导致的。这可能是用户或电源策略。 现在,我使用WM_POWERBROADCAST成功地检测到事件,但是我没有找到任何关于实现我目标的方法的文档。在

这是我目前的线索: 当用户手动打开计算机时,用户确实需要输入数据。在用户空间中,可以使用GetLastInputInfo函数检测到这一点。因此,当电源事件发生时,如果最后一次用户输入是最近的,则电源更改是由用户引起的。这在会话0上执行的服务中不起作用,这是一个问题。我可以使用CreateProcessAsUser函数,但我想避免它。在

有没有合适的方法来检测挂起/关机消息是否是windows服务中电源策略的结果?在

更新:我尝试了GetLastInputInfo,当用户使用电源按钮时,它实际上不起作用(至少在我的电脑上没有)。在


Tags: 方法函数用户文档目标windows状态事件
1条回答
网友
1楼 · 发布于 2024-10-03 19:28:08

最后我使用了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认为系统空闲时发生了电源事件,那么我认为它是由电源方案启动的。当然,这并不理想,但在大多数情况下都有效。我仍然有兴趣找到更好的方法,但似乎没有

相关问题 更多 >