首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >识别电源状态是否是由用户或电源策略引起的。

识别电源状态是否是由用户或电源策略引起的。
EN

Stack Overflow用户
提问于 2014-07-24 09:33:29
回答 1查看 462关注 0票数 0

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

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

是否有正确的方法来检测挂起/关闭消息是否是windows服务中的电源策略的结果?

更新:我尝试过GetLastInputInfo,当用户使用电源按钮(至少在我的计算机上)时,它实际上不能工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-11 09:19:23

我最后使用了CallNtPowerInformation:

代码语言:javascript
复制
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

如果当系统被窗口视为空闲时发生电源事件,我假设它是由电源方案发起的。当然,这并不理想,但在大多数情况下都有效。我仍然有兴趣找到一个更好的方法,但似乎没有。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24930082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档