【问题标题】:How to get monitor timeout on vista如何在vista上获得监视器超时
【发布时间】:2009-02-22 19:54:49
【问题描述】:

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

所以我决定在 Vista 上完成这项工作,但几个小时后,我觉得我离解决方案还差得远。

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

据我了解,我应该: 1.使用PowerGetActiveScheme函数,获取当前方案 2. 使用带有 GUID_VIDEO_SUBGROUP 的 PowerEnumerate 3.使用PowerReadACValue(或DC值)获取值。

这是对的吗?似乎需要做很多工作才能达到一个设置。如果这是正确的方法,那么我不明白一件事。在我的系统上 PowerEnumerate 返回 3 个键。我怎么知道哪个是 Monitor timeout?

到目前为止,这是我的代码。我在使用 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 上使用 GetActivePwrScheme 很幸运。

标签: c# winapi windows-vista


【解决方案1】:

我终于幸运地找到了一个在 XP 和 Vista 上都可以使用的函数——GetCurrentPowerPolicies。调用非常简单,返回了很多当前的设置,包括我想要的VideoTimeoutAc和VideoTimeoutDc的设置。

【讨论】:

    【解决方案2】:

    我认为它们在 VISTA 中已停产,

    您需要使用 WM_POWERBROADCAST 编写 Power-Aware Application

    中给出

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

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

    示例应用程序的概念在codeproject 中提供,但您需要重新编程才能获得您的值,

    【讨论】:

    • 我实际上想进入一个设置,而不是接收电源事件。我假设当用户更改监视器超时设置时我会收到事件?不过感谢代码项目链接,我会看看它,希望我能对如何进入这个设置有另一个想法。
    • 是的,您将收到基于用户更改的事件.. 并通过代码项目链接,您将获得实施的想法。
    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2019-11-07
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多