程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#完成關機重啟及刊出實例代碼

C#完成關機重啟及刊出實例代碼

編輯:C#入門知識

C#完成關機重啟及刊出實例代碼。本站提示廣大學習愛好者:(C#完成關機重啟及刊出實例代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是C#完成關機重啟及刊出實例代碼正文


本文所述的C#實例代碼是一個基於Visual C#2010編寫的關機、重啟、刊出法式,相似的C#法式網上還有很多,每一個人的寫法都各有分歧,這段法式供老手參考下。本代碼中還用到了一個計時器,用來顯示體系運轉的時光,以下為完全實例代碼:

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using System.Threading;
namespace shutdowncodes
{
 public class Form1 : System.Windows.Forms.Form
 {
 private System.Windows.Forms.GroupBox groupBox1;
 private System.Windows.Forms.TextBox textBox1;
 private System.Windows.Forms.Button button1;
 private System.Windows.Forms.Button button2;
 private System.Windows.Forms.Button button3;
 private System.ComponentModel.IContainer components;
 [StructLayout(LayoutKind.Sequential, Pack=1)]
 public struct TokPriv1Luid
 {
  public int Count;
  public long Luid;
  public int Attr;
 }
 [DllImport("kernel32.dll", ExactSpelling=true)]
  // GetCurrentProcess函數前往以後過程的一個句柄
 public static extern IntPtr GetCurrentProcess();
 [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true)]
  // OpenProcessToken函數翻開一個過程的拜訪代號
 public static extern bool OpenProcessToken(IntPtr ProcessHandles, int DesiredAccess, ref IntPtr TokenHandle);
 [DllImport("advapi32.dll", SetLastError=true)]
  // LookupPrivilegeValue函數取得當地獨一的標示符(LUID),用於在特定的體系中
  // 表現特定的優先權。
 public static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, ref long lpLuid);
 // AdjustTokenPrivileges函數許可或許禁用指定拜訪記號的優先權。
 // 許可或許禁用優先權須要TOKEN_ADJUST_PRIVILEGES拜訪權限。
 [DllImport("advapi32.dll", ExactSpelling=true, SetLastError=true)]
 public static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges, ref TokPriv1Luid NewState, int BufferLength, IntPtr PreviousState,IntPtr ReturnLength);
 // ExitWindowsEx函數可以刊出,關機或許從新啟動體系
 [DllImport("user32.dll", ExactSpelling=true, SetLastError=true)]
 public static extern bool ExitWindowsEx(int flg, int rea);
 private System.Threading.Timer timer;
 private const int SE_PRIVILEGE_ENABLED = 0x00000002;
 private const int TOKEN_QUERY = 0x00000008;
 private const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
 private const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
 private const int EWX_LOGOFF = 0x00000000;   // 刊出
 private const int EWX_SHUTDOWN = 0x00000001;  // 關機
 private const int EWX_REBOOT = 0x00000002;   // 重啟
 private const int EWX_FORCE = 0x00000004;
 private static void RebootCommand(int flg)
 {
  bool ok;
  TokPriv1Luid tp;
  IntPtr hproc = GetCurrentProcess(); // 獲得以後的過程
  IntPtr htok = IntPtr.Zero;
  ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
  tp.Count = 1;
  tp.Luid = 0;
  tp.Attr = SE_PRIVILEGE_ENABLED;
  ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
  ok = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
  ok = ExitWindowsEx(flg, 0);
 }
 public Form1()
 {
  InitializeComponent();
 }
 protected override void Dispose( bool disposing )
 {
  if( disposing )
  {
  if (components != null)
  {
   components.Dispose();
  }
  }
  base.Dispose( disposing );
 }
 #region Windows 窗體設計器生成的代碼
 private void InitializeComponent()
 {
  this.groupBox1 = new System.Windows.Forms.GroupBox();
  this.textBox1 = new System.Windows.Forms.TextBox();
  this.button1 = new System.Windows.Forms.Button();
  this.button2 = new System.Windows.Forms.Button();
  this.button3 = new System.Windows.Forms.Button();
  this.groupBox1.SuspendLayout();
  this.SuspendLayout();
  //
  // groupBox1
  //
  this.groupBox1.Controls.Add(this.textBox1);
  this.groupBox1.Location = new System.Drawing.Point(48, 24);
  this.groupBox1.Name = "groupBox1";
  this.groupBox1.Size = new System.Drawing.Size(192, 56);
  this.groupBox1.TabIndex = 0;
  this.groupBox1.TabStop = false;
  this.groupBox1.Text = "體系已運轉時光";
  //
  // textBox1
  //
  this.textBox1.Location = new System.Drawing.Point(24, 24);
  this.textBox1.Name = "textBox1";
  this.textBox1.ReadOnly = true;
  this.textBox1.Size = new System.Drawing.Size(152, 21);
  this.textBox1.TabIndex = 1;
  this.textBox1.Text = "";
  //
  // button1
  //
  this.button1.Location = new System.Drawing.Point(16, 112);
  this.button1.Name = "button1";
  this.button1.Size = new System.Drawing.Size(64, 32);
  this.button1.TabIndex = 1;
  this.button1.Text = "封閉體系";
  this.button1.Click += new System.EventHandler(this.button1_Click);
  //
  // button2
  //
  this.button2.Location = new System.Drawing.Point(112, 112);
  this.button2.Name = "button2";
  this.button2.Size = new System.Drawing.Size(64, 32);
  this.button2.TabIndex = 2;
  this.button2.Text = "刊出體系";
  this.button2.Click += new System.EventHandler(this.button2_Click);
  //
  // button3
  //
  this.button3.Location = new System.Drawing.Point(208, 112);
  this.button3.Name = "button3";
  this.button3.Size = new System.Drawing.Size(64, 32);
  this.button3.TabIndex = 3;
  this.button3.Text = "重啟體系";
  this.button3.Click += new System.EventHandler(this.button3_Click);
  //
  // Form1
  //
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
  this.ClientSize = new System.Drawing.Size(296, 173);
  this.Controls.Add(this.button3);
  this.Controls.Add(this.button2);
  this.Controls.Add(this.button1);
  this.Controls.Add(this.groupBox1);
  this.Name = "Form1";
  this.Text = "簡略的關機法式";
  this.Load += new System.EventHandler(this.Form1_Load);
  this.groupBox1.ResumeLayout(false);
  this.ResumeLayout(false);
 }
 #endregion
 /// <summary>
 /// 運用法式的主進口點。
 /// </summary>
 [STAThread]
 static void Main()
 {
  Application.Run(new Form1());
 }
 private void button1_Click(object sender, System.EventArgs e)
 {
  RebootCommand(EWX_SHUTDOWN + EWX_FORCE);
 }
 private void button2_Click(object sender, System.EventArgs e)
 {
  RebootCommand(EWX_LOGOFF + EWX_FORCE);
 }
 private void button3_Click(object sender, System.EventArgs e)
 {
  RebootCommand(EWX_REBOOT + EWX_FORCE);
 }
 private void Form1_Load(object sender, System.EventArgs e)
 {
  textBox1.Text = (Environment.TickCount / (1000 * 60)).ToString() + "分鐘";
  // 每1秒鐘更新一次TextBox上顯示的體系運轉時光
  timer = new System.Threading.Timer(new TimerCallback(OnTimer), null, 0, 1000);
 }
 // 取得體系已運轉的時光
 private void OnTimer(object state)
 {
  textBox1.Text = (Environment.TickCount / (1000 * 60)).ToString() + "分鐘";
  textBox1.Refresh();
 }
 }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved