C#實現(xiàn)全局快捷鍵功能
更新時間:2022年06月16日 09:22:33 作者:天方
這篇文章介紹了C#實現(xiàn)全局快捷鍵功能的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
在c#中使用全局快捷鍵
由于.net并沒有提供快捷鍵的庫,所以要使用該功能得通過api實現(xiàn)。
在winapi中,注冊和注銷全局快捷鍵分別是通過RegisterHotKey和UnregisterHotKey函數(shù)實現(xiàn)。在c#中直接使用該api顯得不夠簡潔,這里我提供了一個友好點的封裝。
代碼如下:
static class Hotkey
{
#region 系統(tǒng)api
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, Keys vk);
[DllImport("user32.dll")]
static extern bool UnregisterHotKey(IntPtr hWnd, int id);
#endregion
/// <summary>
/// 注冊快捷鍵
/// </summary>
/// <param name="hWnd">持有快捷鍵窗口的句柄</param>
/// <param name="fsModifiers">組合鍵</param>
/// <param name="vk">快捷鍵的虛擬鍵碼</param>
/// <param name="callBack">回調(diào)函數(shù)</param>
public static void Regist(IntPtr hWnd, HotkeyModifiers fsModifiers, Keys vk, HotKeyCallBackHanlder callBack)
{
int id = keyid++;
if (!RegisterHotKey(hWnd, id, fsModifiers, vk))
throw new Exception("regist hotkey fail.");
keymap[id] = callBack;
}
/// <summary>
/// 注銷快捷鍵
/// </summary>
/// <param name="hWnd">持有快捷鍵窗口的句柄</param>
/// <param name="callBack">回調(diào)函數(shù)</param>
public static void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
{
foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
{
if (var.Value == callBack)
UnregisterHotKey(hWnd, var.Key);
}
}
/// <summary>
/// 快捷鍵消息處理
/// </summary>
public static void ProcessHotKey(System.Windows.Forms.Message m)
{
if (m.Msg == WM_HOTKEY)
{
int id = m.WParam.ToInt32();
HotKeyCallBackHanlder callback;
if (keymap.TryGetValue(id, out callback))
{
callback();
}
}
}
const int WM_HOTKEY = 0x312;
static int keyid = 10;
static Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>();
public delegate void HotKeyCallBackHanlder();
}
enum HotkeyModifiers
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8
}這里通過Hotkey類實現(xiàn)功能的封裝,使用非常簡單。下面為參考測試代碼。
void Test()
{
MessageBox.Show("Test");
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
Hotkey.ProcessHotKey(m);
}
private void button1_Click(object sender, EventArgs e)
{
Hotkey.UnRegist(this.Handle, Test);
}到此這篇關(guān)于C#實現(xiàn)全局快捷鍵功能的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入理解C# abstract和virtual關(guān)鍵字
深入理解C# abstract和virtual關(guān)鍵字,學習c#的朋友可以參考下。2011-06-06
C# IDE VS2005中的Hosting Process (vshost.exe)作用介紹
這篇文章主要介紹了C# IDE VS2005中的Hosting Process (vshost.exe)作用介紹,vshost.exe是一個宿主進程,主要用來提高調(diào)試效率,需要的朋友可以參考下2015-01-01

