.NET技术交流群 199281001 .欢迎加入。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Interop;
using System.Collections; /// <summary>
/// 直接构造类实例即可注册
/// 自动完成注销
/// 注意注册时会抛出异常
/// </summary>
public class HotKey
//注册系统热键类
//热键会随着程序结束自动解除,不会写入注册表
{
#region Member int KeyId; //热键编号
IntPtr Handle; //窗体句柄
Window window; //热键所在窗体
uint Controlkey; //热键控制键
uint Key; //热键主键 public delegate void OnHotkeyEventHandeler(); //热键事件委托
public event OnHotkeyEventHandeler OnHotKey = null; //热键事件 static Hashtable KeyPair = new Hashtable(); //热键哈希表 private const int WM_HOTKEY = 0x0312; // 热键消息编号 public enum KeyFlags //控制键编码
{
MOD_ALT = 0x1,
MOD_CONTROL = 0x2,
MOD_SHIFT = 0x4,
MOD_WIN = 0x8,
MOD_CONTROLALT = 0x2 + 0x1
} #endregion /// <summary>
/// 构造函数
/// </summary>
/// <param name="win">注册窗体</param>
/// <param name="control">控制键</param>
/// <param name="key">主键</param>
public HotKey(Window win, HotKey.KeyFlags control, Keys key)
//构造函数,注册热键
{ Handle = new WindowInteropHelper(win).Handle;
window = win;
Controlkey = (uint)control;
Key = (uint)key;
KeyId = (int)Controlkey + (int)Key * ;
if (HotKey.KeyPair.ContainsKey(KeyId))
{
throw new Exception("热键已经被注册!");
} //注册热键
if (false == HotKey.RegisterHotKey(Handle, KeyId, Controlkey, Key))
{
throw new Exception("热键注册失败!");
}
if (HotKey.KeyPair.Count == )
{
//消息挂钩只能连接一次!!
if (false == InstallHotKeyHook(this))
{
throw new Exception("消息挂钩连接失败!");
}
} //添加这个热键索引
HotKey.KeyPair.Add(KeyId, this); } #region core [System.Runtime.InteropServices.DllImport("user32")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint controlKey, uint virtualKey); [System.Runtime.InteropServices.DllImport("user32")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id); static private bool InstallHotKeyHook(HotKey hk)
//安装热键处理挂钩
{
if (hk.window == null || hk.Handle == IntPtr.Zero)
return false; //获得消息源
System.Windows.Interop.HwndSource source = System.Windows.Interop.HwndSource.FromHwnd(hk.Handle);
if (source == null) return false; //挂接事件
source.AddHook(HotKey.HotKeyHook);
return true;
} static private IntPtr HotKeyHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
//热键处理过程
{
if (msg == WM_HOTKEY)
{
HotKey hk = (HotKey)HotKey.KeyPair[(int)wParam];
if (hk.OnHotKey != null) hk.OnHotKey();
}
return IntPtr.Zero;
} ~HotKey()
//析构函数,解除热键
{
HotKey.UnregisterHotKey(Handle, KeyId);
} #endregion
}

注册和卸载钩子

调用:

 1     private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
2 {
3 HotKey hot = new HotKey(this,HotKey.KeyFlags.MOD_CONTROLALT,Keys.M);
4 hot.OnHotKey += hot_OnHotKey;
5 }
6
7 void hot_OnHotKey()
8 {
9 MessageBox.Show("我是按ctrl+alt+m 进来的!");
10 }

