方式一:使用SourceInitialized,在使用快捷键必须先注册快捷键,窗体启动并重写SourceInitialized这个时间发生在WPF窗体的资源初始化完毕,并且可以通过WindowInteropHelper获得该窗体的句柄用来与Win32交互。

    protected override void OnSourceInitialized(EventArgs e){base.OnSourceInitialized(e);//注册快捷键热键HotKey k = new HotKey(this, HotKey.KeyFlags.MOD_ALT, System.Windows.Forms.Keys.D);k.OnHotKey += new HotKey.OnHotkeyEventHandeler(ScreenShotHotKey);}//快捷键启动事件private void ScreenShotHotKey(){MessageBox.Show("启动截图");}

方式二:Window_KeyDown,KeyEventArgs对象包含一个KeyStates属性,该属性反映触发事件的键的属性,KeyboardDevice属性为键 盘上的所有键提供了相同的信息,自然也提供了一个KeyboardDevice类的一个实例。它的属性包括当前是哪个元素具有焦点,以及当事件发生时按下了哪些修饰键(Modifiers)包括Shift、Ctrl、Alt键,并且使用位逻辑来检查它们的状态。

<!--xaml前端代码-->
<Window x:Class="Test.Views.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:Controls="clr-namespace:Autodesk.Navisworks.Api.Controls;assembly=Autodesk.Navisworks.Controls"xmlns:form="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"Title="MainWindow"   KeyDown="Window_KeyDown" WindowState="Maximized">
</window> //快捷键
private void Window_KeyDown(object sender, KeyEventArgs e)
{/*if ((e.KeyboardDevice.Modifiers & ModifierKeys.Control) == ModifierKeys.Control&&e.Key==Key.D1){//将要执行代码}*/if (e.KeyStates == Keyboard.GetKeyStates(Key.D) && Keyboard.Modifiers == ModifierKeys.Alt){MessageBox.Show("您按下了键");}
}

方式三:使用钩子,需要引用 System.Windows.Forms

<!--xaml代码-->
<Window x:Class="Test.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Test"xmlns:MyNamespace="clr-namespace:Test"    mc:Ignorable="d" Name="win" xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"Title="Window1" Height="450" Width="800"  WindowStyle="None"><Grid ><Button Name="BtnStart" Content="Start" HorizontalAlignment="Left" Margin="207,216,0,0" VerticalAlignment="Top" Width="100" Height="30" Click="BtnStart_Click"/><Button Name="BtnStop" Content="Stop" HorizontalAlignment="Left" Margin="460,216,0,0" VerticalAlignment="Top" Width="100" Height="30" Click="BtnStop_Click"/></Grid>
</Window>/// <summary>
/// Window1.xaml 的交互逻辑后台代码
/// </summary>
public partial class Window1 : Window
{/// 声明回调函数委托  /// </summary>  /// <param name="nCode"></param>  /// <param name="wParam"></param>  /// <param name="lParam"></param>  /// <returns></returns>  public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);/// <summary>  /// 委托实例  /// </summary>  HookProc KeyboardHookProcedure;/// <summary>  /// 键盘钩子句柄  /// </summary>  static int hKeyboardHook = 0;//装置钩子的函数   [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);//卸下钩子的函数   [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);//获取某个进程的句柄函数  [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern IntPtr GetModuleHandle(string lpModuleName);/// <summary>  /// 普通按键消息  /// </summary>  private const int WM_KEYDOWN = 0x100;/// <summary>  /// 系统按键消息  /// </summary>  private const int WM_SYSKEYDOWN = 0x104;//鼠标常量   public const int WH_KEYBOARD_LL = 13;//声明键盘钩子的封送结构类型   [StructLayout(LayoutKind.Sequential)]public class KeyboardHookStruct{public int vkCode; //表示一个在1到254间的虚似键盘码   public int scanCode; //表示硬件扫描码   public int flags;public int time;public int dwExtraInfo;}public Window1(){InitializeComponent();}/// <summary>  /// 截取全局按键,发送新按键,返回  /// </summary>  /// <param name="nCode"></param>  /// <param name="wParam"></param>  /// <param name="lParam"></param>  /// <returns></returns>  private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){if (nCode >= 0 && wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN){KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));System.Windows.Forms.Keys keyData = (System.Windows.Forms.Keys)MyKeyboardHookStruct.vkCode;if (keyData == System.Windows.Forms.Keys.D && (int)System.Windows.Forms.Control.ModifierKeys == (int)System.Windows.Forms.Keys.Control){MessageBox.Show("你按下了Ctrl+D");//return为了屏蔽原来的按键,如果去掉,则原来的按键和新的按键都会模拟按。  return 1;}}return 0;}private void BtnStart_Click(object sender, RoutedEventArgs e){//启动键盘钩子   if (hKeyboardHook == 0){//实例化委托  KeyboardHookProcedure = new HookProc(KeyboardHookProc);Process curProcess = Process.GetCurrentProcess();ProcessModule curModule = curProcess.MainModule;hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0);}}/// <summary>  /// 停止键盘钩子  /// </summary>  /// <param name="sender"></param>  /// <param name="e"></param>  private void BtnStop_Click(object sender, EventArgs e){bool retKeyboard = true;if (hKeyboardHook != 0){retKeyboard = UnhookWindowsHookEx(hKeyboardHook);hKeyboardHook = 0;}//如果卸下钩子失败   if (!(retKeyboard)) throw new Exception("卸下钩子失败!");}}

WPF 使用全局键盘(快捷键)相关推荐

  1. skype快捷键_每个Skype键盘快捷键及其用法

    skype快捷键 Roberto Ricca/Shutterstock罗伯托·里卡/ Shutterstock Get familiar with Skype's unique keyboard sh ...

  2. python全局键盘监听(pynput快捷键);利用pywin32快速截屏并生成视频

    python全局键盘监听(pynput快捷键):利用pywin32快速截屏并生成视频 第一次在CSDN写博客,有点小紧张(/ω\) 以下内容完全个人理解,有错误请指出~ 最近在用python做一个小工 ...

  3. C#全局键盘监听(Hook)的使用(转载)

    一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...

  4. C#全局键盘监听(Hook)

    一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...

  5. [No0000A6]Visual Studio 2015 中的常用命令的默认键盘快捷键-VS2015 Shortcut

    注意:你也可以通过打开"选项"对话框,展开"环境"节点,然后选择"键盘",查找任何命令的快捷键. Build(生成) 命令 键盘快捷键 [上 ...

  6. 智能J IDEA键盘快捷键

    智能J IDEA键盘快捷键 最后修改时间:08 十二月 2021 IntelliJ IDEA为其与编辑,导航,重构,调试和其他任务相关的大多数命令提供了键盘快捷键.记住这些热键可以帮助您通过将手放在键 ...

  7. win10键盘全变成快捷键_(安卓)全键盘快捷键

    之前聊过一些ios越狱后可实现的一些键盘附加插件: (越狱)轻量化的自带键盘增强系列插件 有朋友就问安卓的有这类的插件吗?当然有了!而且无需root就能实现,那么这一期我们就来聊一聊吧: 首先是下载地 ...

  8. visual studio code 键盘快捷键参考

    原文 引用 键盘快捷键参考 这些键盘快捷键的可打印版本链接: windows macOS Linux 基本编辑 注意:以下是使用标准美式键盘布局的.如果您使用不同的键盘布局,请阅读这里 . 键 命令 ...

  9. 如何在Mac上创建您自己的快捷键?如果键盘快捷键不能正常工作该怎么办?

    Mac上也有很多快捷键,使用快捷键操作会便捷很多,当然你也可以自己来创建快捷键,那么如何在Mac上创建您自己的快捷键?下面带来实用的教程,顺便帮大家解决一下关于键盘快捷键不能正常工作的问题,赶紧来这里 ...

最新文章

  1. Linux chmod命令修改文件与文件夹权限命令代码
  2. 深度学习用于基于内容的图像检索 Deep Learning for Content-Based Image Retrieval
  3. java sql string_JAVA String转化成java.sql.date和java.sql.time方法示例
  4. Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护
  5. python post body_python写http post请求的四种请求体
  6. ZeroMQ接口函数之 :zmq_ipc – ZMQ本地进程间通信传输协议
  7. 2013校队选拔——最短路——二分最大边的最小值
  8. 推荐10本大数据领域必读的经典好书(火速收藏)
  9. lbj学习日记 08 输入一组不定个数的数字,并且把它保存在一个数组中
  10. 服务器被ddos攻击?分析如何防止DDOS攻击?
  11. TYPE-C HUB(拓展坞)乐得瑞LDR6023A快充方案介绍
  12. AD15批量修改引脚名字的方法
  13. chromium笔记
  14. 仅需一步,完美解决 0xc000007b 报错
  15. enc易能变频_ENC易能变频器专修公司
  16. Machine Learning in Action(5) SVM算法
  17. linux内核态加速文件读取,学习在kernel态下使用NEON对算法进行加速的方法
  18. 为什么越来越多的大卖选择独立站?
  19. 云桌面场景的典型组网案例
  20. 家庭网络中的各种网络连接方式介绍及各自特点

热门文章

  1. 笔记本通过手机无线上网(USB绑定)
  2. MySQL之text字段
  3. 2021年广东省现代农业产业园申报资助及条件,补贴5000万
  4. 问卷工具选择要看哪些方面?
  5. Unity il2cpp.exe 已停止工作 CLR20r3
  6. 老文章,新人看!看看你以后的样子吧,是好是坏看你自己
  7. 获取QQ聊天窗口信息
  8. 还有多少人搞不懂这 40 道 Spark 灵魂面试题?
  9. Lumia 刷机(强刷)Message send failed解决办法
  10. 苹果手表,我们真的需要你吗?