C# 如何在vista上获取监视器超时

C# 如何在vista上获取监视器超时,c#,winapi,windows-vista,C#,Winapi,Windows Vista,在几年前我编写的一个应用程序中,我使用函数SystemParametersInfo和SPI_GETPOWEROFFTIMEOUT来获取监视器关闭的超时。在Vista上,这已经不起作用了 所以我决定在Vista上实现这一点,但几个小时后,我觉得我还没有找到解决方案 我将要提到的大多数功能都在 据我所知,我应该: 1.使用函数PowerGetActiveScheme获取当前方案 2.将PowerEnumerate与GUID\u VIDEO\u子组一起使用 3.使用PowerReadACValue(或

在几年前我编写的一个应用程序中,我使用函数SystemParametersInfo和SPI_GETPOWEROFFTIMEOUT来获取监视器关闭的超时。在Vista上,这已经不起作用了

所以我决定在Vista上实现这一点,但几个小时后,我觉得我还没有找到解决方案

我将要提到的大多数功能都在

据我所知,我应该: 1.使用函数PowerGetActiveScheme获取当前方案 2.将PowerEnumerate与GUID\u VIDEO\u子组一起使用 3.使用PowerReadACValue(或DC值)获取该值

是这样吗?看起来要达到一个场景需要做很多工作。如果这是正确的方法,有一件事我不明白。在我的系统上,PowerEnumerate返回3个键。我如何知道哪一个是监视器超时

这是到目前为止我的代码。我在PowerReadACValue方面遇到了问题,我可能没有正确定义或使用它

class Program
{
    [DllImport("powrprof.dll")]
    static extern UInt32 PowerGetActiveScheme(IntPtr UserRootPowerKey, ref IntPtr ActivePolicyGuid);

    [DllImport("powrprof.dll")]
    static extern uint PowerEnumerate(
                IntPtr RootPowerKey,
                IntPtr SchemeGuid,
                Guid SubGroupOfPowerSettingGuid,
                UInt32 AcessFlags,
                UInt32 Index,
                ref Guid Buffer,
                ref UInt32 BufferSize);

    [DllImport("powrprof.dll")]
    static extern uint PowerReadACValue(
                IntPtr RootPowerKey,
                IntPtr SchemeGuid,
                IntPtr SubGroupOfPowerSettingGuid,
                Guid PowerSettingGuid,
                ref IntPtr Type,
                ref IntPtr Buffer,
                ref UInt32 BufferSize);

    static void Main(string[] args)
    {
        IntPtr activeGuidPtr = IntPtr.Zero;
        uint res = PowerGetActiveScheme(IntPtr.Zero, ref activeGuidPtr);
        if (res == 0)
        {
            Guid VideoSettingGuid = new Guid();
            UInt32 index = 0;
            UInt32 BufferSize = (UInt32)Marshal.SizeOf(typeof(Guid));
            while (0 == PowerEnumerate(
                IntPtr.Zero, activeGuidPtr, new Guid("7516b95f-f776-4464-8c53-06167f40cc99"), 18, index, ref VideoSettingGuid, ref BufferSize))
            {
                Console.Write(VideoSettingGuid.ToString() + ": ");

                UInt32 size = 1024;
                IntPtr temp = Marshal.AllocHGlobal(1024);
                IntPtr type = IntPtr.Zero;

                PowerReadACValue(IntPtr.Zero, activeGuidPtr, IntPtr.Zero, VideoSettingGuid, ref type, ref temp, ref size);

                Console.Write(Marshal.PtrToStringUni(temp));
                Marshal.FreeHGlobal(temp);
                index++;
            }
        }
    }
}
我还尝试使用GetActivePwrScheme,然后使用ReadPwrScheme,但它似乎也不起作用。GetActivePwrScheme始终返回0,即使我切换了电源方案。我还尝试使用增量值(1,2,3)运行ReadPwrScheme。我得到了5或6,但它从未返回我在控制面板中设置的监视器超时值的正确数字


我希望我完全弄错了,有一种更简单的方法可以做到这一点。

我认为它们在VISTA中已经停产了

您需要使用WM_POWERBROADCAST编写电源感知应用程序


示例应用程序的概念在中可用,但您需要重新编程以获取您的值,

我终于运气好,找到了一个既适用于XP又适用于Vista的函数-GetCurrentPowerPolicys。调用并返回许多当前设置非常简单,包括我想要的VideoTimeoutAc和VideoTimeoutDc设置。

我很幸运在Vista上使用了GetActivePwrScheme。我实际上希望获得一个设置,而不是接收电源事件。我假设当用户更改监视器超时设置时,我会收到一个事件?不过,感谢codeproject链接,我会看一看,希望我能对如何使用此设置有另一个想法。是的,您将收到基于用户更改的事件。。并且通过代码项目链接,你们会得到实现的想法。