40

マシンを再起動するボタンを WPF アプリに追加したいと考えています。このアプリは常に Vista で実行されています。

クイック検索で何も見つからなかったという事実は、これが私が望んでいたよりも難しいかもしれないと私に思わせます...何かアイデアはありますか? ありがとう!

4

4 に答える 4

79

これを試して:

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

これにより、Windows の組み込みshutdownツールが起動し、リモートまたはローカル マシンをシャットダウンまたはログオフすることもできます。

ss64.comからの完全なオプションのリストは次のとおりです。

構文

      SHUTDOWN [logoff_option] [/m \\コンピュータ] [オプション]

logoff_option:
    /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 : シャットダウンの USER 理由コードを一覧表示します。
   /d P:xx:yy : シャットダウンの PLANNED 理由コードを一覧表示します。
                     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名前空間) を使用することもできます。Google はこのコードのバリエーションを表示します --

  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 に答える