C# 使用系统API关机、重启、注销

在Windows系统中有2种方式进行关机、重启以及注销计算机操作:

1、使用shutdown()命令;2、使用系统API;

以下是使用系统API进行操作的实例。

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;


namespace ShutDownSys
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class ShutDownSys
        {
            //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 LookupPrivilegeValueA
            (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的包含文件(头文件)中找到。
            public const int SE_PRIVILEGE_ENABLED = 0x00000002;
            public const int TOKEN_QUERY = 0x00000008;
            public const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
            public const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
            public const int EWX_LOGOFF = 0x00000000;
            public const int EWX_SHUTDOWN = 0x00000001;
            public const int EWX_REBOOT = 0x00000002;
            public const int EWX_FORCE = 0x00000004;
            public const int EWX_POWEROFF = 0x00000008;
            public const int EWX_FORCEIFHUNG = 0x00000010;
            // 通过调用WinAPI实现关机,主要代码再最后一行ExitWindowsEx  //这调用了同名的WinAPI,正好是关机用的。


            public 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 = LookupPrivilegeValueA(null,SE_SHUTDOWN_NAME,ref tp.Luid);
                ok = AdjustTokenPrivileges(htok,false,ref tp,0,IntPtr.Zero,IntPtr.Zero);
                ok = ExitWindowsEx(flg,0);
            }
        }

        //调用
        public void Reboot()
        {
            ShutDownSys.DoExitWin(ShutDownSys.EWX_FORCE | ShutDownSys.EWX_REBOOT);
        }

        public void ShutDown()
        {
            ShutDownSys.DoExitWin(ShutDownSys.EWX_FORCE | ShutDownSys.EWX_POWEROFF);
        }

        public void LogOff()
        {
            ShutDownSys.DoExitWin(ShutDownSys.EWX_FORCE | ShutDownSys.EWX_LOGOFF);
        }

        //关机
        private void button1_Click(object sender, EventArgs e)
        {
            ShutDown();
        }

        //重启
        private void button2_Click(object sender, EventArgs e)
        {
            Reboot();
        }

        //注销
        private void button3_Click(object sender, EventArgs e)
        {
            LogOff();
        }
    }
}

相关:

1、用System.Runtime.InteropServices服务的DllImport方法引入非托管代码程序集,例如调用系统API,C语言写的方法等等。在这种情况下,声明必须为static
extern 主要用于声明在外部实现的方法,同时,还可以定义外部程序集别名,使得可以从单个程序集中引用同一组件的不同版本。

 2、

ExitwindowsEx函数的原型:

bool ExitwindowsEx(UINT uFlags,DWORD dwReserved);

函数功能:
该函数注销当前用户,关闭系统;或者关闭并重新启动系统。此函数发送WM_QUERYENDSESSION消息给应用程序来确定它们是否能被终止。
参数:
uFlags;指定关机类型。此参数必须包括下列值之一:EWX_LOGOFF,EWX_POWEROFF,EWX_REBOOT,EWX_SHUTDOWN。还包括EWX_FORCE,EWX_FORCEIFHUNG两个可选值。

EWX_LOGOFF:关闭所有调用函数ExitWindowsEx的进程的安全环境里运行的进程,然后注销用户。
EWX_REBOOT:关闭系统并重新启动系统。
EWX_SHUTDOWN:关闭系统使之能完全关闭电源,所有文件缓冲区都被清洗到磁盘,所有的运行的进程都停止。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值