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.第一种就是先写好按钮 ...
随机推荐
- 安装MySQL 5.6
记录安装mysql 5.6的全过程 下载安装包(尝试过使用mysql的yum源去安装--如果你的网络够好的话...) 注:我的系统是Centos 7.2的 如下,根据自己的需求去下载 CentOS L ...
- 搭建 Spring 开发环境
把以下 jar 包加入到工程的 classpath 下: Spring 的配置文件: 一个典型的 Spring 项目需要创建一个或多个 Bean 配置文件, 这些配置文件用于在 Spring IOC ...
- echarts3结合openlayers2实现Map类型图表
网上查阅了部分资料,有些是用echarts2实现的,因echarts2无法满足项目中其他部分的要求,故只能采用echarts3(2017/9/18,echarts3官网突然把基于geo的demo下架了 ...
- JavaWeb -- Struts2 模型驱动
1. 模型驱动 示例: 注册表单reg.jsp <%@ page language="java" contentType="text/html; charset=u ...
- QSS设置字体不起作用
正确的QSS QLabel{ font-family: "Microsoft YaHei"; font-weight:bold; font-size:14px; color: #3 ...
- LeetCode第[13]题(Java):Roman to Integer
题目:罗马数字转换 题目难度:easy 题目内容:Roman numerals are represented by seven different symbols: I, V, X, L, C, D ...
- 手把手教你用Vue2+webpack+node开发一个H5 app
手把手教你用Vue2+webpack+node开发一个H5 app 前一篇vue2 + webpack + node 开发一个小demo说到了用vue的一些基本用法,这一篇就讲一个复杂一点的更完整的 ...
- v-model和sync修饰符
场景: 在用vue开发的过程中我们经常会遇到父子组件共用同一变量的情况,那么在这种情况下,我们肯定会想直接 把变量传过来用,因为是双向绑定的所以子组件就会修改这个变量,这样在vue中时会报错的. 问题 ...
- spring3: 基于Schema的AOP
6.3 基于Schema的AOP 基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面.切入点及声明通知. 在Spring配置文件中,所以AOP相关定义必须放在<a ...
- Android GridView 行间距过大(一页一行)
1. gridView.xml中 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&quo ...