#c#
#c#
Вопрос:
как я могу отключить «разрешить гибридный режим сна» в расширенных настройках питания? с помощью c # вручную: параметры питания -> изменить настройки плана -> изменить дополнительные настройки питания-> Режим сна-> «Разрешить гибридный режим сна» -> подключен: ВЫКЛЮЧЕН
Комментарии:
1. Имейте в виду, что «Гибридный режим сна» — это просто «Сон» в Windows 7.
2. @Polynomial, ты уверен? Я использую ОС win7, и поэтому кажется, что «Разрешить гибридный режим сна»
3. Да, опция питания есть, но когда вы на самом деле нажимаете кнопку «Режим сна», он будет либо выполнять обычный, либо гибридный режим сна в зависимости от этого параметра питания.
4. Это лучше всего сделать с помощью групповой политики
Ответ №1:
Если вы ориентируетесь на сервер Windows 7/2008, вы можете использовать WMI и класс Win32_PowerSetting. Ниже приведен код, который это делает. Обязательно добавьте ссылку на сборку и using
директиву System.Management
.
private bool SetAllowHybridSleep(bool enabled)
{
//Machine to work on, "." for local
string RemotePC = ".";
//Set the namespace to the power namespace, used throughout the function
ManagementScope ms = new ManagementScope(@"\" RemotePC @"rootcimv2power");
//Will hold each of our queries
ObjectQuery oq = null;
//Will hold the values of our power plan and the specific setting that we want to change
Guid PowerPlanInstanceId = Guid.Empty;
string PowerSettingInstanceId = null;
//Look for the specific setting that we want
oq = new ObjectQuery(string.Format("SELECT * FROM Win32_PowerSetting WHERE ElementName = 'Allow hybrid sleep'"));
using (ManagementObjectSearcher mos = new ManagementObjectSearcher(ms, oq))
{
ManagementObjectCollection results = mos.Get();
foreach (ManagementObject obj in results)
{
foreach (PropertyData p in obj.Properties)
{
if (p.Name == "InstanceID")
{
//This will give us a string with a GUID specific to our setting
PowerSettingInstanceId = p.Value.ToString();
break;
}
}
}
}
//Sanity check
if (string.IsNullOrEmpty(PowerSettingInstanceId))
{
Console.WriteLine("System does not support hybrid sleep");
return false;
}
//Look for the active power scheme
oq = new ObjectQuery("SELECT * FROM Win32_PowerPlan WHERE IsActive=True");
using (ManagementObjectSearcher mos = new ManagementObjectSearcher(ms, oq))
{
ManagementObjectCollection results = mos.Get();
foreach (ManagementObject obj in results)
{
foreach (PropertyData p in obj.Properties)
{
if (p.Name == "InstanceID")
{
//The instance contains a string with a GUID inside of it, use the code below to get the GUID by itself
if (!Guid.TryParse(System.Text.RegularExpressions.Regex.Match(p.Value.ToString(), @"{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}").Value, out PowerPlanInstanceId))
{
Console.WriteLine("Could not find active power plan");
return false;
}
break;
}
}
}
}
//Now we need to update the actual power setting in the active plan
//Get all power schemes for the target setting
oq = new ObjectQuery(string.Format("ASSOCIATORS OF {{Win32_PowerSetting.InstanceID="{0}"}} WHERE ResultClass = Win32_PowerSettingDataIndex", PowerSettingInstanceId.Replace(@"", @"\")));
using (ManagementObjectSearcher mos = new ManagementObjectSearcher(ms, oq))
{
ManagementObjectCollection results = mos.Get();
foreach (ManagementObject obj in results)
{
foreach (PropertyData p in obj.Properties)
{
//See if the current scheme is the current setting. This will happen twice, once for AC and once for DC
if (p.Name == "InstanceID" amp;amp; p.Value.ToString().Contains(PowerPlanInstanceId.ToString()))
{
//Change the value of the current setting
obj.SetPropertyValue("SettingIndexValue", (enabled ? "1" : "0"));
obj.Put();
break;
}
}
}
}
return true;
}
Ответ №2:
Используя procmon, мне удалось выяснить, что за это на моем компьютере отвечает следующий раздел реестра.
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerPowerSettings238C9FA8-0AAD-41ED-83F4-97BE242C8F2094ac6d29-73ce-41a6-809f-6363ba21b47e
Вероятно, вам придется провести некоторые исследования на своем компьютере, чтобы понять, как это работает для вас.
Для этого вы также можете вызвать утилиту powercfg. Каждая настройка мощности определяется тремя параметрами:
- GUID профиля питания
- GUID подгруппы профилей
- GUID настройки
Вы можете использовать powercfg -QUERY
для создания полного списка значений.
После того, как у вас есть идентификатор GUID профиля, который вы хотите отредактировать, идентификатор GUID подгруппы (в данном случае подгруппы сна) и идентификатор GUID настройки (Разрешить гибридный режим сна), вы можете использовать либо powercfg -SETACVALUEINDEX
для подключенного, либо powercfg -SETDCVALUEINDEX
для включенного аккумулятора, чтобы установить значение.
В моем случае (Win7 Ultimate x64) вы можете отключить его с помощью:
powercfg -SETACVALUEINDEX 381b4222-f694-41f0-9685-ff5bb260df2e 238c9fa8-0aad-41ed-83f4-97be242c8f20 94ac6d29-73ce-41a6-809f-6363ba21b47e 1
Это переводит значение AcSettingIndex в:
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPowerPowerSettings238C9FA8-0AAD-41ED-83F4-97BE242C8F2094AC6D29-73CE-41A6-809F-6363BA21B47EDefaultPowerSchemeValues381b4222-f694-41f0-9685-ff5bb260df2e
Комментарии:
1. В любом случае, манипулирование записью реестра или использование powercfg выполнят эту работу.
2. api управления питанием — это правильный подход к заданному вопросу, но групповая политика звучит более эффективно
3. @DavidHeffernan — я склонен перепроектировать все только ради этого 😉
4. @DavidHeffernan — Конечно. Я не касался API управления питанием, поэтому решил разобраться, как это сделали панель управления и powercfg. Не хотите ли опубликовать ответ с подробным описанием того, как это можно сделать с помощью API управления питанием?
5. Рад, что я немного помог 🙂