【发布时间】: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