国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2020-01-24 02:20:20
字體:
來源:轉載
供稿:網友

本文實例講述了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;
    }
}

希望本文所述對大家的C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙山县| 宜春市| 清新县| 仪征市| 南宫市| 托里县| 泰安市| 屯昌县| 资阳市| 甘洛县| 宜春市| 旬邑县| 山丹县| 杭州市| 沙洋县| 济源市| 安乡县| 海南省| 凤翔县| 罗定市| 扬州市| 长顺县| 琼海市| 军事| 化德县| 柏乡县| 崇明县| 福海县| 江山市| 通州区| 莱州市| 蒲江县| 措勤县| 华亭县| 广南县| 奉新县| 绵阳市| 竹北市| 定安县| 稻城县| 吉安市|