像网吧里的那种还原软件的进程,你强制退出了系统就自动重启或关机。求教C#是否可以实现这个功能可以实现的话那该如何写才对。最近对这个比较感兴趣先谢谢!

解决方案 »

  1.   

    你自己杀掉svchost.exe进程他就强制重启了.....
      

  2.   

    要是想走正常渠道的话要调用user32.DLL的API
    [DllImport("user32.dll")]
    static extern bool ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason);
    [STAThread]
    static void Main(string[] args)
    {
    ExitWindowsEx(ExitWindows.LogOff, ShutdownReason.MajorOther & ShutdownReason.MinorOther);
    }
    public enum ExitWindows : uint
    {
    LogOff = 0x00,      //注销
                ShutDown = 0x01,    //关机
                Reboot = 0x02,      //重启
                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
    }
      

  3.   

    to 3楼果然是高人 但是以我现在的实力 我不会调用系统api啊看来还是要修炼  谢谢啊
      

  4.   


    这个想法确实比较好 任何一个进程死了我就去调用关机命令   很好不过我还去攻克下调用系统  api  挑战下
      

  5.   

    调用API
     [StructLayout(LayoutKind.Sequential, Pack = 1)]
            internal struct LUID_AND_ATTRIBUTES
            {
                public LUID pLuid;
                public int Attributes;
            }
            [StructLayout(LayoutKind.Sequential, Pack = 1)]
            internal struct TOKEN_PRIVILEGES
            {
                public int PrivilegeCount;
                public LUID_AND_ATTRIBUTES Privileges;
            }
            [StructLayout(LayoutKind.Sequential, Pack = 1)]
            internal struct LUID
            {
                public int LowPart;
                public int HighPart;
            }
            public class PrivilegeException : Exception
            {
                public PrivilegeException() : base() { }
                public PrivilegeException(string message) : base(message) { }
            }        [DllImport("advapi32.dll", EntryPoint = "OpenProcessToken", CharSet = CharSet.Ansi)]
            private static extern int OpenProcessToken(IntPtr ProcessHandle, int DesiredAccess, ref IntPtr TokenHandle);
            private const int TOKEN_ADJUST_PRIVILEGES = 0x20;
            private const int TOKEN_QUERY = 0x8;
            [DllImport("user32.dll", EntryPoint = "FormatMessageA", CharSet = CharSet.Ansi)]
            private static extern int FormatMessage(int dwFlags, IntPtr lpSource, int dwMessageId, int dwLanguageId, StringBuilder lpBuffer, int nSize, int Arguments);
            private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000;
            protected static string FormatError(int number)
            {
                StringBuilder buffer = new StringBuilder(255);
                FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, IntPtr.Zero, number, 0, buffer, buffer.Capacity, 0);
                return buffer.ToString();
            }
            [DllImport("advapi32.dll", EntryPoint = "LookupPrivilegeValueA", CharSet = CharSet.Ansi)]
            private static extern int LookupPrivilegeValue(string lpSystemName, string lpName, ref LUID lpLuid);
            private const int SE_PRIVILEGE_ENABLED = 0x2;
            [DllImport("advapi32.dll", EntryPoint = "AdjustTokenPrivileges", CharSet = CharSet.Ansi)]
            private static extern int AdjustTokenPrivileges(IntPtr TokenHandle, int DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, int BufferLength, ref TOKEN_PRIVILEGES PreviousState, ref int ReturnLength);
            [DllImport("user32.dll", EntryPoint = "ExitWindowsEx", CharSet = CharSet.Ansi)]
            private static extern int ExitWindowsEx(int uFlags, int dwReserved);
      

  6.   

    在窗口关闭事件里写代码,直接关机,可以调用shutdown
      

  7.   

    写个服务与你进程进行通信。通信的方式你可以任选。
    当进程被KILL,就重起。