WinForm实现自定义设置快捷键完整源码附注释

xml帮助类

 public  class Xmlhelp
    {
        private Keys _displaykey;//显示窗口
        private Keys _existkey;//退出窗口键
        private Keys _hidekey;//隐藏窗口键
        #region 给私有变量添加公共属性
        public Keys DisplayKey
        {
            get
            {
                return _displaykey;
            }
            set
            {
                _displaykey = value;
            }
        }
        public Keys Existkey
        {
            get
            {
                return _existkey;
            }
            set
            {
                _existkey = value;
            }
        }
        public Keys Hidekey
        {
            get
            {
                return _hidekey;
            }
            set
            {
                _hidekey = value;
            }
        }
        #endregion
        /// <summary>
        /// 从xml读取信息
        /// </summary>
        public void LoadFromXmlFile()
        {
            XmlTextReader reader;
            if (File.Exists("KeySet.xml"))
            {
                //优先读取外部keyset.xml文件
                reader = new XmlTextReader("KeySet.xml");
            }
            else
            {
                //如果KeySet.xml文件不存在,则从嵌入资源内读取KeySet.xml
                Assembly asm = Assembly.GetExecutingAssembly();
                Stream sm = asm.GetManifestResourceStream("KeySettingDemo.KeySet.xml");
                reader = new XmlTextReader(sm);
            }
            try
            {
                //根据xml节点名称读取相应的键值为变量赋值
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        if (reader.Name == "Existkey")
                        {
                            _existkey = (Keys)Convert.ToInt32(reader.ReadElementString().Trim());
                        }
                        else if (reader.Name == "Displaykey")
                        {
                            _displaykey = (Keys)Convert.ToInt32(reader.ReadElementString().Trim());
                        }
                        else if (reader.Name == "Hidekey")
                        {
                            _hidekey = (Keys)Convert.ToInt32(reader.ReadElementString().Trim());
                        }
                      
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                if (reader != null)
                    reader.Close();
            }
        }
        /// <summary>
        /// 将快捷键信息保存为xml文件
        /// </summary>
        public void SaveToXmlFile()
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml("<KeySet></KeySet>");
            XmlNode root = doc.SelectSingleNode("KeySet");
            //写快捷键
            XmlElement xelKey = doc.CreateElement("Key");

            XmlElement xelExistkey = doc.CreateElement("Existkey");
            xelExistkey.InnerText = Convert.ToInt32(_existkey).ToString();
            xelKey.AppendChild(xelExistkey);

            XmlElement xelDisplayKey = doc.CreateElement("Displaykey");
            xelDisplayKey.InnerText = Convert.ToInt32(_displaykey).ToString();
            xelKey.AppendChild(xelDisplayKey);

            XmlElement xelHideKey= doc.CreateElement("Hidekey");
            xelHideKey.InnerText = Convert.ToInt32(_hidekey).ToString();
            xelKey.AppendChild(xelHideKey);
            root.AppendChild(xelKey);
            doc.Save("KeySet.xml");
        }
    }

快捷键设置窗体

 private void Form1_Load(object sender, EventArgs e)
        {
            //读取快捷键参数给文本框Text和Tag属性赋值
            Xmlhelp xml = new Xmlhelp();
            xml.LoadFromXmlFile();
            txtDisplay.Text= ((Keys)xml.DisplayKey).ToString();
            txtDisplay.Tag = xml.DisplayKey;
            txtExist.Text = ((Keys)xml.Existkey).ToString();
            txtExist.Tag = xml.Existkey;
            txtHide.Text = ((Keys)xml.Hidekey).ToString();
            txtHide.Tag = xml.Hidekey;
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            //根据xml中保存的键值为文本框的Tag属性赋值
            Xmlhelp xml = new Xmlhelp();
            xml.DisplayKey= (Keys)txtDisplay.Tag;
            xml.Existkey = (Keys)txtExist.Tag;
            xml.Hidekey = (Keys)txtHide.Tag;
            xml.SaveToXmlFile();
           MessageBox.Show("保存成功", "提示窗口", MessageBoxButtons.OK, MessageBoxIcon.Information);
            Form2 frm2 = new Form2();
            frm2.Show();
        }
        /// <summary>
        /// 窗体中所有文本框共用此事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtDisplay_KeyDown(object sender, KeyEventArgs e)
        {
            //首先排除一些不适合的键值
            if ((e.KeyValue >= 33 && e.KeyValue <= 36) || (e.KeyValue >= 45 && e.KeyValue <= 46) ||
                (e.KeyValue >= 48 && e.KeyValue <= 57) || (e.KeyValue >= 65 && e.KeyValue <= 90) ||
                (e.KeyValue >= 96 && e.KeyValue <= 107) || (e.KeyValue >= 109 && e.KeyValue <= 111) ||
                (e.KeyValue >= 186 && e.KeyValue <= 192) || (e.KeyValue >= 219 && e.KeyValue <= 222))
            {
                //检查是否存在冲突的快捷键
                foreach (Control c in gbKeySet.Controls)
                {
                    //将控件基类转换为TextBox
                    Control TempC = c as TextBox;
                    if (TempC != null && ((TextBox)TempC).Text != "")
                    {
                        //如果某个文本框当前的Tag值与其本身的键值相等
                         //说明此快捷键已被占用
                        if (((int)((TextBox)TempC).Tag) == e.KeyValue)
                        {
                            //清空当前文本框的Text和Tag值
                            ((TextBox)TempC).Text = "";
                            ((TextBox)TempC).Tag = Keys.None;
                        }
                    }
                }
                //文本框的Text属性存放快捷键编码
                ((TextBox)sender).Text = e.KeyCode.ToString();
                //文本框的Tag属性存放快捷键的键值
                ((TextBox)sender).Tag = (Keys)e.KeyValue;
            }
        }

设置完成后测试窗体

 private void Form2_Load(object sender, EventArgs e)
        {
            Xmlhelp xml = new Xmlhelp();
            xml.LoadFromXmlFile();
            _displaykey = xml.DisplayKey;
            _existkey = xml.Existkey;
            _hidekey = xml.Hidekey;
        }
         private void Form2_KeyDown(object sender, KeyEventArgs e)
        {
            //当前按下的键编码与xml中保存的键值相等则执行对应的方法
            if(e.KeyCode==_existkey)
            {
                Exist();
            }
            if(e.KeyCode==_displaykey)
            {
                Display();
            }
            if(e.KeyCode==_hidekey)
            {
                hide();
            }
        }

版权声明:本文为qq_37344688原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。