c# 注册全局热键
//引入系统API
[DllImport("user32.dll")]
static extern bool RegisterHotKey(IntPtr hWnd, int id, int modifiers, Keys vk);
[DllImport("user32.dll")]
static extern bool UnregisterHotKey(IntPtr hWnd, int id); int keyid = ; //区分不同的快捷键
Dictionary<int, HotKeyCallBackHanlder> keymap = new Dictionary<int, HotKeyCallBackHanlder>(); //每一个key对于一个处理函数
public delegate void HotKeyCallBackHanlder(); //组合控制键
public enum HotkeyModifiers
{
Alt = ,
Control = ,
Shift = ,
Win =
} //注册快捷键
public void Regist(IntPtr hWnd, int modifiers, Keys vk, HotKeyCallBackHanlder callBack)
{
int id = keyid++;
if (!RegisterHotKey(hWnd, id, modifiers, vk))
throw new Exception("注册失败!");
keymap[id] = callBack;
} // 注销快捷键
public void UnRegist(IntPtr hWnd, HotKeyCallBackHanlder callBack)
{
foreach (KeyValuePair<int, HotKeyCallBackHanlder> var in keymap)
{
if (var.Value == callBack)
{
UnregisterHotKey(hWnd, var.Key);
return;
}
}
} // 快捷键消息处理
public void ProcessHotKey(Message m)
{
if (m.Msg == 0x312)
{
int id = m.WParam.ToInt32();
HotKeyCallBackHanlder callback;
if (keymap.TryGetValue(id, out callback))
callback();
}
}
public Form1()
{
InitializeComponent();
} HotKeys h = new HotKeys(); private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "注册")
{
string vaule = textBox1.Text;
Regist(vaule);
button1.Text = "卸载";
label2.Text = "注册成功";
}
else
{
h.UnRegist(this.Handle, CallBack);
button1.Text = "注册";
label2.Text = "卸载成功";
}
} private void Regist(string str)
{
if (str == "")
return;
int modifiers = ;
Keys vk = Keys.None;
foreach (string value in str.Split('+'))
{
if (value.Trim() == "Ctrl")
modifiers = modifiers + (int)HotKeys.HotkeyModifiers.Control;
else if (value.Trim() == "Alt")
modifiers = modifiers + (int)HotKeys.HotkeyModifiers.Alt;
else if (value.Trim() == "Shift")
modifiers = modifiers + (int)HotKeys.HotkeyModifiers.Shift;
else
{
if (Regex.IsMatch(value, @"[0-9]"))
{
vk = (Keys)Enum.Parse(typeof(Keys), "D" + value.Trim());
}
else
{
vk = (Keys)Enum.Parse(typeof(Keys), value.Trim());
}
}
}
//这里注册了Ctrl+Alt+E 快捷键
h.Regist(this.Handle, modifiers, vk, CallBack);
} //按下快捷键时被调用的方法
public void CallBack()
{
label2.Text = "快捷键被调用!";
} protected override void WndProc(ref Message m)
{
//窗口消息处理函数
h.ProcessHotKey(m);
base.WndProc(ref m);
} private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
StringBuilder keyValue = new StringBuilder();
keyValue.Length = ;
keyValue.Append("");
if (e.Modifiers != )
{
if (e.Control)
keyValue.Append("Ctrl + ");
if (e.Alt)
keyValue.Append("Alt + ");
if (e.Shift)
keyValue.Append("Shift + ");
}
if ((e.KeyValue >= && e.KeyValue <= ) ||
(e.KeyValue >= && e.KeyValue <= ) || //a-z/A-Z
(e.KeyValue >= && e.KeyValue <= )) //F1-F12
{
keyValue.Append(e.KeyCode);
}
else if ((e.KeyValue >= && e.KeyValue <= )) //0-9
{
keyValue.Append(e.KeyCode.ToString().Substring());
}
((TextBox)sender).Text = keyValue.ToString();
} private void textBox1_KeyUp(object sender, KeyEventArgs e)
{
string str = ((TextBox)sender).Text.TrimEnd();
int len = str.Length;
if (len >= && str.Substring(str.Length - ) == "+")
{
((TextBox)sender).Text = "";
}
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
h.UnRegist(this.Handle, CallBack);
}
界面



