检查Winforms中是否按了热键

检查Winforms中是否按了热键,winforms,hotkeys,Winforms,Hotkeys,要捕获热键Ctrl+A,我们可以在Form1\u KeyDown中使用以下语句 if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A) { MessageBox.Show("Test"); } 要捕获Ctrl+Alt+A,我们可以使用: if (e.Control && e.Alt) { if (e.KeyCode == Keys.A) { //

要捕获热键
Ctrl+A
,我们可以在
Form1\u KeyDown
中使用以下语句

if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
{
    MessageBox.Show("Test");
}
要捕获
Ctrl+Alt+A
,我们可以使用:

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

问题是如何捕获热键,如代码> CTRL+A+B?< /P> < P>,可以将第一个键视为附加或自定义修饰符来扩展快捷方式的范围。

声明一个类变量以保存该修饰符:

私钥KeyModifier=密钥。无;
按如下方式处理
KeyDown
事件:

private void formwhere\u KeyDown(对象发送方,KeyEventArgs e)
{
如果(如控制)
{
开关(如钥匙代码)
{
案例关键。B:
if(KeyModifier==Keys.A)
{
//句柄Ctrl+AB
}
其他的
{
//句柄Ctrl+B
}
打破
案例关键。C:
if(KeyModifier==Keys.A)
{
//手柄Ctrl+AC
}
其他的
{
//句柄Ctrl+C
}
打破
违约:
//否则,将按下的键设置为键修改器。
KeyModifier=e.KeyCode;
打破
}
}
}
松开
控制
键时重置修改器。这对于正确执行上述操作非常重要

private void formwhere\u KeyUp(对象发送方,KeyEventArgs e)
{
如果(!e.Control)KeyModifier=Keys.None;
}

这里有一些东西可以让您开始使用

当按下Ctrl-A-B时,而不是释放时,将触发此操作。当按下这些键时,它当前也会反复触发。这可以通过混合中的另一个布尔变量进行更改。这绝对不是完美的

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;
    }

}

你的意思是
Ctrl+A,Ctrl+B
Ctrl+A
后接
B
,而
Ctrl
键仍被按下,或者,
Ctrl
键尚未松开)。@Jimi仍被按下在WinForms中执行此操作没有简单的方法。你必须保留一本布尔字典,并记录按下的键。或者,您可以导入WPF运行时并将
Keyboard.IsKeyDown
KeyDown
事件结合使用。您也可以求助于Win32 API并使用类似于
GetKeyState
的东西,该“热键”是否只在您的应用程序中起作用?关于
Ctrl+J+E
或任何其他组合呢?我们应该为每个变量声明一个变量吗?要么就是这样,要么创建某种
字典
,以便您可以查找和切换特定的值。不管怎样都会变得一团糟……嗯,如果你允许的话,我不这么认为。只要一个变量就足够了。类似于另一个答案。适用于任意
Ctrl+any+any
。不管投票结果如何,试试看。感谢您抽出时间。@dr.null使用
字典
的方法将是最灵活的。如果明天他们要求Ctrl-A-B-C,甚至你的方法也需要修改。