ExitWindowsEx Windows 7关闭不起作用

时间:2012-06-22 14:34:08

标签: winapi windows-7

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

[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调用shutdown命令来应对,但我希望能够直接从我的应用程序调用Windows API,因此非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您没有正确检查错误。只检查函数是否返回false,执行 not pinvoke GetLastError(),改为使用Marshal.GetLastWin32Error()。最好的方式:

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

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