Ich habe mir jetzt eine zwischen Lösung mit Registry lesen und powercfg als Process einfallen lassen. Es wird auch der Wert geändert und in der Systemsteuerung der neu gewählte Wert 'Nichts unternehmen' angezeigt, aber wenn ich den Netzschalter drücke wird der PC trotzdem heruntergefahren.
hier meine Klasse dazu:
Code:
using Microsoft.Win32;using System;
using System.Diagnostics;
namespace Netzschalter
{
class PowerCfg
{
public enum Index { ACSetting, DCSetting }
public static Nullable<int> Get(Index index)
{
String[] valueNames = { "ACSettingIndex", "DCSettingIndex" };
var schema = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Power\User\PowerSchemes", "ActivePowerScheme", null);
if ( schema == null) return null;
if (schema.ToString() != "381b4222-f694-41f0-9685-ff5bb260df2e")
{
ErrorLog.write("ActivePowerScheme != 381b4222-f694-41f0-9685-ff5bb260df2e", "PowerCfg.Get()");
return null;
}
Nullable<int> res = null;
try {
res = (int) Registry.GetValue(@"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Power\User\PowerSchemes\381b4222-f694-41f0-9685-ff5bb260df2e\4f971e89-eebd-4455-a8de-9e59040e7347\7648efa3-dd9c-4e3e-b566-50f929386280", valueNames[((int)index)], null);
}
catch(Exception e)
{
ErrorLog.write(e.Message, "PowerCfg.Get()");
return null;
}
return res;
}
public static bool Set(Index index, int value)
{
if (value < -1 || value > 4) throw new ArgumentOutOfRangeException("value");
if (value == -1) return true;
if (Get(index) != value)
{
try
{
Process cmd = new Process();
cmd.StartInfo.FileName = "powercfg";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.Arguments = index == Index.ACSetting ? "-setacvalueindex" : "-setdcvalueindex";
cmd.StartInfo.Arguments += " 381b4222-f694-41f0-9685-ff5bb260df2e 4f971e89-eebd-4455-a8de-9e59040e7347 7648efa3-dd9c-4e3e-b566-50f929386280 " + value.ToString();
cmd.Start();
}
catch (Exception e)
{
ErrorLog.write(e.Message, "PowerCfg.Set()");
return false;
}
return true;
}
return false;
}
}
}