zoukankan      html  css  js  c++  java
  • 注册系统热键类(原创)

    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
    }
    }
  • 相关阅读:
    1691: [Usaco2007 Dec]挑剔的美食家
    poj2892 Tunnel Warfare
    P3369 【模板】普通平衡树 Treap
    Splay的用法
    P3165 [CQOI2014]排序机械臂
    P2286 [HNOI2004]宠物收养场
    P3391 【模板】文艺平衡树(Splay)新板子
    3224: Tyvj 1728 普通平衡树(新板子)
    P2515 [HAOI2010]软件安装
    CF 219 D:Choosing Capital for Treeland(树形dp)
  • 原文地址:https://www.cnblogs.com/dabaopku/p/1671267.html
Copyright © 2011-2022 走看看