• C#关机代码实例详解


    C#关机代码是如何执行的呢?那么这段代码主要使用的是P/Invoke技术,如果对这个技术还未有接触,请花一些时间学习一下。P/Invoke不是一个能在一篇帖子里能讲明白的东西。

    C#关机代码这段代码实现所用的就是简言之,P/Invoke = Platform Invoke,就是在.NET程序中调用Windows API等非托管函数的技术。

    C#关机代码实例:

    // 引入必要的命名空间   

    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;  // 提供DllImport等特性,是P/Invoke的关键  //C#关机代码

    namespace test

    {

        public partial class Form1 : Form

        {

            public Form1()

            {

                InitializeComponent();

            }

            //C#关机代码

            // 这个结构体将会传递给API。使用StructLayout 

            //(...特性,确保其中的成员是按顺序排列的,C#编译器不会对其进行调整。

            [StructLayout(LayoutKind.Sequential, Pack = 1)] 

            internal struct TokPriv1Luid  {  public int Count;  public long Luid;  public int Attr;  } 

            // 以下使用DllImport特性导入了所需的Windows API。 

            // 导入的方法必须是static extern的,并且没有方法体。

            //调用这些方法就相当于调用Windows API。 

            [DllImport("kernel32.dll", ExactSpelling = true)]

            internal static extern IntPtr GetCurrentProcess();

            [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]

            internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);

            [DllImport("advapi32.dll", SetLastError = true)]

            internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);

            [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);

            [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]

            internal static extern bool ExitWindowsEx(int flg, int rea);

            //C#关机代码 // 以下定义了在调用WinAPI时需要的常数。 //这些常数通常可以从Platform SDK的包含文件(头文件)中找到 

            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";

            internal const int EWX_LOGOFF = 0x00000000;

            internal const int EWX_SHUTDOWN = 0x00000001;

            internal const int EWX_REBOOT = 0x00000002;

            internal const int EWX_FORCE = 0x00000004;

            internal const int EWX_POWEROFF = 0x00000008;

            internal const int EWX_FORCEIFHUNG = 0x00000010;

            // 通过调用WinAPI实现关机,主要代码再最后一行ExitWindowsEx  //这调用了同名的WinAPI,正好是关机用的。

            //C#关机代码

            private static void DoExitWin(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);

            }

            //C#关机代码

            private void button1_Click(object sender, EventArgs e)

            {

                if (radioButton1.Checked == true)

                { DoExitWin(EWX_SHUTDOWN); }

                else { Application.Exit(); }

                //MessageBox.Show("2");

            }

        }

     

    }

     

     

    C#关机代码的实现过程就向你介绍到这里,希望对你了解和学习C#关机代码有所帮助。

  • 相关阅读:
    请求重定向,请求转发
    post、get方法乱码问题
    Servlet
    修改Servlet模板,让Servlet更清新
    Java-Python对垒之质数计算
    使用Packet Tracer对不同网段组网模拟
    哑编码的两种方法
    AdaBoost scikit-learn相关参数
    KNN scikit-learn相关参数
    递归思想的应用-根据二叉树的中序遍历和前序遍历重建二叉树
  • 原文地址:https://www.cnblogs.com/soundcode/p/1917202.html
Copyright © 2020-2023  润新知