C#开关机管理和系统盘符信息

获取系统本次开机时间 :DateTime.Now.AddMilliseconds(-Environment.TickCount);


通过注册表设置程序开机自启

#region
        /// <summary>
        /// 开机启动项
        /// </summary>
        /// <param name="Started">是否启动</param>
        /// <param name="name">启动值的名称</param>
        /// <param name="path">启动程序的路径 Application.ExecutablePath</param>
        public static void RunWhenStart(bool Started, string name, string path)
        {
            Microsoft.Win32.RegistryKey HKLM = Microsoft.Win32.Registry.LocalMachine;
            Microsoft.Win32.RegistryKey Run = HKLM.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
            if (Started == true)
            {
                try
                {
                    Run.SetValue(name, path);
                    HKLM.Close();
                }
                catch { }
            }
            else
            {
                try
                {
                    Run.DeleteValue(name);
                    HKLM.Close();
                }
                catch { }
            }
        }

        #endregion

通过运行 msconfig可查看是否成功修改注册表


//——————————————————————————————————————————我是一条一本正经的分割线——————————————————————————————————————————————————————————————————————————————————————————————————————————

//获取系统关机或注销

/// <summary>

/// 窗口过程的回调函数
/// </summary>

///<param name="m">

 private const int WM_QUERYENDSESSION = 0x0011;

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        //此消息在OnFormClosing之前
        case WindowsMessage.WM_QUERYENDSESSION:
            //MessageBox.Show(WndProc.WM_QUERYENDSESSION.我要阻止系统关闭!);
            //this.Close();
            //this.Dispose();
            //Application.Exit();
            m.Result = (IntPtr)1; //阻止Windows注销、关机或重启
            break;
        default:
            break;
    }
    base.WndProc(ref m);
}
方法二:
protected override void OnFormClosing(FormClosingEventArgs e)
{
    switch (e.CloseReason)
    {
        case CloseReason.ApplicationExitCall:
            e.Cancel = true;
            MessageBox.Show(拦截关闭要求事件!);
            break;
        case CloseReason.FormOwnerClosing:
            e.Cancel = true;
            MessageBox.Show(拦截自身关闭事件!);
            break;
        case CloseReason.MdiFormClosing:
            e.Cancel = true;
            MessageBox.Show(拦截MDI窗体关闭事件!);
            break;
        case CloseReason.None:
            break;
        case CloseReason.TaskManagerClosing:
            e.Cancel = true;
            MessageBox.Show(拦截任务管理器关闭事件!);
            break;
        case CloseReason.UserClosing:
             
            //注销或关机会触发此事件;
            //MessageBox.Show(拦截用户关闭事件!);
            e.Cancel = false;
            break;
        case CloseReason.WindowsShutDown:
            e.Cancel = true;
            MessageBox.Show(拦截关机事件!);
            break;
        default:
            break;
    }
 
    base.OnFormClosing(e);
}
方法三:
//当用户试图注销或关闭系统时发生。  
            SystemEvents.SessionEnding += new SessionEndingEventHandler(SystemEvents_SessionEnding);
 
//下面是系统注销或关闭事件处理程序,  
        private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
        {
            if (MessageBox.Show(this, 是否允许系统注销!, 系统提示, MessageBoxButtons.YesNo) != DialogResult.Yes)
            {
                e.Cancel = true;
            }
            else
            {
                e.Cancel = false;
            }
            SessionEndReasons reason = e.Reason;
            switch (reason)
            {
                case SessionEndReasons.Logoff:
                    MessageBox.Show(用户正在注销。操作系统继续运行,但启动此应用程序的用户正在注销。);
                    break;
                case SessionEndReasons.SystemShutdown:
                    MessageBox.Show(操作系统正在关闭。);
                    break;
            }
        }
        //如果把上面的事件处理程序修改成如下  
        //private void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)  
        //       {  
        //          e.Cancel = true; 
        //   } 
 
        //那会出现什么情况,你点击开始菜单关机选择注销、关机、或重新启动将会失效,电脑不能正常关机了,进一步的话把程序做成Windows服务,晕,恶作剧? 
 
        //SessionEnded事件同上,事件参数类为SessionEndedEventArgs,同SessionEndingEventArgs相比少了Cancel属性,Cancel属性同一些windows下的某些事件差不多,比如Form.Closing事件,Control.Validating事件。


//——————————————————————————————我是分割线————————————————————————————获取盘符信息

工具类:HardDiskPartition.cs

