检查是否在Winforms中按下了热键 [英] Check if hot key pressed in Winforms

查看:50
本文介绍了检查是否在Winforms中按下了热键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

要捕获热键 Ctrl + A ,我们可以在 Form1_KeyDown 中使用以下语句.

To catch the hot key Ctrl+A, we can use following statement in Form1_KeyDown.

if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
{
    MessageBox.Show("Test");
}

要捕获 Ctrl + Alt + A ,我们可以使用:

To catch Ctrl+Alt+A, we can use:

if (e.Control && e.Alt)
{
    if (e.KeyCode == Keys.A)
    {
        // Your code goes here
    }
}

问题是如何捕获像 Ctrl + A + B 这样的热键?

The question is how to catch the hot key like Ctrl+A+B?

推荐答案

以下内容可以帮助您开始使用

Here's something to get you started using IMessageFilter.

这将在按下Ctrl-A-B而不是释放时触发.当前,在按住这些键的同时,它也会反复触发.可以使用混合中的另一个布尔变量来更改它.这绝对不是完美的...

This will trigger when Ctrl-A-B is pressed DOWN, not on release. It also currently will repeatedly trigger while those keys are held down. This could be changed with another boolean variable in the mix. This is definitely not perfect...

public partial class Form1 : Form
{   

    public Form1()
    {
        InitializeComponent();
    }

    private MyFilter mf = new MyFilter();

    private void Form1_Load(object sender, EventArgs e)
    {
        mf.Ctrl_A_B += Mf_Ctrl_A_B;
        Application.AddMessageFilter(mf);
    }

    private void Mf_Ctrl_A_B()
    {
        Console.WriteLine("Ctrl-A-B was held down!");
    }

}

public class MyFilter : IMessageFilter
{

    private bool keyCtrl;
    private bool keyA;
    private bool keyB;

    private const int WM_KEYDOWN = 0x100;
    private const int WM_KEYUP = 0x101;

    public delegate void dlg_Ctrl_A_B();
    public event dlg_Ctrl_A_B Ctrl_A_B;

    public bool PreFilterMessage(ref Message m)
    {
        Keys keyData;
        switch (m.Msg)
        {
            case WM_KEYDOWN:
                keyData = (Keys)((int)m.WParam);
                switch (keyData)
                {
                    case Keys.ControlKey:
                        keyCtrl = true;
                        break;

                    case Keys.A:
                        keyA = true;
                        break;

                    case Keys.B:
                        keyB = true;
                        break;
                }
                if (keyCtrl && keyA && keyB)
                {
                    Ctrl_A_B?.Invoke();
                }
                break;

            case WM_KEYUP:
                keyData = (Keys)((int)m.WParam);
                switch (keyData)
                {
                    case Keys.ControlKey:
                        keyCtrl = false;
                        break;

                    case Keys.A:
                        keyA = false;
                        break;

                    case Keys.B:
                        keyB = false;
                        break;
                }
                break;
        }

        return false;
    }

}

这篇关于检查是否在Winforms中按下了热键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