刚开始学C#,想做一个button响应来关机。从网上看了各种代码,以下是一个:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace shutdown
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Process p = new Process();//实例化一个独立进程
p.StartInfo.FileName = "cmd.exe";//进程打开的文件为Cmd
p.StartInfo.UseShellExecute = false;//是否启动系统外壳选否
p.StartInfo.RedirectStandardInput = true;//这是是否从StandardInput输入
p.StartInfo.CreateNoWindow = true;//这里是启动程序是否显示窗体
p.Start();//启动
p.StandardInput.WriteLine("shutdown -s -t 1");//运行关机命令shutdown (-s)是关机 (-t)是延迟的时间 这里用秒计算 10就是10秒后关机
p.StandardInput.WriteLine("exit");
}
}
}
但是点击button以后弹出了同一个窗口,然后大断电看到p.StandardInput.WriteLine("shutdown -s -t 1");执行完了就弹出了窗口,试着把p.StartInfo.CreateNoWindow 设为false后看到程序执行到p.StandardInput.WriteLine("shutdown -s -t 1");以后弹出CMD窗口显示五句:the handle is invalid
为啥呢?对于这个独立进程没弄明白。
------解决思路----------------------
直接执行就可以了,不用设置这个参数
------解决思路----------------------
//MyValue是目标计算机
ConnectionOptions op = new ConnectionOptions();
op.Username = "administrator";//或者你的帐号(注意要有管理员的权限)
op.Password = ""; //你的密码
ManagementScope scope = new ManagementScope("\\\\" + MyValue + "\\root\\cimv2", op);
try
{
scope.Connect();
System.Management.ObjectQuery oq = new System.Management.ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher query1 = new ManagementObjectSearcher(scope, oq);
//得到WMI控制
ManagementObjectCollection queryCollection1 = query1.Get();
foreach (ManagementObject mobj in queryCollection1)
{
string[] str = { "" };
mobj.InvokeMethod("ShutDown", str);
}
}
catch
{
}
------解决思路----------------------
Process p = new Process();
p.StartInfo.FileName = "shutdown.exe";
p.StartInfo.Arguments = "-s -t 1";
p.Start();
------解决思路----------------------
这个问题跟shutdown命令的参数有关,在命令行下输入shutdown /? 可以看到:
/f 强制正在运行的应用程序关闭,不前台警告用户。
当为 /t 参数指定大于 0 的值时,
则默示 /f 参数。
/t xxx 设置关闭前的超时为 xxx 秒。
有效范围是 0-315360000 (10 年),默认值为 30。
如果超时时间大于 0,则默示 /f
参数。
因此,把/t 后面的参数改为0即可实现非强制关机(注:Win xp的关机参数仅支持“-”,而在Win7及以上版本中,可用“/”代替“-”。