WPF设置全局快捷键
网上的几分文档都似乎有点儿问题。也很可能是我自己的问题。下面是我的解决方案
第一步 引入到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参数中的。
转载于:https://www.cnblogs.com/atskyline/archive/2012/09/20/2694878.html
WPF设置全局快捷键相关推荐
- WPF设置全局字体和字体嵌入
WPF设置全局字体和字体嵌入 原文:WPF设置全局字体和字体嵌入 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CLeopard/article/d ...
- windows 设置全局快捷键;
简单设置全局快捷键: 组合键win+R 打开控制面板,小图表显示下 点击 管理工具项, 将自己想要谁知快捷键的程序的快捷方式放进去,(需要确认管理员权限) 如图,第一个即为 lz添加的 右击选择属性 ...
- win10 全局快捷键设置启动程序
原文链接: win10 全局快捷键设置启动程序 上一篇: Python 安装anaconda 和conda 的简单使用 下一篇: surface pro win10 重装系统并解决屏幕亮度闪烁和降频的 ...
- windwos设置GifCam录屏全局快捷键
对于自己写的或者一些实用的小工具,可以将其保存到C:\Windows,这样我们可以通过命令行的方式打开,当然其实本质只需要在系统的PATH路径下都可以在命令行打开. 下面gifcam是一个第三方的第三 ...
- C# 禁用 全局快捷键
本文经原作者授权以原创方式二次分享,欢迎转载.分享. 原文作者:唐宋元明清 原文地址:https://www.cnblogs.com/kybs0/p/12558056.html C# 禁用 全局快捷键 ...
- 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates
IntelliJ IDEA是一款非常优秀的JAVA编辑器,初学都可会对其中的一些做法感到很别扭,刚开始用的时候我也感到很不习惯,在参考了网上一些文章后在这里把我的一些经验写出来,希望初学者能快速适应它 ...
- linux如何设置mac快捷键,在Ubuntu上使用macOS的快捷键
因为常用机一台Mac,一台Linux,都频繁使用,两个系统不同的快捷键已经让人精神分裂了! macOS几乎所有的快捷键都基于command键,全选(cmd+a).复制(cmd+c).粘贴(cmd+v) ...
- 设置VS2008 快捷键 快速注释
如你所愿--设置VS2008快捷键 最近在使用VS2008学习C++,因为之前使用matlab已经习惯了使用快捷键注释Ctrl+R, Ctrl+T,因此希望能够自定义快捷键. (1)选择[工具]> ...
- java 设置全局热键_Java设置全局热键——第三方包jintellitype实现
Java原生API并不支持为应用程序设置全局热键.要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/C++的javaer来说,有点困难.不过幸好,国外有人已经实 ...
最新文章
- JS实现图片的不间断连续滚动
- 论文浅尝 | 通过学习中间步骤的监督信号改进多跳知识库问答
- 作者:郭绍光(1985-),男,中国科学院上海天文台工程师
- Go语言学习Day04
- Linux虚拟机连不上网克隆虚拟机网卡无法启动
- sql 执行 delete 的时候,结合子查询 exists ,怎样支持别名呢?
- 关于EasyCVR平台Ehome协议接入设备出现停止启用现象的原因分析
- Windows下 OpenCV 的下载安装教程(详细)
- MATLAB 数据拟合 (使用 polyfit 多项式曲线拟合、polyval)
- Java Swing实现高仿电脑版微信
- 奥克兰硕士计算机专业学费,新西兰八大研究生各专业学费汇总
- L13.linux命令每日一练 -- 第二章 文件和目录操作命令 -- lsattr和file命令
- F5负载均衡设备入门
- beyondcompare ubuntu revoked问题
- 2019-2020中国互联网趋势报告
- Android高级工程师进阶学习,分享PDF高清版
- python数据分析项目之超市零售分析
- kkFiewView代码分析(三)有关CAD文件的转换
- Linux下安装压力测试工具hey、参数介绍、实例
- SpringCloud[01]Eureka服务注册与发现
热门文章
- Qt文档阅读笔记-qmake入门指南
- C++ STL stirng的复制比较
- linux系统rc路由配置_详解CentOS 6.4 添加永久静态路由所有方法汇总
- 3综述 yolo_Onestage目标检测算法综述
- android 华为手机灭屏搜索不到蓝牙_华为Mate 30更新EMUI10.1.0.132版本,新增10项实用功能...
- 橘子游戏平台_apex英雄_游戏快速下载_雷神加速器全网最快
- unity 2020 怎么写shader使其接受光照?_如何在Unity中造一个PBR Shader轮子
- c语言autoi函数如何使用,C++的auto声明、memset函数
- 国盾量子等参与中国量子通信行业首批标准编制 量子通信商用再加速
- python设置label的位置_Python3 tkinter基础 Label pack 设置控件在窗体中的位置