网上的几分文档都似乎有点儿问题。也很可能是我自己的问题。下面是我的解决方案

第一步 引入到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设置全局快捷键相关推荐

  1. WPF设置全局字体和字体嵌入

    WPF设置全局字体和字体嵌入 原文:WPF设置全局字体和字体嵌入 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CLeopard/article/d ...

  2. windows 设置全局快捷键;

    简单设置全局快捷键: 组合键win+R 打开控制面板,小图表显示下 点击 管理工具项, 将自己想要谁知快捷键的程序的快捷方式放进去,(需要确认管理员权限) 如图,第一个即为 lz添加的 右击选择属性 ...

  3. win10 全局快捷键设置启动程序

    原文链接: win10 全局快捷键设置启动程序 上一篇: Python 安装anaconda 和conda 的简单使用 下一篇: surface pro win10 重装系统并解决屏幕亮度闪烁和降频的 ...

  4. windwos设置GifCam录屏全局快捷键

    对于自己写的或者一些实用的小工具,可以将其保存到C:\Windows,这样我们可以通过命令行的方式打开,当然其实本质只需要在系统的PATH路径下都可以在命令行打开. 下面gifcam是一个第三方的第三 ...

  5. C# 禁用 全局快捷键

    本文经原作者授权以原创方式二次分享,欢迎转载.分享. 原文作者:唐宋元明清 原文地址:https://www.cnblogs.com/kybs0/p/12558056.html C# 禁用 全局快捷键 ...

  6. 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates

    IntelliJ IDEA是一款非常优秀的JAVA编辑器,初学都可会对其中的一些做法感到很别扭,刚开始用的时候我也感到很不习惯,在参考了网上一些文章后在这里把我的一些经验写出来,希望初学者能快速适应它 ...

  7. linux如何设置mac快捷键,在Ubuntu上使用macOS的快捷键

    因为常用机一台Mac,一台Linux,都频繁使用,两个系统不同的快捷键已经让人精神分裂了! macOS几乎所有的快捷键都基于command键,全选(cmd+a).复制(cmd+c).粘贴(cmd+v) ...

  8. 设置VS2008 快捷键 快速注释

    如你所愿--设置VS2008快捷键 最近在使用VS2008学习C++,因为之前使用matlab已经习惯了使用快捷键注释Ctrl+R, Ctrl+T,因此希望能够自定义快捷键. (1)选择[工具]> ...

  9. java 设置全局热键_Java设置全局热键——第三方包jintellitype实现

    Java原生API并不支持为应用程序设置全局热键.要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/C++的javaer来说,有点困难.不过幸好,国外有人已经实 ...

最新文章

  1. JS实现图片的不间断连续滚动
  2. 论文浅尝 | 通过学习中间步骤的监督信号改进多跳知识库问答
  3. 作者:郭绍光(1985-),男,中国科学院上海天文台工程师
  4. Go语言学习Day04
  5. Linux虚拟机连不上网克隆虚拟机网卡无法启动
  6. sql 执行 delete 的时候,结合子查询 exists ,怎样支持别名呢?
  7. 关于EasyCVR平台Ehome协议接入设备出现停止启用现象的原因分析
  8. Windows下 OpenCV 的下载安装教程(详细)
  9. MATLAB 数据拟合 (使用 polyfit 多项式曲线拟合、polyval)
  10. Java Swing实现高仿电脑版微信
  11. 奥克兰硕士计算机专业学费,新西兰八大研究生各专业学费汇总
  12. L13.linux命令每日一练 -- 第二章 文件和目录操作命令 -- lsattr和file命令
  13. F5负载均衡设备入门
  14. beyondcompare ubuntu revoked问题
  15. 2019-2020中国互联网趋势报告
  16. Android高级工程师进阶学习,分享PDF高清版
  17. python数据分析项目之超市零售分析
  18. kkFiewView代码分析(三)有关CAD文件的转换
  19. Linux下安装压力测试工具hey、参数介绍、实例
  20. SpringCloud[01]Eureka服务注册与发现

热门文章

  1. Qt文档阅读笔记-qmake入门指南
  2. C++ STL stirng的复制比较
  3. linux系统rc路由配置_详解CentOS 6.4 添加永久静态路由所有方法汇总
  4. 3综述 yolo_Onestage目标检测算法综述
  5. android 华为手机灭屏搜索不到蓝牙_华为Mate 30更新EMUI10.1.0.132版本,新增10项实用功能...
  6. 橘子游戏平台_apex英雄_游戏快速下载_雷神加速器全网最快
  7. unity 2020 怎么写shader使其接受光照?_如何在Unity中造一个PBR Shader轮子
  8. c语言autoi函数如何使用,C++的auto声明、memset函数
  9. 国盾量子等参与中国量子通信行业首批标准编制 量子通信商用再加速
  10. python设置label的位置_Python3 tkinter基础 Label pack 设置控件在窗体中的位置