当前位置: 代码迷 >> C# >> C# 关机 Windows7 跟windows 8
  详细解决方案

C# 关机 Windows7 跟windows 8

热度:678   发布时间:2016-05-05 04:01:47.0
C# 关机 Windows7 和windows 8
刚开始学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();


------解决思路----------------------
引用:
只有我一个人测试了一下么
测试结果就是直接关机了,其他工作还没有保存
只能说Windows 8 64bit下测试时没有问题

这个问题跟shutdown命令的参数有关,在命令行下输入shutdown /? 可以看到:

 /f         强制正在运行的应用程序关闭,不前台警告用户。
            当为 /t 参数指定大于 0 的值时,
            则默示 /f 参数。
 /t xxx     设置关闭前的超时为 xxx 秒。
            有效范围是 0-315360000 (10 年),默认值为 30。
            如果超时时间大于 0,则默示 /f
            参数。

因此,把/t 后面的参数改为0即可实现非强制关机(注:Win xp的关机参数仅支持“-”,而在Win7及以上版本中,可用“/”代替“-”。
  相关解决方案