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; } }