我想在我的 WPF 应用程序中有一个重新启动机器的按钮。此应用程序始终在 Vista 上运行。
快速搜索没有出现任何结果的事实让我认为这可能比我希望的要难......有什么想法吗?谢谢!
尝试这个:
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 上,约定使用“/”。这无关紧要——程序不在乎。
您可以使用ExitWindowsEx
API。来自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
);
另一种方法是使用 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);
}
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);