WPF 使用全局键盘(快捷键)
方式一:使用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 使用全局键盘(快捷键)相关推荐
- skype快捷键_每个Skype键盘快捷键及其用法
skype快捷键 Roberto Ricca/Shutterstock罗伯托·里卡/ Shutterstock Get familiar with Skype's unique keyboard sh ...
- python全局键盘监听(pynput快捷键);利用pywin32快速截屏并生成视频
python全局键盘监听(pynput快捷键):利用pywin32快速截屏并生成视频 第一次在CSDN写博客,有点小紧张(/ω\) 以下内容完全个人理解,有错误请指出~ 最近在用python做一个小工 ...
- C#全局键盘监听(Hook)的使用(转载)
一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...
- C#全局键盘监听(Hook)
一.为什么需要全局键盘监听? 在某些情况下应用程序需要实现快捷键执行特定功能,例如大家熟知的QQ截图功能Ctrl+Alt+A快捷键,只要QQ程序在运行(无论是拥有焦点还是处于后台运行状态),都可以按下 ...
- [No0000A6]Visual Studio 2015 中的常用命令的默认键盘快捷键-VS2015 Shortcut
注意:你也可以通过打开"选项"对话框,展开"环境"节点,然后选择"键盘",查找任何命令的快捷键. Build(生成) 命令 键盘快捷键 [上 ...
- 智能J IDEA键盘快捷键
智能J IDEA键盘快捷键 最后修改时间:08 十二月 2021 IntelliJ IDEA为其与编辑,导航,重构,调试和其他任务相关的大多数命令提供了键盘快捷键.记住这些热键可以帮助您通过将手放在键 ...
- win10键盘全变成快捷键_(安卓)全键盘快捷键
之前聊过一些ios越狱后可实现的一些键盘附加插件: (越狱)轻量化的自带键盘增强系列插件 有朋友就问安卓的有这类的插件吗?当然有了!而且无需root就能实现,那么这一期我们就来聊一聊吧: 首先是下载地 ...
- visual studio code 键盘快捷键参考
原文 引用 键盘快捷键参考 这些键盘快捷键的可打印版本链接: windows macOS Linux 基本编辑 注意:以下是使用标准美式键盘布局的.如果您使用不同的键盘布局,请阅读这里 . 键 命令 ...
- 如何在Mac上创建您自己的快捷键?如果键盘快捷键不能正常工作该怎么办?
Mac上也有很多快捷键,使用快捷键操作会便捷很多,当然你也可以自己来创建快捷键,那么如何在Mac上创建您自己的快捷键?下面带来实用的教程,顺便帮大家解决一下关于键盘快捷键不能正常工作的问题,赶紧来这里 ...
最新文章
- Linux chmod命令修改文件与文件夹权限命令代码
- 深度学习用于基于内容的图像检索 Deep Learning for Content-Based Image Retrieval
- java sql string_JAVA String转化成java.sql.date和java.sql.time方法示例
- Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护
- python post body_python写http post请求的四种请求体
- ZeroMQ接口函数之 :zmq_ipc – ZMQ本地进程间通信传输协议
- 2013校队选拔——最短路——二分最大边的最小值
- 推荐10本大数据领域必读的经典好书(火速收藏)
- lbj学习日记 08 输入一组不定个数的数字,并且把它保存在一个数组中
- 服务器被ddos攻击?分析如何防止DDOS攻击?
- TYPE-C HUB(拓展坞)乐得瑞LDR6023A快充方案介绍
- AD15批量修改引脚名字的方法
- chromium笔记
- 仅需一步,完美解决 0xc000007b 报错
- enc易能变频_ENC易能变频器专修公司
- Machine Learning in Action(5) SVM算法
- linux内核态加速文件读取,学习在kernel态下使用NEON对算法进行加速的方法
- 为什么越来越多的大卖选择独立站?
- 云桌面场景的典型组网案例
- 家庭网络中的各种网络连接方式介绍及各自特点