c# winform快捷鍵實現


我們在軟件中經常用到快捷鍵,這里整理備份一下。

首先我們要定義可以作為快捷鍵的按鍵,以下是整理的 一些,自己可以根據情況來修改

  public static Dictionary<int, string> HotKeys = new Dictionary<int, string>() 
        { 
            {48,"0"},  
            {49,"1"},  
            {50,"2"},      
            {51,"3"},     
            {52,"4"},    
            {53,"5"},     
            {54,"6"},    
            {55,"7"},    
            {56,"8"},    
            {57,"9"},
            {65,"A"},   
            {66,"B"},     
            {67,"C"},    
            {68,"D"},      
            {69,"E"},     
            {70,"F"},    
            {71,"G"},    
            {72,"H"},     
            {73,"I"},    
            {74,"J"},    
            {75,"K"},     
            {76,"L"},     
            {77,"M"},    
            {78,"N"},   
            {79,"O"},   
            {80,"P"},    
            {81,"Q"},     
            {82,"R"},     
            {83,"S"},      
            {84,"T"},     
            {85,"U"},     
            {86,"V"},    
            {87,"W"},     
            {88,"X"},      
            {89,"Y"},    
            {90,"Z"},        
            {112,"F1"},  
            {113,"F2"},     
            {114,"F3"},     
            {115,"F4"},    
            {116,"F5"},   
            {117,"F6"},     
            {118,"F7"},    
            {119,"F8"},     
            {120,"F9"},     
            {121,"F10"},   
            {122,"F11"},    
            {123,"F12"},
            {33,"PageUp"}, 
            {34,"PageDown"},  
            {35,"End"},      
            {36,"Home"},   
            {37,""},     
            {38,""},   
            {39,""},   
            {40,""},    
            {45,"Insert"},
            {46,"Delete"},
            {186,";"},   
            {187,"="},   
            {188,","},   
            {189,"-"},    
            {190,"."},    
            {191,"/"},    
            {192,"`"},   
            {219,"["},     
            {220,"\\"},    
            {221,"]"}
        };
View Code

然后弄個數據表存一下定義功能對應的快捷鍵,表結構如下

CREATE TABLE [dbo].[HotKey](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [FrmName] [nvarchar](50) NULL,
    [Sort] [int] NULL,
    [ActionName] [nvarchar](50) NULL,
    [ActionKey] [nvarchar](50) NULL,
    [KeyValue] [nvarchar](50) NULL
) ON [PRIMARY]

GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'界面' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'FrmName'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'順序' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'Sort'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'功能名稱' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'ActionName'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'功能編碼' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'ActionKey'
GO

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'熱鍵' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'HotKey', @level2type=N'COLUMN',@level2name=N'KeyValue'
GO
View Code

系統啟動的時候緩存一下設置的快捷鍵 

public static List<HotKey> HotKeySetting { get; set; }

基類窗體里面寫窗體的

寫KeyUP  和KeyDown事件

 bool m_blnCtrl = false;
 bool m_blnAlt = false;
 bool m_blnShift = false;

        [Description("定義的熱鍵列表"), Category("自定義")]
        public Dictionary<int, string> HotKeys { get; set; }
        //如果事件返回true則表示已經找到了快捷鍵事件,則不再向下傳遞
        public delegate bool HotKeyEventHandler(string strHotKey);
        /// <summary>
        /// 熱鍵事件
        /// </summary>
        [Description("熱鍵事件"), Category("自定義")]
        public event HotKeyEventHandler HotKeyDown;


 protected void FrmBase_KeyUp(object sender, KeyEventArgs e)
        {
            if (HotKeyDown != null && HotKeys != null)
            {
                if (e.KeyCode == Keys.Control || e.KeyCode == Keys.ControlKey)
                    m_blnCtrl = false;
                if (e.KeyCode == Keys.Alt || e.KeyCode == Keys.Menu)
                    m_blnAlt = false;
                if (e.KeyCode == Keys.Shift || e.KeyCode == Keys.ShiftKey)
                    m_blnShift = false;
            }
        }

        protected void FrmBase_KeyDown(object sender, KeyEventArgs e)
        {
            if (HotKeyDown != null && HotKeys != null)
            {
                if (e.KeyCode == Keys.Control || e.KeyCode == Keys.ControlKey)
                    m_blnCtrl = true;
                if (e.KeyCode == Keys.Alt || e.KeyCode == Keys.Menu)
                    m_blnAlt = true;
                if (e.KeyCode == Keys.Shift || e.KeyCode == Keys.ShiftKey)
                    m_blnShift = true;
                if (HotKeys.ContainsKey(e.KeyValue))
                {
                    string strKey = string.Empty;
                    if (m_blnCtrl)
                    {
                        strKey += "Ctrl+";
                    }
                    if (m_blnAlt)
                    {
                        strKey += "Alt+";
                    }
                    if (m_blnShift)
                    {
                        strKey += "Shift+";
                    }
                    strKey += HotKeys[e.KeyValue];

                    if (HotKeyDown(strKey))
                    {
                        e.Handled = true;
                        e.SuppressKeyPress = true;
                    }
                }
            }
        }            
View Code

你會注意到keyup和kedown事件的修飾符是protected,為什么要用protected呢?是因為窗體的一些輸入控件的按鍵事件是不會傳遞到窗體的,比如textbox這些,所有需要手動指定一下

子窗體中注冊事件就可以了,如果你沒有用基類窗體,那么直接寫在一起就可以了

this.HotKeys = HotKeys;
            this.HotKeyDown += FrmMain_HotKeyDown;
            //將輸入框的2個事件指向窗體的2個事件
            this.txtSearch.KeyDown += this.FrmBase_KeyDown;
            this.txtSearch.KeyUp += this.FrmBase_KeyUp;

/// <summary>
        /// 熱鍵按下事件
        /// </summary>
        /// <param name="strHotKey">熱鍵值</param>
        /// <returns>當返回true則表示不再向下傳遞按鍵事件,通常當匹配到熱鍵操作后返回true</returns>
        bool FrmMain_HotKeyDown(string strHotKey)
        {
            Console.WriteLine(strHotKey);
            string strHotAction = GetHotKeyAction("FrmMain", strHotKey);
            if (string.IsNullOrEmpty(strHotAction))
                return false;
            else
            {
                //這里根據返回的功能名稱做操作就可以了
                return true;
            }
        }


public static string GetHotKeyAction(string strFrom, string strHotKey)
        {
            var entity = HotKeySetting.Find(p => p.FrmName.ToLower() == strFrom.ToLower() && p.KeyValue.ToStringExt().ToLower() == strHotKey.ToLower());
            if (entity != null)
                return entity.ActionKey;
            else
                return string.Empty;
        }
View Code

這樣就可以了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM