WPF设置全局快捷键
转自:http://www.cnblogs.com/atskyline/archive/2012/09/20/2694878.html
第一步 引入到Winows API
偷懒直接写在类里
1: [DllImport("user32.dll")]
2: public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
3: [DllImport("user32.dll")]
4: public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
这边可以参考两个MSDN的链接
第一个是关于RegisterHotKey函数的,里面有关于id,fsModifiers和vk 的具体说明
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646309%28v=vs.85%29.aspx
第二个是Virtual-Key 的表,即RegisterHotKey的最后一个参数
http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx
第二步 注册全局按键
这里先介绍一个窗体的事件SourceInitialized,这个时间发生在WPF窗体的资源初始化完毕,并且可以通过WindowInteropHelper获得该窗体的句柄用来与Win32交互。
具体可以参考MSDN http://msdn.microsoft.com/en-us/library/system.windows.window.sourceinitialized.aspx
我们通过重载OnSourceInitialized来在SourceInitialized事件发生后获取窗体的句柄,并且注册全局快捷键
1: private const Int32 MY_HOTKEYID = 0x9999;
2:
3: protected override void OnSourceInitialized(EventArgs e)
4: {
5: base.OnSourceInitialized(e);
6:
7: IntPtr handle = new WindowInteropHelper(this).Handle;
8: RegisterHotKey(handle, MY_HOTKEYID, 0x0001, 0x72);
9: }
关于几个常熟的解释
MY_HOTKEYID 是一个自定义的ID,取值范围在0x0000 到 0xBFFF。之后我们会根据这个值来判断事件的处理。
RegisterHotKey的第三或第四个参数可以参考第一步
第三步 添加接收所有窗口消息的事件处理程序
上面只是在系统中注册了快捷键,但是还要获取消息的事件,并筛选消息。
继续在OnSourceInitialized函数中操作
1: protected override void OnSourceInitialized(EventArgs e)
2: {
3: base.OnSourceInitialized(e);
4:
5: IntPtr handle = new WindowInteropHelper(this).Handle;
6: RegisterHotKey(handle, MY_HOTKEYID, 0x0001, 0x72);
7:
8: HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
9: source.AddHook(WndProc);
10: }
下面来完成WndProc函数
1: IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handle)
2: {
3: //Debug.WriteLine("hwnd:{0},msg:{1},wParam:{2},lParam{3}:,handle:{4}"
4: // ,hwnd,msg,wParam,lParam,handle);
5: if(wParam.ToInt32() == MY_HOTKEYID)
6: {
7: //全局快捷键要执行的命令
8: }
9: return IntPtr.Zero;
10: }
之前看到的几篇文章都是通过msg筛选的。
但是我测试后id,是在wParam参数中的。
WPF设置全局快捷键的更多相关文章
- WPF设置全局字体和字体嵌入
原文:WPF设置全局字体和字体嵌入 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CLeopard/article/details/40590373 ...
- WPF设置全局控件样式
原文:WPF设置全局控件样式 方法: 在资源文件APP.XAML中添加如下资源 <Application x:Class="_360UI.App" xmlns="h ...
- WPF之全局快捷键
目录 1.WPF快捷键实现方式 2.全局快捷键设置界面 3.Windows API调用 4.注册全局快捷键 5.快捷键触发 WPF快捷键实现方式 WPF快捷键实现主要有自定义快捷键命令和全局快捷键两种 ...
- WPF 注册全局快捷键
.NET技术交流群 199281001 .欢迎加入. using System; using System.Collections.Generic; using System.Linq; using ...
- 为Sublime Text 设置全局启动快捷键
为Sublime Text创建快捷方式.找到Sublime Text安装目录中的“sublime_text.exe”文件,然后右击创建快捷方式,如下图: 为Sublime Tex设置全局快捷键.将上 ...
- VS Extension: WPF : 使用全局方式 设置 窗体 foreground background
VS Extension 中 创建 WPF窗体后,总希望窗体的前后背景色和VS当前配色方案一致. 对每个control使用下列定义可以达到效果 Background="{DynamicRes ...
- 在WPF中使用全局快捷键
今天写一个小程序中使用到了全局快捷键,找到了我之前写的文章在c#中使用全局快捷键翻了一下,发现它是WinForm版本的,而我现在大部分写WPF程序了,便将其翻译了为WPF版本的了. static cl ...
- 在Form Load中设置showInTaskBar =false 或 隐藏窗口 this.Hide()时会导致注册的全局快捷键无效
在Form Load中设置showInTaskBar =false 或 隐藏窗口 this.Hide() 会导致注册的全局快捷键无效. 反正是其中一个,有点记不清了. 在Form Shown中s ...
- WPF——如何为项目设置全局样式。
在项目中,需要为所有的Button.TextBox设置一个默认的全局样式,一个个的为多个控件设置相同的样式显然是不明智的.在WPF中可以通过资源设置全局样式,主要有俩种方法: 1.第一种就是先写好按钮 ...
随机推荐
- Oracle loop、while、for循环
Loop循环 Declare p_sum ; p_i number; Begin p_i :; Loop p_sum := p_sum + p_i; p_i :; ) then SYS.Dbms_Ou ...
- void及void指针介绍【转】
本文转载自:http://blog.csdn.net/renren900207/article/details/20769503 void类型指针(如void *p)所指向的数据类型不是确定的,或者说 ...
- spring security采用自定义登录页和退出功能
更新... 首先采用的是XML配置方式,请先查看 初识Spring security-添加security 在之前的示例中进行代码修改 项目结构如下: 一.修改spring-security.xml ...
- mysql查询结果乱码
1.查询数据库结果乱码 mysql,; +-----------+-------------------------------------------------------------+ | do ...
- spark 写hbase
部分情况下: saveAsNewAPIHadoopDataset不能用 大坑, org.apache.hadoop.mapred 和 org.apache.hadoop.mapreduce两个包的混乱 ...
- 关于YII2中编辑页面全局变量冲突问题
今天做一编辑页面时被一个很小的问题困了许久.由于在YII2框架里高度集成了bootstrp框架,在做一个编辑的页面时出现了一个自定义的功能,自定义的字段非数据库表里的字段,所以需要在模型里单独声明一个 ...
- jsonp跨域传过来的数据格式
var uri1 = 'https://api.github.com?callback=JSON_CALLBACK'; /**/JSON_CALLBACK({ "meta": { ...
- 文件IO大纲
文件流与文件描述符的区别 a) 任何进程在运行时都默认打开3个流对象,(stdin, stdout, stderr)它们都有对应的文件描述符,其文件描述符分别为0,1,2,以后打开的文件描述符的值一般 ...
- xpath选择器简介及如何使用
xpath选择器简介及如何使用 一.总结 一句话总结:XPath 的全称是 XML Path Language,即 XML 路径语言,它是一种在结构化文档(比如 XML 和 HTML 文档)中定位信息 ...
- oracle,查看锁表
(1)锁表查询的代码有以下的形式:select count(*) from v$locked_object;select * from v$locked_object;(2)查看哪个表被锁select ...