WPF 注册全局快捷键的更多相关文章

  1. WPF之全局快捷键

    目录 1.WPF快捷键实现方式 2.全局快捷键设置界面 3.Windows API调用 4.注册全局快捷键 5.快捷键触发 WPF快捷键实现方式 WPF快捷键实现主要有自定义快捷键命令和全局快捷键两种 ...

  2. WPF设置全局快捷键

    转自:http://www.cnblogs.com/atskyline/archive/2012/09/20/2694878.html 第一步 引入到Winows API 偷懒直接写在类里 1: [D ...

  3. 在WPF中使用全局快捷键

    今天写一个小程序中使用到了全局快捷键,找到了我之前写的文章在c#中使用全局快捷键翻了一下,发现它是WinForm版本的,而我现在大部分写WPF程序了,便将其翻译了为WPF版本的了. static cl ...

  4. 在Form Load中设置showInTaskBar =false 或 隐藏窗口 this.Hide()时会导致注册的全局快捷键无效

    在Form Load中设置showInTaskBar =false   或 隐藏窗口 this.Hide() 会导致注册的全局快捷键无效.  反正是其中一个,有点记不清了. 在Form Shown中s ...

  5. C#Winform 注册使用全局快捷键详解

    C#.NET Winform 注册使用全局快捷键详解 借助于全局快捷键,用户可以在任何地方操控程序,触发对应的功能.但 WinForms 框架并没有提供全局快捷键的功能.想要实现全局快捷键需要跟 Wi ...

  6. Delphi 中的全局快捷键+给指定窗体发送按键

    [背景] 公司做视频影像采集,平时采集图像的时候都需要打开采集窗口,然后需要开着采集窗口来进行图像采集.同事问我能不能做一个全局快捷键,哪怕我没有操作也可以采集图像.说干就干,一直想做全局快捷键了,网 ...

  7. JavaFx全局快捷键实现(Kotlin)

    原文地址: JavaFx全局快捷键实现(Kotlin) | Stars-One的杂货小窝 最近整款工具需要用到全局快捷键,搜集了下网上的资料,发现有个JIntellitype库可以用来实现全局快捷键, ...

  8. 在 WinForms 项目中使用全局快捷键

    借助于全局快捷键,用户可以在任何地方操控程序,触发对应的功能.但 WinForms 框架并没有提供全局快捷键的功能.想要实现全局快捷键需要跟 Windows API 打交道.本文就交你如何使用 Win ...

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

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

随机推荐

  1. pandas 时间序列resample

    resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数据条目进行统计 函数原型:DataFrame.resample(rule, how=None ...

  2. tkinter 改变按钮状态

    import tkinter as tk def btn1_change_btn1(event): '''方式一:通过事件控制自己''' if event.widget['state'] == 'no ...

  3. 如何利用花生壳和VisualSVN Server建立远程代码仓库

    如何利用花生壳和VisualSVN建立远程代码仓库 最近由于项目需要,要远程访问实验室的svn服务器,但是实验室没有固定域名和ip,因此就打算用花生壳申请一个免费的域名构建一个服务器,再把Visual ...

  4. Openwrt flash 空间不足的临时解决方法

    最近有网友在安装软件的时候发现flash空间不够用了: 一个临时的解决方案是在RAM里面使用这个程序.因为 1.路由器改机后的RAM有64MB,flash一般有16MB,RAM空间比较大./tmp是挂 ...

  5. 你会swap吗,按值传递还是按引用?

    问题 1.Java到底是按值传递(Call by Value),还是按引用传递(Call by Reference)? 2.如下面的代码,为什么不能进行交换? public CallBy swap2( ...

  6. 【niubi-job——一个分布式的任务调度框架】----如何开发一个niubi-job的定时任务

    引言 上篇文章LZ主要讲解了niubi-job如何安装,如果看过上一篇文章的话,大家应该知道,niubi-job执行的任务是需要用户自己上传jar包的. 那么问题来了,这个jar包如何产生?有没有要求 ...

  7. mac 80端口映射 配置

    mac 80端口映射 配置 macbook 下,要绑定 80 端口的话. 一种方式是用 root 权限启动,即 sudo 启动服务进程.但 sudo 指令存在一定的安全问题,能不使用的情况下我们都尽量 ...

  8. [codevs 1995]黑魔法师之门(并查集)

    题目:http://codevs.cn/problem/1995/ 分析:脑补一下满足题目要求的子图肯定就是环……于是题目就变成了不断加边求环的个数.看起来有点麻烦……但是环的实质是几个小环组合起来的 ...

  9. redis学习笔记——(1)

    1. NoSQL&Redis介绍 NoSQL,Not Only SQL,是非关系型的数据库.传统的关系数据库不能满足超大规模和高并发的应用. 是以Key-Value的形式存储,(例如JSON, ...

  10. C#基础知识系列三(类和结构体、String和StringBuilder、equals和==)

    前言 这一节主要来了解一下类和结构体之间的异同点.以及针对String和StringBuilder的用法.equals和==,其实可以看出很多地方都用到了上一节的值类型和引用类型.堆栈和装箱拆箱操作吧 ...