You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需管理员权限获取powercfg -requests命令的相关信息

无需管理员权限检测Windows系统电源请求与空闲状态方案

针对你开发屏保应用时遇到的问题,以下是几个无需管理员权限的可行方案:

1. 调用Windows原生API PowerGetRequestList 查询显示保持请求

powrprof.dll 中的 PowerGetRequestList API 支持在当前用户会话下查询电源请求,无需管理员权限。它可以直接获取是否有应用请求保持显示器活跃,完美替代需要权限的 powercfg -requests 命令。

以C#为例,通过P/Invoke实现的代码如下:

using System;
using System.Runtime.InteropServices;

public static class PowerRequestHelper
{
    [DllImport("powrprof.dll", SetLastError = true)]
    private static extern uint PowerGetRequestList(IntPtr sessionHandle, uint requestType, IntPtr buffer, ref uint bufferSize);

    private const uint POWER_REQUEST_TYPE_DISPLAY = 0x00000002;
    private const int STATUS_SUCCESS = 0;
    private const uint ERROR_INSUFFICIENT_BUFFER = 0x8007007A;

    public static bool HasActiveDisplayRequests()
    {
        uint bufferSize = 0;
        // 先获取所需缓冲区大小
        uint result = PowerGetRequestList(IntPtr.Zero, POWER_REQUEST_TYPE_DISPLAY, IntPtr.Zero, ref bufferSize);
        if (result != STATUS_SUCCESS && result != ERROR_INSUFFICIENT_BUFFER)
            return false;

        IntPtr buffer = Marshal.AllocHGlobal((int)bufferSize);
        try
        {
            result = PowerGetRequestList(IntPtr.Zero, POWER_REQUEST_TYPE_DISPLAY, buffer, ref bufferSize);
            if (result != STATUS_SUCCESS)
                return false;

            // 读取请求条目数量,大于0则说明有应用持有显示唤醒锁
            uint requestCount = Marshal.ReadUInt32(buffer);
            return requestCount > 0;
        }
        finally
        {
            Marshal.FreeHGlobal(buffer);
        }
    }
}

2. 检测多媒体播放状态

针对视频/音频播放器这类无输入但需要保持屏幕活跃的场景,可以直接检测系统中是否有正在播放的媒体内容。使用Windows UWP的Windows.Media.Playback命名空间即可实现,无需权限:

using Windows.Media.Playback;

public static bool IsMediaCurrentlyPlaying()
{
    foreach (var session in MediaPlayer.PlaybackSessionManager.GetPlaybackSessions())
    {
        if (session.PlaybackState == MediaPlaybackState.Playing)
            return true;
    }
    return false;
}

3. 结合空闲时间检测实现完整逻辑

将上述方法与传统的空闲时间检测(GetLastInputInfo API)结合,即可实现准确的屏保启动判定:

  1. 用GetLastInputInfo获取用户无输入的时长
  2. 若时长达到屏保触发阈值,再检查是否有活跃的显示请求或媒体播放
  3. 只有当无活跃请求且无媒体播放时,才启动屏保

内容的提问来源于stack exchange,提问作者OrangeJedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:20:35