3

我正在尝试让 Windows 7 机器从 C# WPF 应用程序重新启动。为此,我添加了以下代码(我使用了枚举,但为了保持代码简短,我只是在此处插入常量):

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

public static void Reboot() {
    ExitWindowsEx(0x02, 0x0)
}

在 Windows 7 机器上,这绝对没有任何作用(无论如何对我来说)。将 0x2(重新启动)更改为 0x0(注销)确实会使代码注销当前用户,但重新启动代码似乎不起作用。

使用 GetLastError API 调用也没有多大作用。它只是说明该功能已成功完成。

现在我只是通过使用 /r /f 调用关闭命令来应对,但我更希望能够直接从我的应用程序调用 Windows API,因此非常感谢任何帮助。

4

1 回答 1

4

您没有正确检查错误。仅检查函数是否返回 false,不要pinvoke GetLastError(),而是使用 Marshal.GetLastWin32Error()。最好的办法:

public static void Reboot() {
    if (!ExitWindowsEx(0x02, 0x0)) {
        throw new System.ComponentModel.Win32Exception();
    }
}

您很可能会发现自己没有足够的权限来重新启动机器。需要 AdjustTokenPrivileges,查看 MSDN 文章。

于 2012-06-22T14:52:58.730 回答