40

我想在我的 WPF 应用程序中有一个重新启动机器的按钮。此应用程序始终在 Vista 上运行。

快速搜索没有出现任何结果的事实让我认为这可能比我希望的要难......有什么想法吗?谢谢!

4

4 回答 4

79

尝试这个:

System.Diagnostics.Process.Start("shutdown.exe", "-r -t 0");

这将启动 Windows 的内置shutdown工具,该工具还可以关闭或注销远程或本地计算机。

以下是ss64.com的完整选项列表:

句法

      SHUTDOWN [注销选项] [/m \\计算机] [选项]

注销选项:
    /i 显示 GUI(必须是第一个选项)
    /l 注销。这不能与 /m 或 /d 选项一起使用
    /s 关机
    /r 关闭并重新启动
    /a 中止系统关闭。
               (仅在超时期间)
    /p 在没有超时或警告的情况下关闭本地计算机
               (仅与 /d)
    /h 休眠本地计算机(仅使用 /f )
    /e 记录计算机意外关闭的原因

选项:

   /m \\Computer :要关闭的远程计算机。

   /t:xxx :系统关闭前的时间(以秒为单位)。
                    有效范围是 xxx=0-600 秒。[默认=30]
   /c "Msg" : 可选的关闭消息 [最多 127 个字符]

   /f :强制关闭正在运行的应用程序。
                    这不会在任何打开的应用程序中提示文件保存。
                    所以会导致所有未保存的数据丢失!!!

   /du:xx:yy :列出关机的用户原因代码。
   /d P:xx:yy :列出关闭的计划原因代码。
                     xx 指定主要原因代码 (0-255)
                     yy 指定次要原因代码 (0-65536)

您可能会注意到我使用了传递命令行参数的 Linux/UNIX 风格(使用“-”)符号。在 Windows 上,约定使用“/”。这无关紧要——程序不在乎。

于 2009-07-31T22:16:06.080 回答
21

您可以使用ExitWindowsExAPI。来自pinvoke.net

[Flags]
public enum ExitWindows : uint
{
   // ONE of the following five:
   LogOff = 0x00,
   ShutDown = 0x01,
   Reboot = 0x02,
   PowerOff = 0x08,
   RestartApps = 0x40,
   // plus AT MOST ONE of the following two:
   Force = 0x04,
   ForceIfHung = 0x10,
}

[Flags]
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
}

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool ExitWindowsEx(ExitWindows uFlags, ShutdownReason dwReason);

并使用它:

ExitWindowsEx(
  ExitWindows.Reboot,
  ShutdownReason.MajorOther | ShutdownReason.MinorOther | ShutdownReason.FlagPlanned
); 
于 2009-07-31T22:40:07.000 回答
9

另一种方法是使用 WMI(即System.Management命名空间);谷歌提出了这个代码的变体——

  ManagementClass W32_OS = new ManagementClass("Win32_OperatingSystem")
  ManagementBaseObject inParams, outParams;
  int result;
  W32_OS.Scope.Options.EnablePrivileges = true;

  foreach(ManagementObject obj in W32_OS.GetInstances())
  {
    inParams = obj.GetMethodParameters("Win32Shutdown");
    inParams["Flags"] = 6; //ForcedReboot; -- fixed to restart rather than shutdown
    inParams["Reserved"] = 0;

    outParams = obj.InvokeMethod("Win32Shutdown", inParams, null)
    result = Convert.ToInt32(outParams["returnValue"]);
    if (result !=0) throw new Win32Exception(result);
  }
于 2009-07-31T22:33:18.947 回答
1

Windows服务中的工作代码:

var cmd = new System.Diagnostics.ProcessStartInfo("shutdown.exe", "-r -t 0");
cmd.CreateNoWindow = true;
cmd.UseShellExecute = false;
cmd.ErrorDialog = false;
System.Diagnostics.Process.Start(cmd);
于 2020-06-25T05:14:07.597 回答