动态为程序指定快捷键
為了提供更加好的用戶體驗,在windows Forms開發(fā)中,通常我們需要讓用戶可以自定義快捷鍵。我們知道在設計階段指派快捷鍵是很容易的,但是如何讓他們可以在運行時動態(tài)指定快捷鍵呢?
第一步:導入兩個函數(shù),分別是注冊和取消注冊快捷鍵
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace TestHotKeys
{
??? class HotKeys
??? {
??????? //如果函數(shù)執(zhí)行成功,返回值不為0。???????
??????? //如果函數(shù)執(zhí)行失敗,返回值為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???????????
??????????? );???????
??????????? //定義了輔助鍵的名稱(將數(shù)字轉變?yōu)樽址员阌谟洃?#xff0c;也可去除此枚舉而直接使用數(shù)值)???????
??????? [Flags()]???????
??????? public enum KeyModifiers??????? {???????????
??????????? None = 0,???????????
??????????? Alt = 1,???????????
??????????? Ctrl = 2,???????????
??????????? Shift = 4,???????????
??????????? WindowsKey = 8???????
??????? }
??? }
}
?
第二步:在窗體的初始化之后,注冊快捷鍵
/// <summary>
/// 注冊快捷鍵。這里的100,101,102是隨便寫的,只要不重復就可以
/// </summary>
private void RegisterHotKeys()
{
??? HotKeys.RegisterHotKey(Handle, 100, HotKeys.KeyModifiers.Shift, Keys.A);
??? HotKeys.RegisterHotKey(Handle, 101, HotKeys.KeyModifiers.Shift, Keys.B);
??? HotKeys.RegisterHotKey(Handle, 102, HotKeys.KeyModifiers.Shift, Keys.C);
}
第三步:編寫一個特殊事件,讓窗體能接收windows消息
/// <summary>
/// 響應窗體消息的事件
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
??? const int WM_HOTKEY = 0x0312;
??? switch (m.Msg)
??? {
??????? case WM_HOTKEY: {
??????????? switch (m.WParam.ToInt32())
??????????? {
??????????????? case 100: { CallMethod("A"); break; }
??????????????? case 101: { CallMethod("B"); break; }
??????????????? case 102: { CallMethod("C"); break; }
??????????????? default:
??????????????????? break;
??????????? }
??????????? break;
??????? }
??????? default:
??????????? break;
??? }
??? base.WndProc(ref m);
}
我們這里是為了演示目的,實現(xiàn)了一個簡單的CallMethod方法,它就是顯示一個消息而已
private void CallMethod(string input) {
??? MessageBox.Show(input);
}
?
?
最后,不要忘記在窗體關閉的時候,取消快捷鍵的注冊
/// <summary>
/// 取消快捷鍵注冊
/// </summary>
private void UnRegisterHotKeys()
{
??? HotKeys.UnregisterHotKey(Handle, 100);
??? HotKeys.UnregisterHotKey(Handle, 101);
??? HotKeys.UnregisterHotKey(Handle, 102);
}
總結
以上是生活随笔為你收集整理的动态为程序指定快捷键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ***程序一般的启动方式
- 下一篇: 三个小命令检查电脑!