日期:2014-05-20  浏览次数:20822 次

如何在C#程序里关机?
大家好,我现在在做个小程序,要实现在程序里面实现系统的重新启动。
这里,我遇到2个难题:
1.如何调用外部程序?因为我要运行shutdown.exe来实现关机,我目前知道有个System.Diagnostics.process可以实现调用外部的程序,那还有别的方法来调用外部程序吗?
2.我在程序里调用关机后,由于系统要关闭,所以我这个程序也要关闭,可以保证我自己的程序退出时,shutdown.exe不会退出吗?(当然,我要shutdown在一定时间后再关,而不是马上)
这个问题我想很久了,请教各位经验者予以帮助,感激不尽,分数不多,聊表心意。


------解决方案--------------------
孟子的
http://dotnet.aspx.cc/article/ebe38f5b-bd7e-42c2-73e4-49616f98be3d/read.aspx
http://dotnet.aspx.cc/article/1c5e7859-4ab2-4b7f-e29c-9c43136cd98a/read.aspx
------解决方案--------------------
using System.Reflection;

[DllImport( "user32.dll ", ExactSpelling=true, SetLastError=true) ]
internal static extern bool ExitWindowsEx( int flg, int rea );

internal const int EWX_LOGOFF = 0x00000000;
internal const int EWX_SHUTDOWN = 0x00000001;
internal const int EWX_REBOOT = 0x00000002;

然后直接调用ExitWindowsEx(EWX_SHUTDOWN,0);
------解决方案--------------------
用shutdown 后面的参数也可以的 /t *** ***是多少秒后关机 详细可

C:\Documents and Settings\Administrator> shutdown -help
用法: shutdown [/i | /l | /s | /r | /a | /p | /h | /e] [/f]
[/m \\computer][/t xxx][/d [p:]xx:yy [/c "comment "]]

没有参数 显示帮助。这与键入 /? 是一样的
/? 显示帮助。这与不键入任何选项是一样的
/i 显示图形用户界面(GUI)。
这必须是第一个选项
/l 注销。这不能与 /m 或 /d 选项一起使用
/s 关闭计算机
/r 关闭并重启动计算机
/a 放弃系统关闭。
这只能在超时过程中使用
/p 关闭本地计算机,没有超时或警告。
这只能与 /d 选项一起使用
/h 休眠本地计算机。
这只能与 /f 选项一起使用
/e 将计算机的意外关闭原因记入文档
/m \\computer 指定目标计算机
/t xxx 设置关闭前的超时为 xxx 秒。
有效范围是 0-600,默认为 30
/c "comment " 重启动或关闭的原因的注释。
最大允许 127 个字符
/f 强制正在运行的应用程序关闭而不事先警告用户
/d [p:]xx:yy 提供重启动或关闭的原因
p 表明重启动或关闭是计划内的
xx 是主要原因号(小于 256 的正整数)
yy 是次要原因号(小于 65536 的正整数)

此计算机上的原因:
(E = 预期 U = 意外 P = 计划, C = 自定义)
类别 主要 次要 标题

U 0 0 其他(没有计划的)
E 0 0 其他(没有计划的)
E P 0 0 其他(计划的)
U 0 5 其他故障: 系统没有反应
E 1 1 硬件: 维护(没有计划的)
E P 1 1 硬件: 维护(计划的)
E 1 2 硬件: 安装(没有计划的)
E P 1 2 硬件: 安装(计划的)
P 2 3 操作系统: 升级(计划的)
E 2 4 操作系统: 重新配置(没有计划的)
E P 2 4 操作系统: 重新配置(计划的)
P 2 16 操作系统: 服务包(计划中)
2 17 操作系统: 热修补(没有计划)
P 2 17 操作系统: 热修补(计划中)
2 18 操作系统: 安全修补(没有计划)
P 2 18 操作系统: 安全修补(计划中)
E 4 1 应用程序: 维护(没有计划的)
E P 4 1 应用程序: 维护(计划的)
E P 4 2 应用程序: 安装(计划中)
E 4 5 应用程序: 没有反应
E 4 6 应用程序: 不稳定
U 5 15 系统故障: 停止错误
E 5 19 安全问题
U 5 19 安全问题
E P 5 19 安全问题
E 5 20 网络连接性丢失(没有计划的)
U 6 11 电源故障: 电线被拔掉
U 6 12 电源故障: 环境
P 7 0 旧版 API 关机

------解决方案--------------------
private void timer1_Tick(object sender, EventArgs e)
{
if (DateTime.Now.Hour == 16 || DateTime.Now.Hour == 4)
{
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo( "SHUTDOWN.EXE ");