【问题标题】:restarting my computer through a win forms application [duplicate]通过win forms应用程序重新启动我的计算机[重复]
【发布时间】:2013-01-25 00:03:18
【问题描述】:

可能重复:
How to shutdown the computer from C#

我想在我的 Win Form 应用程序中发生事件后显示重新启动计算机消息框。 如果用户选择是,我可以使用什么命令重新启动计算机?

【问题讨论】:

标签: c# winforms winapi


【解决方案1】:

你可以p/invoke ExitWindowsEx

如上所述,您还需要调用 AdjustTokenPrivileges,因为默认情况下 SE_SHUTDOWN_NAME 处于非活动状态。

一大堆可用的信息on MSDN here

【讨论】:

    【解决方案2】:

    你应该使用 WINAPI 。下面的功能可以为你做电源任务:

    BOOL WINAPI ExitWindowsEx(
      _In_  UINT uFlags,
      _In_  DWORD dwReason
    );
    

    请注意,此函数位于 user32.dll 中。 只需重新启动:

    ExitWindowsEx(2,4);
    

    这是完整的标志列表:link to msdn

    现在这里是示例 C# 代码:

    using System.Runtime.InteropServices;
    
    [DllImport("user32.dll", SetLastError=true)]
    
    public static extern bool  ExitWindowsEx(uint uFlags,uint dWReason);
    
    
    public static void Main()
    {
      ExitWindowsEx(2,4);
    }
    

    【讨论】:

    • 退出WindowsEx(2,4)?检测到幻数违规。另外,什么是long int?
    • 4 用于 EWX_FORCE , 2 用于 EWX_REBOOT 。大卫,如果有任何问题,请纠正我..
    • 第二个参数是 DWORD,在 C# 中是 uint。你的参数应该有真实的名字。您需要在 DllImport 属性中设置 SetLastError = true。你必须停止使用幻数。声明常量或枚举。
    • 感谢您,我在变量类型映射中出错了,并且 SetLastError 已更新...但我没有和您一起不使用幻数,因为这里我们想做一个工作,它们将由编译器立即解决。这不是一个不安全的代码。我认为枚举不会跑得更快,但仍然是为了保持代码的管理,是的,你是真的。我们应该使用枚举或常量。
    • 速度在这里并不重要。您知道关闭该机器将消耗多少时钟周期吗?!重要的是可读性。编写人类可以阅读的代码。不要让读者为了理解你的代码而一路跋涉到 MSDN。
    【解决方案3】:
    Process.Start("shutdown","/r /t 0");
    

    【讨论】:

    • 不,不要那样做。始终使用 API。如果你想列出一个目录中的文件,你shell out 到 cmd 吗?!!
    【解决方案4】:

    这个特殊的解决方案对我有用:https://stackoverflow.com/a/102583/1505128

    using System.Management;
    
    void Shutdown()
    {
        ManagementBaseObject mboShutdown = null;
        ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem");
        mcWin32.Get();
    
        // You can't shutdown without security privileges
        mcWin32.Scope.Options.EnablePrivileges = true;
        ManagementBaseObject mboShutdownParams =
                 mcWin32.GetMethodParameters("Win32Shutdown");
    
        // Flag 1 means we want to shut down the system. Use "2" to reboot.
        mboShutdownParams["Flags"] = "1";
        mboShutdownParams["Reserved"] = "0";
        foreach (ManagementObject manObj in mcWin32.GetInstances())
        {
            mboShutdown = manObj.InvokeMethod("Win32Shutdown", 
                                           mboShutdownParams, null);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多