原文:WPFの三种方式实现快捷键

最近,对wpf添加快捷键的方式进行了整理。主要用到的三种方式如下:

一、wpf命令:

资源中添加命令
<Window.Resources><RoutedUICommand x:Key="ToolCapClick" Text="截屏快捷键" />
</Window.Resources>输入命令绑定
<Window.InputBindings><KeyBinding Gesture="Ctrl+Alt+Q" Command="{StaticResource ToolCapClick}"/>
</Window.InputBindings>命令执行方法绑定
<Window.CommandBindings><CommandBinding Command="{StaticResource ToolCapClick}"CanExecute="CommandBinding_ToolCapClick_CanExecute"Executed="CommandBinding_ToolCapClick_Executed"/>
</Window.CommandBindings>

需要注意的是,绑定命令的时候,也可以<KeyBinding Modifiers="Ctrl+Alt" Key="Q" Command="{StaticResource ToolCapClick}"/>,建议用前者,以免造成混乱。

执行方法实现

  #region 截屏快捷键private void CommandBinding_ToolCapClick_CanExecute(object sender, CanExecuteRoutedEventArgs e){e.CanExecute = true;}private void CommandBinding_ToolCapClick_Executed(object sender, ExecutedRoutedEventArgs e){try{CaptureImageTool capture = new CaptureImageTool();capture.CapOverToHandWriting += Capture_CapOverToHandWriting;capture.CapOverToBlackboard += Capture_CapOverToBlackboard;string saveName = String.Empty;if (capture.ShowDialog() == System.Windows.Forms.DialogResult.OK){//保存截取的内容System.Drawing.Image capImage = capture.Image;//上课存班级内部,不上课存外部string strSavePath = DataBusiness.GetCurrentTeachFilePath(SystemConstant.PATH_CAPS);if (!String.IsNullOrEmpty(strSavePath)){if (!Directory.Exists(strSavePath)){Directory.CreateDirectory(strSavePath);}saveName = strSavePath + DateTime.Now.ToString(SystemConstant.FORMAT_CAPS);}else{saveName = PathExecute.GetPathFile(SystemConstant.PATH_SAVE + Path.DirectorySeparatorChar + SystemConstant.PATH_CAPS, DateTime.Now.ToString(SystemConstant.FORMAT_CAPS));}capImage.Save(saveName + SystemConstant.EXTENSION_PNG, System.Drawing.Imaging.ImageFormat.Png);}}catch (Exception ex){new Exception("capscreen module error:" + ex.Message);}}

二、利用windows钩子(hook)函数

第一步 引入到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事件发生后获取窗体的句柄,并且注册全局快捷键

 private const Int32 MY_HOTKEYID = 0x9999;protected override void OnSourceInitialized(EventArgs e){base.OnSourceInitialized(e);IntPtr handle = new WindowInteropHelper(this).Handle;RegisterHotKey(handle, MY_HOTKEYID, 0x0001, 0x72);}

关于几个常熟的解释

MY_HOTKEYID 是一个自定义的ID,取值范围在0x0000 到 0xBFFF。之后我们会根据这个值来判断事件的处理。

RegisterHotKey的第三或第四个参数可以参考第一步

第三步 添加接收所有窗口消息的事件处理程序

上面只是在系统中注册了快捷键,但是还要获取消息的事件,并筛选消息。

继续在OnSourceInitialized函数中操作

 protected override void OnSourceInitialized(EventArgs e){base.OnSourceInitialized(e);IntPtr handle = new WindowInteropHelper(this).Handle;RegisterHotKey(handle, MY_HOTKEYID, 0x0001, 0x72);HwndSource source = PresentationSource.FromVisual(this) as HwndSource;source.AddHook(WndProc);}

