在我几年前写的应用程序中,我使用函数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,但它从未返回我在控制面板中为监视器超时设置的值的正确数字。
我希望我完全错了,并且有一种更简单的方法。
答案 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中可用,但您需要重新编程以获取您的值,