• 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
                { }
            }
        }
    

      

  • 相关阅读:
    sql 数据库还原脚本 (kill链接+独占
    最长回文字符串
    UVa 455 Periodic Strings
    UVa 1225 Digit Counting
    UVa 340 Master-Mind Hints
    UVa 10976
    UVa 725
    UVa 11059
    POJ1887 最长下降子序列
    最大连续子序列算法(数组的连续子数组最大和(首尾不相连))
  • 原文地址:https://www.cnblogs.com/datacool/p/datacool_poweroff.html
Copyright © 2020-2023  润新知