下面来完成WndProc函数

 IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handle){//Debug.WriteLine("hwnd:{0},msg:{1},wParam:{2},lParam{3}:,handle:{4}"//                ,hwnd,msg,wParam,lParam,handle);if(wParam.ToInt32() == MY_HOTKEYID){//全局快捷键要执行的命令}return IntPtr.Zero;}

三、给button控件添加快捷键

<UserControl.Resources><RoutedUICommand x:Key="ClickCommand" Text="点击快捷键" />
</UserControl.Resources><UserControl.CommandBindings><CommandBinding Command="{StaticResource ClickCommand}" Executed="ClickHandler" />
</UserControl.CommandBindings><UserControl.InputBindings><KeyBinding Key="C" Modifiers="Ctrl" Command="{StaticResource ClickCommand}" />
</UserControl.InputBindings><Grid><Button Content="button" Command="{StaticResource ClickCommand}"/>
</Grid>

执行方法:

private void ClickHandler(object sender, RoutedEventArgs e)
{Message.Show("命令执行!");}

WPFの三种方式实现快捷键相关推荐

  1. WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式

    WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 原文:WPF中实现PropertyGrid(用于展示对象的详细信息)的三种方式 由于WPF中没有提供PropertyGrid控 ...

  2. Spring 容器:三种方式解决 Resource leak: ‘applicationContext‘ is never closed 问题

    文章目录 前言 一.Spring 容器警告的产生 1.1.项目场景 二.Spring 容器未关闭后果分析 2.1.肉眼可见的警告 2.2.导致的内存泄漏 2.2.1.什么是内存泄漏? 2.2.2.如何 ...

  3. AUTOCAD——总结CAD画圆角的三种方式

    CAD画圆角的三种方式 操作方式 1.输入给对象加圆角命令"FILLET"(快捷键:F),按下空格,再输入"r",空格,输入圆角的半径,然后空格,接着选择第一. ...

  4. Zbrush学习关于缩放的三种方式

    缩放的三种方式 一.画布缩放 画布的缩放快捷键是-/+,作用是缩放整个画布,表现是模型画布同时在缩小或放大. 二.视角缩放 视角缩放实际上是把模型拉远或放近,这个操作相当于使用放大镜,模型其实没有真的 ...

  5. 引入字体图标的三种方式

    @引入字体图标的三种方式TOC Unicode引用 fontclass引用 symbol引用--此种引用方式支持多色图标 字体包: 1.icomoon字库https://icomoon.io/ 2.阿 ...

  6. 怎么把tiff文件转换为jpg?教你三种方式

    tiff格式转化成jpg格式?相信很多人对于tiff格式较为陌生,我们需要对其进行了解,从而发挥出tiff文件格式的重要作用.通常来说,tiff是一种非失真的压缩格式.tiff文件的压缩主要是应用于文 ...

  7. 使用apache-poi生成excel文件与同步请求三种方式与文件下载

    使用apache-poi生成excel文件 a)添加依赖: <!-- poi依赖--><dependency><groupId>org.apache.poi< ...

  8. 远程控制virtual box虚拟机系统的三种方式

    远程控制virtual box虚拟机系统的三种方式[阅读时间:5分钟] 1.使用现有的远程控制软件 2.使用SSH连接 3.使用远程桌面控制虚拟机系统 对于把虚拟机安装在寝室笔记本的人来说,能够远程控 ...

  9. 命令行运行Python脚本时传入参数的三种方式

    三种常用的方式 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. python script.py 0,1,2 10 python script ...

  10. sass文件编译的三种方式【舒】

    [舒:]sass文件编译的三种方式 方式一: 1.webstorm打开evtGulp项目或者mcake-activity项目 2.中,开启gulp->default/develop,启动watc ...

最新文章

  1. 设计带有SD卡的 MM32F3277 MicroPython 实验板
  2. jquery操作dom
  3. HDOJ1014 Uniform Generator
  4. mysql时区设置gmt_将MySQL数据库时区设置为GMT
  5. java线程变量值_JAVA线程中对变量值的修改
  6. 人脸检测与识别的趋势和分析
  7. Idea创建包以及导入jar包等操作
  8. mysql 数据库复制软件_mysql 快速复制数据库
  9. (转)Visual C++开发工具与调试技巧整理
  10. 子集数据帧中的丢包因子级别
  11. 数组重组java,重组数组数组并组合相同的术语
  12. 【黑魔法】Covering Indexes、STRAIGHT_JOIN
  13. ISO27000信息安全管理体系
  14. 渗透测试-地基篇-拖库七种方法(十一)
  15. MSM8937系统启动流程
  16. MATLAB主题设置配色方案
  17. 用python实现双人五子棋(终端版)
  18. ArcGIS入门教程(矢量编辑工作流程)
  19. golang中定时器ticker
  20. 【单片机】辉光管时钟系列<四>温度芯片DS18B20显示

热门文章

  1. cnblogs用户体验评价
  2. 七言 感大兴安岭大火
  3. 【颜色空间】CLElab颜色空间
  4. 《剑指offer》面试题22——栈的压入、弹出序列(C++)
  5. 数组中的奇数排在偶数组前面
  6. EXCEL IFS函数的使用
  7. java+editor类_GLIPS Graffiti editor
  8. Flutter之Redux框架原理解析
  9. Apache Flink 在国有大型银行智能运营场景下的应用
  10. 移动App 网络优化细节探讨