Выключение, перезагрузка, переход в ждущий режим - C#
Формулировка задачи:
Как сделать программно: Выключение, Перезагрузку и переход в ждущий режим?
Решение задачи: «Выключение, перезагрузка, переход в ждущий режим»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using System.Runtime.Remoting.Channels.Http;
using Remot_Time;
namespace reboot
{
public partial class Form1 : Form
{
int timer,chas,min,sek,x;
public Form1()
{
InitializeComponent();
}
//обьявляем джина
static AgentObjects.IAgentCtlCharacterEx myGenie;
static String DATAPATH_1 = "Genie.acs";
//обьявляем член интерфейса agent
private AgentObjects.Agent myAgentController;
//глобальная переменная любого текста персонажа
static String mySpeach;
Object myObject = null;
class reboot
{
//импортируем API функцию InitiateSystemShutdown
[DllImport("advapi32.dll", EntryPoint = "InitiateSystemShutdownEx")]
static extern int InitiateSystemShutdown(string lpMachineName, string lpMessage, int dwTimeout, bool bForceAppsClosed, bool bRebootAfterShutdown);
//импортируем API функцию AdjustTokenPrivileges
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
//импортируем API функцию GetCurrentProcess
[DllImport("kernel32.dll", ExactSpelling = true)]
internal static extern IntPtr GetCurrentProcess();
//импортируем API функцию OpenProcessToken
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
//импортируем API функцию LookupPrivilegeValue
[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);
//импортируем API функцию LockWorkStation
[DllImport("user32.dll", EntryPoint = "LockWorkStation")]
static extern bool LockWorkStation();
//объявляем структуру TokPriv1Luid для работы с привилегиями
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}
//объявляем необходимые, для API функций, константые значения, согласно MSDN
internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
internal const int TOKEN_QUERY = 0x00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
//функция SetPriv для повышения привилегий процесса
private void SetPriv()
{
TokPriv1Luid tkp; //экземпляр структуры TokPriv1Luid
IntPtr htok = IntPtr.Zero;
//открываем "интерфейс" доступа для своего процесса
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok))
{
//заполняем поля структуры
tkp.Count = 1;
tkp.Attr = SE_PRIVILEGE_ENABLED;
tkp.Luid = 0;
//получаем системный идентификатор необходимой нам привилегии
LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tkp.Luid);
//повышем привилигеию своему процессу
AdjustTokenPrivileges(htok, false, ref tkp, 0, IntPtr.Zero, IntPtr.Zero);
}
}
//публичный метод для перезагрузки/выключения машины
public int halt(bool RSh, bool Force)
{
SetPriv(); //получаем привилегия
//вызываем функцию InitiateSystemShutdown, передавая ей необходимые параметры
return InitiateSystemShutdown(null, null, 0, Force, RSh);
}
//публичный метод для блокировки операционной системы
public int Lock()
{
if (LockWorkStation())
return 1;
else
return 0;
}
}
private void button1_Click(object sender, EventArgs e)
{
x = 2;
timer = Convert.ToInt32(numericUpDown1.Value)*60*60 + Convert.ToInt32(numericUpDown2.Value) * 60 + Convert.ToInt32(numericUpDown3.Value);
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (timer > 0)
{
timer --;
chas = timer/(60*60);
min = timer / 60;
sek = timer % 60;
label2.Text = "Осталось: " + chas.ToString() + " Часов:" + min.ToString() + " Минут:" + sek.ToString() + " Секунд";
}
else
{
label2.Text = "Выполнение Задачи!";
reboot r = new reboot(); //Создаете объект класса reboot
if(x==1)
r.halt(true, false);// и тут параметры уже укажите сами (true, false) выключение или перезагрузка осуществляется изменением true и false
if(x==2)
r.halt(false, false); // и тут параметры уже укажите сами (false, false)
this.Hide();
}
}
private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = !System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), @"[0,1,2,3,4,5,6,7,8,9,\b]");
}
private void button2_Click(object sender, EventArgs e)
{
x = 1;
timer = Convert.ToInt32(numericUpDown1.Value)*60*60 + Convert.ToInt32(numericUpDown2.Value) * 60 + Convert.ToInt32(numericUpDown3.Value);
timer1.Enabled = true;
}
private void button3_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
// label3.Text = e.X.ToString() + " " + e.Y.ToString();
}
private void button4_Click(object sender, EventArgs e)
{
//загружаем персонаж в элемент управления axAgent1
axAgent1.Characters.Load("Genie", DATAPATH_1);
myGenie = axAgent1.Characters.Character("Genie");
myGenie.MoveTo(Convert.ToInt16(this.Location.X + 1), Convert.ToInt16(this.Location.Y + 1), 100);
myGenie.Show(0);
mySpeach = "Здравствуйте меня зовут Алимба Алимбаевич. Я вам подскажу как нужно обращаться с этой программой!";
myGenie.Speak(mySpeach, myObject);
myGenie.Play("Congratulate_2");
mySpeach = "В этих трех колонках нужно выбрать время через которое компьютер будет отключен или перезагружен.";
myGenie.MoveTo(Convert.ToInt16(this.Location.X + 230), Convert.ToInt16(this.Location.Y + 20), 100);
myGenie.Play("GestureRight");
myGenie.Speak(mySpeach, myObject);
myGenie.MoveTo(Convert.ToInt16(this.Location.X + 100), Convert.ToInt16(this.Location.Y + 90), 100);
mySpeach = "Если нажать на кнопку под названием Выключение компьютер будет выключен через заданное колличество времени.";
myGenie.Play("GestureRight");
myGenie.Speak(mySpeach, myObject);
myGenie.MoveTo(Convert.ToInt16(this.Location.X + 220), Convert.ToInt16(this.Location.Y + 90), 100);
mySpeach = "Если нажать на кнопку перезагрузка то компьютер перезагрузиться через заданное колличество времени.";
myGenie.Play("GestureRight");
myGenie.Speak(mySpeach, myObject);
myGenie.MoveTo(Convert.ToInt16(this.Location.X + 100), Convert.ToInt16(this.Location.Y + 115), 100);
mySpeach = "Если нажать кнопку Выход то вы выйдете из программы.";
myGenie.Play("GestureRight");
myGenie.Speak(mySpeach, myObject);
myGenie.MoveTo(Convert.ToInt16(this.Location.X + 265), Convert.ToInt16(this.Location.Y + 103), 100);
mySpeach = "Если нажать на кнопку справка то вы снова увидите меня - своего гида, и я не поленюсь показать и рассказать вам все снова. Досвиданья и удачи вам!";
myGenie.Play("GestureRight");
myGenie.Speak(mySpeach, myObject);
myGenie.Hide(0);
}
private void Form1_Load(object sender, EventArgs e)
{
// try
//{
ChannelServices.RegisterChannel(new HttpChannel(60000));
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteTime), "Host", WellKnownObjectMode.Singleton);
label3.Text = "Сервер работает. Канал прослушивается!";
//}
//catch { label3.Text = "Сервер не работает. Канал не прослушивается!"; }
}
}
}