C# 全局熱鍵設置 與 窗體熱鍵設置


1、 窗體熱鍵

 首先要設置主窗體KeyPreview為true,可直接在屬性中進行設置,
或者在窗體加載中設置: this.KeyPreview = true;
 然后添加窗體KeyDown事件,如下:
        private void FrmMain_KeyDown(object sender, KeyEventArgs e)
 { if (e.Alt && e.Shift && e.Control && e.KeyCode == Keys.S) { MessageBox.Show("我按了Control +Shift +Alt +S"); } }

2、全局熱鍵設置

   定義API函數 》 注冊熱鍵 》 卸載熱鍵

   我這里定義了AppHotKey類,全部代碼如下:

  public class AppHotKey
    {
        [DllImport("kernel32.dll")]
        public static extern uint GetLastError();
        //如果函數執行成功,返回值不為0。
        //如果函數執行失敗,返回值為0。要得到擴展錯誤信息,調用GetLastError。
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(
            IntPtr hWnd,                //要定義熱鍵的窗口的句柄
            int id,                     //定義熱鍵ID(不能與其它ID重復)           
            KeyModifiers fsModifiers,   //標識熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時才會生效
            Keys vk                     //定義熱鍵的內容
            );

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(
            IntPtr hWnd,                //要取消熱鍵的窗口的句柄
            int id                      //要取消熱鍵的ID
            );

        //定義了輔助鍵的名稱(將數字轉變為字符以便於記憶,也可去除此枚舉而直接使用數值)
        [Flags()]
        public enum KeyModifiers
        {
            None = 0,
            Alt = 1,
            Ctrl = 2,
            Shift = 4,
            WindowsKey = 8
        }
        /// <summary>
        /// 注冊熱鍵
        /// </summary>
        /// <param name="hwnd">窗口句柄</param>
        /// <param name="hotKey_id">熱鍵ID</param>
        /// <param name="keyModifiers">組合鍵</param>
        /// <param name="key">熱鍵</param>
        public static void RegKey(IntPtr hwnd, int hotKey_id, KeyModifiers keyModifiers, Keys key)
        {
            try
            {
                if (!RegisterHotKey(hwnd, hotKey_id, keyModifiers, key))
                {
                    if (Marshal.GetLastWin32Error() == 1409) { MessageBox.Show("熱鍵被占用 !"); }
                    else
                    {
                        MessageBox.Show("注冊熱鍵失敗!");
                    }
                }
            }
            catch (Exception) { }
        }
        /// <summary>
        /// 注銷熱鍵
        /// </summary>
        /// <param name="hwnd">窗口句柄</param>
        /// <param name="hotKey_id">熱鍵ID</param>
        public static void UnRegKey(IntPtr hwnd, int hotKey_id)
        {
            //注銷Id號為hotKey_id的熱鍵設定
            UnregisterHotKey(hwnd, hotKey_id);
        }
    }

重寫窗體的WndProc函數,在窗口創建的時候注冊熱鍵,窗口銷毀時銷毀熱鍵,代碼如下:

       private const int WM_HOTKEY = 0x312; //窗口消息-熱鍵
        private const int WM_CREATE = 0x1; //窗口消息-創建
        private const int WM_DESTROY = 0x2; //窗口消息-銷毀
        private const int Space = 0x3572; //熱鍵ID
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            switch (m.Msg)
            {
                case WM_HOTKEY: //窗口消息-熱鍵ID
                    switch (m.WParam.ToInt32())
                    {
                        case Space: //熱鍵ID
                            MessageBox.Show("我按了Control +Shift +Alt +S");
                            break;
                        default:
                            break;
                    }
                    break;
                case WM_CREATE: //窗口消息-創建
                    AppHotKey.RegKey(Handle, Space, AppHotKey.KeyModifiers.Ctrl | AppHotKey.KeyModifiers.Shift | AppHotKey.KeyModifiers.Alt, Keys.S);
                    break;
                case WM_DESTROY: //窗口消息-銷毀
                    AppHotKey.UnRegKey(Handle, Space); //銷毀熱鍵
                    break;
                default:
                    break;
            }
        }

 


免責聲明!

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



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