/// 
    /// 盘符信息
    /// 
    public class HardDiskPartition
    {
        #region Data
        private string _PartitionName;
        private double _FreeSpace;
        private double _SumSpace;
        #endregion //Data


        #region Properties
        /// 
        /// 空余大小
        /// 
        public double FreeSpace
        {
            get { return _FreeSpace; }
            set { this._FreeSpace = value; }
        }
        /// 
        /// 使用空间
        /// 
        public double UseSpace
        {
            get { return _SumSpace - _FreeSpace; }
        }
        /// 
        /// 总空间
        /// 
        public double SumSpace
        {
            get { return _SumSpace; }
            set { this._SumSpace = value; }
        }
        /// 
        /// 分区名称
        /// 
        public string PartitionName
        {
            get { return _PartitionName; }
            set { this._PartitionName = value; }
        }
        /// 
        /// 是否主分区
        /// 
        public bool IsPrimary
        {
            get
            {
                //判断是否为系统安装分区
                if (System.Environment.GetEnvironmentVariable("windir").Remove(2) == this._PartitionName)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
        #endregion //Properties

    }


//获取盘符信息

private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                List<utils.HardDiskPartition> listInfo = GetDiskListInfo();
                if (listInfo != null && listInfo.Count > 0)
                {
                    listBox1.Items.Clear();
                    foreach (HardDiskPartition disk in listInfo)
                    {
                        listBox1.Items.Add(string.Format("{0}  总空间:{1} GB,剩余:{2} GB", disk.PartitionName, ManagerDoubleValue(disk.SumSpace, 1), ManagerDoubleValue(disk.FreeSpace, 1)));
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 处理Double值,精确到小数点后几位
        /// </summary>
        /// <param name="_value">值</param>
        /// <param name="Length">精确到小数点后几位</param>
        /// <returns>返回值</returns>
        private double ManagerDoubleValue(double _value, int Length)
        {
            if (Length < 0)
            {
                Length = 0;
            }
            return System.Math.Round(_value, Length);
        }
        /// <summary>
        /// 获取硬盘上所有的盘符空间信息列表
        /// </summary>
        /// <returns></returns>
        private List<HardDiskPartition> GetDiskListInfo()
        {
            List<HardDiskPartition> list = null;
            //指定分区的容量信息
            try
            {
                SelectQuery selectQuery = new SelectQuery("select * from win32_logicaldisk");


                ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);


                ManagementObjectCollection diskcollection = searcher.Get();
                if (diskcollection != null && diskcollection.Count > 0)
                {
                    list = new List<HardDiskPartition>();
                    HardDiskPartition harddisk = null;
                    foreach (ManagementObject disk in searcher.Get())
                    {
                        int nType = Convert.ToInt32(disk["DriveType"]);
                        if (nType != Convert.ToInt32(DriveType.Fixed))
                        {
                            continue;
                        }
                        else
                        {
                            harddisk = new HardDiskPartition();
                            harddisk.FreeSpace = Convert.ToDouble(disk["FreeSpace"]) / (1024 * 1024 * 1024);
                            harddisk.SumSpace = Convert.ToDouble(disk["Size"]) / (1024 * 1024 * 1024);
                            harddisk.PartitionName = disk["DeviceID"].ToString();
                            list.Add(harddisk);
                        }
                    }
                }
            }
            catch (Exception)
            {


            }
            return list;
        }

        //将盘符信息追加保存到指定文件
        private void button1_Click_1(object sender, EventArgs e)
        {
            string data = this.label1.Text.ToString()+"\t\n";
            foreach (var item in listBox1.Items)
            {
                data += item.ToString()+"\t\n";
            }
            String filePathName=SaveToNativeFile(data,System.Windows.Forms.Application.StartupPath+@"\data.txt",false);
            this.label2.Text = filePathName;
        }
        /// <summary>  
        /// 保存数据data到原文件filePathName中  
        /// </summary>  
        public String SaveToNativeFile(String data, String filePathName, bool mute)
        {
            try
            {
                System.IO.StreamWriter file1 = new System.IO.StreamWriter(filePathName, true); //文件已追加方式添加内容  
                file1.Write(data);                                                              //保存数据到文件  


                file1.Close();                                                                  //关闭文件  
                file1.Dispose();                                                                //释放对象  


                if (!mute) MessageBox.Show("成功导出数据到:“" + filePathName + "”!");
                return filePathName;
            }
            catch (Exception)
            {
            }
            return null;
            /**
            FileStream fs = new FileStream("D:\aa.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine("add line information");
            **/
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值