c# 注册全局热键的更多相关文章
- Qt5全局热键-QxtGlobalShortcut
最近做一个项目需要注册全局热键,在网上搜索发现有个第三方库 libqxt 中给出一个比较好的跨平台的解决方案,就是 QxtGlobalShortcut. 但是编译过程中发现这个库用到的QAbstrac ...
- <转>MFC注册系统/全局热键。
<转>MFC注册系统/全局热键. 1. BEGIN_MESSAGE_MAP(CRS232TESTDlg, CDialog) //{{AFX_MSG_MAP(CRS232TESTDlg) O ...
- Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)
转载:http://www.cuteqt.com/blog/?p=2088 Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对 ...
- 使用WinAPI全局热键注册和全局模拟按键
一.全局热键注册 1.先引用DLL [System.Runtime.InteropServices.DllImport("user32.dll")] //导入WinAPI publ ...
- C# register global hotkey ,onekey 注册多个全局热键以及单个全局热键
我们需要用非Hook的方法,来给我们的app 或者winform注册热键. 就像下面的 , 欧陆词典注册的一个热键F6一样, 在winform最小化的情况下,也能够全局响应热键. 这里使用系统API来 ...
- Delphi全局热键的注册
1.在窗启动时创建ATOM;(aatom:ATOM;定义在private中) then begin aatom:=GlobalAddAtom('ZWXhotKey'); end; ) then beg ...
- Qt全局热键(windows篇)
Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个 ...
- 第三方包jintellitype实现Java设置全局热键
Java原生API并不支持为应用程序设置全局热键.要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C /C++的javaer来说,有点困难.不过幸好,国外有人已经 ...
- VC添加全局热键的方法
VC添加全局热键的方法 这个方法靠谱 http://blog.csdn.net/lujianfeiccie2009/article/details/7498704 VC添加全局热键的方法 标签: bu ...
随机推荐
- Firemonkey ListView 点击事件
Firemonkey ListView 的点击事件一直让人摸不着头绪(各平台触发规则不太相同),因为它提供了点击相关的事件就有如下: OnChange:改变项目触发. OnClick:点击触发. On ...
- 导出 XE6 预设 Android Style (*.style) 档案
如果想要修改 Android Style 可以将它导出成 *.style 后再加入 TStyleBook 内来修改(iOS 的方法亦同):
- Redis数据库安装简介
方法一:Redis手动cmd启动服务 端客户端的方法-------Redis 服务端测试使用1. 下载Redis(https://github.com/mythz/redis-windows)2. 解 ...
- PyCharm不能自动import解决方法_PyCharm cannot auto import package troubleshooting
本人起初是用Eclipse+Pydev学习python的,其实也觉得挺好用.不过后来因为同事推荐去试了下PyCharm,就一发不可收拾的爱上了. 严格来说,题目上的问题其实对于很多人都不算是问题,但是 ...
- 异常之JSP页面跳转出错
今天在开发过程中发现一个问题:在页面中使用了<jsp:forward>抛错Attempt to clear a buffer that's already been flushed!! 百 ...
- SharePoint Online 创建门户网站系列之导航
前 言 关于SharePoint Online中的导航,基本是由Html + Css + JavaScript组成效果以及样式,然后在后台列表或者SharePoint Online元数据导航当做数据源 ...
- 如何保护在Autodesk应用程序商店的应用不被盗版 - 1
Autodesk应用程序商店如火如荼,但来自中国的应用却还是寥寥无几.大家在担心什么呢?可能其中一个因素就是担心自己的应用上线后被盗版的问题.对应用的版权保护和授权管理是每个应用开发者都应该认真考虑的 ...
- 通过API找出Autodesk Vault中某个用户组可以访问的Vault
首先在Vault Explorer中可以这样查看和更改某个用户组有权访问的vault Tools –> Administration –> Global Settings –> Gr ...
- Android Studio 小提示,新建Activity
Android Studio是在google I/O大会上新发布的一个IDE,基于IntelliJ,Android开发除了Eclipse之外又多了一种选择. 在Android Studio中如何在当前 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q21-Q24)
Question 21 An application will be deployed in a SharePoint 2010 server farm that is managed by depa ...