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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-19
      • 2011-10-18
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      相关资源
      最近更新 更多