知识库

C#窗体快捷键实现

2012-02-06

首先把窗口的KeyPreview属性设置为True。开启按钮截获

 

 #region 快捷键实现

 
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.F1)
            {
                GetHelp(this.Text);
            }
            else
            {
                //处理热键
                IEnumerable<HotKeyBinding> myhotKeyBindings = hotKeyBindings.Where(bind => bind.Keys.Equals(keyData));
                if (myhotKeyBindings != null)
                {
                    foreach (HotKeyBinding hotKeyBinding in myhotKeyBindings)
                    {
                        if (hotKeyBinding.Button is Control)
                        {
                            Control button = (Control)hotKeyBinding.Button;
                            if (button.Enabled && button.Visible)
                            {
                                hotKeyBinding.Button.PerformClick();
                            }
                        }
                        else
                        {
                            hotKeyBinding.Button.PerformClick();
                        }
                    }
                }
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
 
        private List<HotKeyBinding> hotKeyBindings = new List<HotKeyBinding>();
        protected class HotKeyBinding
        {
            public Keys Keys { get; set; }
            public IButtonControl Button { get; set; }
            public HotKeyBinding(Keys keys, IButtonControl button)
            {
                Keys = keys;
                Button = button;
            }
        }
        /// <summary>
        /// 添加快捷键绑定一次
        /// </summary>
        protected int AddHotKey(Keys keys, IButtonControl button)
        {
            hotKeyBindings.Add(new HotKeyBinding(keys, button));
            return hotKeyBindings.Count;
        }
        /// <summary>
        /// 解除快捷键绑定一次
        /// Tip:解最后一个
        /// </summary>
        protected int RemoveHotKey(Keys keys, IButtonControl button)
        {
            HotKeyBinding hotKeyBinding = hotKeyBindings.LastOrDefault(bing => bing.Keys.Equals(keys) && bing.Button == button);
            if (hotKeyBinding != null)
                hotKeyBindings.Remove(hotKeyBinding);
            return hotKeyBindings.Count;
        }
        /// <summary>
        /// 解除某个快捷键的绑定(一次或全部)(默认清除全部)
        /// Tip:如果清除一次,则清除最后一个
        /// </summary>
        protected int RemoveHotKey(Keys keys, bool isClearOrCutDown = true)
        {
            if (isClearOrCutDown)
            {
                hotKeyBindings.RemoveAll(bing => bing.Keys.Equals(keys));
                return hotKeyBindings.Count;
            }
            else
            {
                HotKeyBinding hotKeyBinding = hotKeyBindings.LastOrDefault(bing => bing.Keys.Equals(keys));
                if (hotKeyBinding != null)
                    hotKeyBindings.Remove(hotKeyBinding);
            }
            return hotKeyBindings.Count;
        }
        /// <summary>
        /// 解除某个按钮的所有快捷键的绑定(一次或全部)(默认清除全部)
        /// Tip:如果清除一次,则清除最后一个
        /// </summary>
        protected int RemoveHotKey(IButtonControl button, bool isClearOrCutDown = true)
        {
            if (isClearOrCutDown)
            {
                hotKeyBindings.RemoveAll(bing => bing.Button == button);
                return hotKeyBindings.Count;
            }
            else
            {
                HotKeyBinding hotKeyBinding = hotKeyBindings.LastOrDefault(bing => bing.Button == button);
                if (hotKeyBinding != null)
                    hotKeyBindings.Remove(hotKeyBinding);
            }
            return hotKeyBindings.Count;
        }
        /// <summary>
        /// 是否存在相应的快捷键
        /// </summary>
        public bool inceptKey(Keys keys)
        {
            foreach (HotKeyBinding hkBind in hotKeyBindings)
            {
                if (hkBind.Keys.Equals(keys))
                {
                    if (hkBind.Button is Control)
                    {
                        Control button = (Control)hkBind.Button;
                        if (button.Enabled && button.Visible)
                        {
                            return true;
                        }
                        else
                        {
                            continue;
                        }
                    }
                    else
                    {
                        return true;
                    }
                }
            }
            return false;
        }
 
        protected void GetHelp(string _keyword)
        {
            string helpFile = "";
            Process ps = System.Diagnostics.Process.GetCurrentProcess();
 
            if (File.Exists(helpFile))
            {
                Help.ShowHelp(this, helpFile, HelpNavigator.KeywordIndex, _keyword);
            }
            else
            {
                MsgBox.Show(string.Format("找不到帮助文档,帮助文档是否存在!文件名:{0}", helpFile), "帮助文档缺失", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
 
#endregion
版权所有 © 2011 CopyRight 南宁珞德信息技术有限公司 代码:商务部 设计:新1站