如何在vista上获得监视器超时

时间:2009-02-22 19:54:50

标签: c# winapi windows-vista

在我几年前写的应用程序中,我使用函数SystemParametersInfo和SPI_GETPOWEROFFTIMEOUT来关闭监视器的超时。在Vista上,这不再适用了。

所以我决定在Vista上完成这项工作,但几个小时后我觉得我已经没有接近解决方案了。

我要提及的大部分功能都在http://msdn.microsoft.com/en-us/library/aa373163(VS.85).aspx

中描述

根据我的理解,我应该: 1.使用PowerGetActiveScheme函数获取当前方案 2.将PowerEnumerate与GUID_VIDEO_SUBGROUP一起使用 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,即使我切换电源方案。我还尝试使用增量值运行ReadPwrScheme(1,2,3)。我得到5或6,但它从未返回我在控制面板中为监视器超时设置的值的正确数字。

我希望我完全错了,并且有一种更简单的方法。

2 个答案:

答案 0 :(得分:2)

我终于确实运气好了,发现了一个适用于XP和Vista的功能 - GetCurrentPowerPolicies。调用并返回很多当前设置非常简单,包括我想要VideoTimeoutAc和VideoTimeoutDc的设置。

答案 1 :(得分:0)

我认为它们已在VISTA中停止使用,

您需要使用WM_POWERBROADCAST

编写Power-Aware应用程序

中给出的

http://msdn.microsoft.com/en-us/library/ms700612(VS.85).aspx

http://msdn.microsoft.com/en-us/library/ms703398(VS.85).aspx

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