• [C#] 使用Application.AddMessageFilter当做Form的热键


    Application.AddMessageFilter可以帮你监视所有系统发送到Form的讯息 
    我们利用它来过滤讯息 
    便可以做出我们需要的热键

    这是Application.AddMessageFilter的呼叫方式 
    必须传递一个IMessageFilter的对象当做参数

    public static void AddMessageFilter(

        IMessageFilter value

    )

    我们这边做一个继承IMessageFilter界面的HotKey类别

    class HotKey : IMessageFilter
    {
        ...
    }

    然后在HotKey类别里使用两个属性记录热键的组合方式 
    并在HotKey建立时给予初始值

    Keys _hotKey = Keys.None;
    Keys _comboKey = Keys.None;
     
    public HotKey(Keys hotKey, Keys comboKey)
    {
        _hotKey = hotKey; //热键
        _comboKey = comboKey; //组合键, 必须设定Keys.Control, Keys.Alt, Keys.Shift, Keys.None等值才有作用
        Application.AddMessageFilter(this); //使用HotKey类别来监视讯息
    }

    IMessageFilter接口还必须实作一个PreFilterMessage方法 
    用来监视/过滤我们要的讯息 
    当我们按下正确的热键时 
    它会触发自定义的事件OnHotKey

    public delegate void HotkeyEventHandler(object sender, EventArgs e);
    public event HotkeyEventHandler OnHotkey; //自定义事件
     
    const int WM_KEYDOWN = 0x100; //按下键盘的讯息
    const int WM_ALTKEYDOWN = 0x104; //按下Alt键的讯息
     
    public bool PreFilterMessage(ref Message m)
    {
        if (OnHotkey != null && (m.Msg == WM_KEYDOWN || m.Msg == WM_ALTKEYDOWN)) //当键盘按下时
        {
            if (((Keys)(int)m.WParam & Keys.KeyCode) == _hotKey && Control.ModifierKeys == _comboKey) //如果热键+组合键相符
            {
                OnHotkey(this, null); //触发自定义事件
                return true; //并拦截这个讯息, Form将不再接收到这个讯息
            }
        }
        return false;
    }

    到这边我们就完成了一个简单版的HotKey了 
    我们来测试看看 
    在Form1_Load里产生四组热键

    private void Form1_Load(object sender, EventArgs e)
    {
        HotKey hotkey = new HotKey(Keys.A, Keys.Alt); //注册Alt+A为热键
        hotkey.OnHotkey += new HotKey.HotkeyEventHandler(hotkey_OnHotkey);
     
        HotKey hotkey2 = new HotKey(Keys.B, Keys.Control); //注册Ctrl+B为热键
        hotkey2.OnHotkey += new HotKey.HotkeyEventHandler(hotkey2_OnHotkey);
     
        HotKey hotkey3 = new HotKey(Keys.C, Keys.Shift); //注册Shift+C为热键
        hotkey3.OnHotkey += new HotKey.HotkeyEventHandler(hotkey3_OnHotkey);
     
        HotKey hotkey4 = new HotKey(Keys.F2, Keys.None); //注册F2为热键, 如果不要组合键请传Keys.None当参数
        hotkey4.OnHotkey += new HotKey.HotkeyEventHandler(hotkey4_OnHotkey);
    }
     
     
    void hotkey_OnHotkey(object sender, EventArgs e)
    {
        MessageBox.Show("热键Alt+A被按下了");
    }
     
    void hotkey2_OnHotkey(object sender, EventArgs e)
    {
        MessageBox.Show("热键Ctrl+B被按下了");
    }
     
    private void hotkey3_OnHotkey(object sender, EventArgs e)
    {
        MessageBox.Show("热键Shift+C被按下了");
    }
     
    private void hotkey4_OnHotkey(object sender, EventArgs e)
    {
        MessageBox.Show("热键F2被按下了");
    }

     http://www.dotblogs.com.tw/sam319/archive/2010/01/06/12876.aspx

  • 相关阅读:
    jQuery之元素操作及事件绑定
    JS中常遇到的浏览器兼容问题和解决方法
    九九乘法表
    全选复习
    css基本知识
    js数组
    Spark常见错误问题汇总
    被问懵逼的Kafka面试题
    被问懵逼的数仓面试
    Flink模拟项目: 订单支付实时监控
  • 原文地址:https://www.cnblogs.com/jliuwork/p/3958550.html
Copyright © 2020-2023  润新知