如何无需管理员权限获取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)结合,即可实现准确的屏保启动判定:
- 用
GetLastInputInfo获取用户无输入的时长 - 若时长达到屏保触发阈值,再检查是否有活跃的显示请求或媒体播放
- 只有当无活跃请求且无媒体播放时,才启动屏保
内容的提问来源于stack exchange,提问作者OrangeJedi
相关产品推荐
相关产品推荐

