首页 > 代码库 > C#winform程序关闭计算机的正确姿势

C#winform程序关闭计算机的正确姿势

    /// <summary>    /// 计算机电源控制类    /// </summary>    public class EnvironmentCheckClass    {        [DllImport("user32.dll")]        static extern bool ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason);        [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);        [StructLayout(LayoutKind.Sequential, Pack = 1)]        internal struct TokPriv1Luid        {            public int Count;            public long Luid;            public int Attr;        }        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";        public enum ExitWindows : uint        {            LogOff = 0x00,      //注销            ShutDown = 0x01,    //关机            Reboot = 0x00000002,  //重启            Force = 0x04,            PowerOff = 0x08,            ForceIfHung = 0x10        }        public enum ShutdownReason : uint        {            MajorApplication = 0x00040000,            MajorHardware = 0x00010000,            MajorLegacyApi = 0x00070000,            MajorOperatingSystem = 0x00020000,            MajorOther = 0x00000000,            MajorPower = 0x00060000,            MajorSoftware = 0x00030000,            MajorSystem = 0x00050000,            MinorBlueScreen = 0x0000000F,            MinorCordUnplugged = 0x0000000b,            MinorDisk = 0x00000007,            MinorEnvironment = 0x0000000c,            MinorHardwareDriver = 0x0000000d,            MinorHotfix = 0x00000011,            MinorHung = 0x00000005,            MinorInstallation = 0x00000002,            MinorMaintenance = 0x00000001,            MinorMMC = 0x00000019,            MinorNetworkConnectivity = 0x00000014,            MinorNetworkCard = 0x00000009,            MinorOther = 0x00000000,            MinorOtherDriver = 0x0000000e,            MinorPowerSupply = 0x0000000a,            MinorProcessor = 0x00000008,            MinorReconfig = 0x00000004,            MinorSecurity = 0x00000013,            MinorSecurityFix = 0x00000012,            MinorSecurityFixUninstall = 0x00000018,            MinorServicePack = 0x00000010,            MinorServicePackUninstall = 0x00000016,            MinorTermSrv = 0x00000020,            MinorUnstable = 0x00000006,            MinorUpgrade = 0x00000003,            MinorWMI = 0x00000015,            FlagUserDefined = 0x40000000,            FlagPlanned = 0x80000000        }        public void ReStartComputer()        {            System.Threading.Thread Restart = new System.Threading.Thread(ReStart);            Restart.Start();        }        private void ReStart()        {            try            {                System.Threading.Thread.Sleep(1000);                 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(ExitWindows.Reboot, ShutdownReason.MinorOther);            }            catch            { }        }        public void ComputerPowerOff()        {            System.Threading.Thread PowerOff = new System.Threading.Thread(PCPowerOff);            PowerOff.Start();        }        private void PCPowerOff()        {            try            {                System.Threading.Thread.Sleep(1000);                  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(ExitWindows.PowerOff, ShutdownReason.MajorHardware);            }            catch            { }        }    }

  

C#winform程序关闭计算机的正确姿势