注册系统热键类(原创)

 

 

C#注册系统热键类,参考多篇文章封装而成,只需一个构造函数即可完成,尤其适合于WPF

参考文章:http://www.cnblogs.com/dabaopku/archive/2010/02/21/1670793.html

源码下载

复制代码
系统热键类
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;

namespace ThunderStarter
{
/// <summary>
/// 直接构造类实例即可注册
/// 自动完成注销
/// 注意注册时会抛出异常
/// </summary>
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
}

#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*10;
if (HotKey.KeyPair.ContainsKey(KeyId))
{
throw new Exception("热键已经被注册!");
}

//注册热键
if(false == HotKey.RegisterHotKey(Handle, KeyId, Controlkey, Key))
{
throw new Exception("热键注册失败!");
}
if(HotKey.KeyPair.Count==0){
//消息挂钩只能连接一次!!
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
}
}
复制代码

 

posted on   大宝pku  阅读(1710)  评论(3编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

< 2010年2月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 1 2 3 4 5 6
7 8 9 10 11 12 13
点击右上角即可分享
微信分享提示