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 ...
随机推荐
- hibernate----1-N--jointable(人与地址)
package com.ij34.dao; import java.util.HashMap; import java.util.HashSet; import java.util.Set; impo ...
- knowing abstract,virtual,override,new
If a class has at least one member which modified by "abstract",this class is an abstract ...
- SharePoint 2010商业智能组件
Microsoft Office SharePoint Server (MOSS) 2007中,就已经提供了很多支持商业智能的能力.其中主要的组件包含Excel Services, Reporting ...
- SAP (ABAP) 常用的数学函数
Function func Return value abs Absolute value of the argument arg (绝对值) sign Plus/minus sign of the ...
- [javascript svg fill stroke stroke-width x y rect rx ry 属性讲解] svg fill stroke stroke-width rect 绘制具有圆角矩形属性讲解
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- 自定义有监听器的ScrollView
public class ObservableScrollView extends ScrollView { public ObservableScrollView(Context context) ...
- 工作中碰到的js问题(disabled表单元素不能提交到服务器)
今天碰到一个奇葩的问题,asp页面表单提交后,有一个文本框<input type="text" name="phone" id="phone&q ...
- 【代码笔记】iOS-浮动的云
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- view渐变色,透明度渐变
1 功能描述 开发中经常遇到这样的需求:view2显示在view1上面,透过view2可以渐渐的看到view1.效果如图1所示:view1是一个imageView,view2是一个普通view.vie ...
- OC NSString(字符串)
OC NSString(字符串) 多行文字字面量 NSString * string = @"abC" @"DEF" @"hjk" @&qu ...