【C语言教程】全局快捷键功能详解

零 C语言教程评论67字数 1984阅读6分36秒阅读模式

所需工具:

C++

聪明的大脑文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

勤劳的双手文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

 文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

注意:本站只提供教程,不提供任何成品+工具+软件链接,仅限用于学习和研究,禁止商业用途,未经允许禁止转载/分享等文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

 文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

教程如下

在c#中使用全局快捷键文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

由于.net并没有提供快捷键的库,所以要使用该功能得通过api实现。文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

在winapi中,注册和注销全局快捷键分别是通过RegisterHotKey和UnregisterHotKey函数实现。在c#中直接使用该api显得不够简洁,这里我提供了一个友好点的封装。文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

代码如下:文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

[php]
static class Hotkey
{
#region 系统api
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool RegisterHotKey(IntPtr hWnd, int id, HotkeyModifiers fsModifiers, Keys vk);文章源自灵鲨社区-https://www.0s52.com/bcjc/cyyjc/12510.html

[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">回调函数</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">回调函数</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
}
[/php]

这里通过Hotkey类实现功能的封装,使用非常简单。下面为参考测试代码。

[php]
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);
}
[/php]

 

 

零
  • 转载请务必保留本文链接:https://www.0s52.com/bcjc/cyyjc/12510.html
    本社区资源仅供用于学习和交流,请勿用于商业用途
    未经允许不得进行转载/复制/分享

发表评论