.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. react-native 的微信SDK辅助包,支持微信登录、微信分享、微信支付

    微信SDK集成示例,现已完成微信授权登录,之后将陆续包装分享等其他功能. ReactNative高级交流群 127482131 或访问  http://blog.1ygowu.com ReactNat ...

  2. Android Studio 2.2 来啦

    今年的 I/O 2016 Google 放出了 Android Studio 2.2 的预览版,改进了多项功能,只不过为了保证公司项目不受影响,我一般都不安装预览版的,因为预览版意味着不稳定,可能遇到 ...

  3. [CareerCup] 8.4 Parking Lot 停车场问题

    8.4 Design a parking lot using object-oriented principles. LintCode上的原题,请参见我的另一篇博客Parking Lot 停车场问题. ...

  4. [MetaHook] R_SparkShower

    By hzqst void R_SparkShower(float *pos) { TEMPENTITY *tent; tent = efx.CL_TempEntAllocNoModel(pos); ...

  5. Scala学习笔记(七):Application特质

    Scala提供了特质scala.Application 在单例对象名后面写上“extends Application”,把想要执行的代码直接放在单例对象的花括号之间 import ChecksumAc ...

  6. 怎样开发单页面app

    groot.view("myview", function (vm, ve) { ve.loada = function () { require("./app/page ...

  7. 正确对待bug

    正确对待bug 2016-10-09 公众号:一只程序媛 以前我一直以为bug是代码的天敌,我以为好的程序媛写出来的代码是应该没有bug的,零bug是终极奋斗目标. 后来,看到一句话"上帝创 ...

  8. jQuery使用之(三)处理页面的元素

    对于页面的元素,在DOM编程中可以通过各种查询.修改手段进行管理,非常麻烦.jQuery提供了一整套的方法来处理页面的元素.包括元素的内容.复制.移动和替换等.本节将介绍一些常用的内容. 1.直接获取 ...

  9. Hibernate-入门教程

    首先了解hibernate的目录结构 . +lib antlr.jar cglib-full.jar asm.jar asm-attrs.jars commons-collections.jar co ...

  10. log4j2 使用说明

    因近期需要编写J2EE程序,所以简单学习了Log4j2,这里把我学习的一些信息做记录: 1.从HelloWorld开始 参考:http://logging.apache.org/log4j/2.x/m ...