winforms 表单中的键盘管理

8ehkhllq  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(92)

我正试图把键盘管理的形式,我的计划,以建立快捷方式。所以我宣布

public Form1()
        {
            InitializeComponent();
            this.KeyDown += Form1_KeyDown;
}

那么在我的程序中,

private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Down)
            {
              // My code
            }
        }

但它不工作,我一直按向下键,什么都没有!我停在:

if (e.KeyCode == Keys.Down)

从来都不会。唯一起作用的是空格键,就好像我在点击最后一个使用的按钮。谢谢你的建议

ivqmmu1c

ivqmmu1c1#

制作一些热键快捷方式的一种方法是实现IMessageFilter,它为整个表单安装PreFilterMessage钩子,而不管哪个控件有焦点。

在构造函数中,添加消息过滤器,并将其设置为在窗体释放时移除。

public partial class Form1 : Form, IMessageFilter
{
    public Form1()
    {
        InitializeComponent();

        StartPosition = FormStartPosition.CenterScreen;

        // Hook the message filter here.
        Application.AddMessageFilter(this);

        // Unhook the message filter when this form disposes.
        Disposed += (sender, e) => Application.RemoveMessageFilter(this);

        button1.Click += (sender, e) => MessageBox.Show("Clicked or CTRL-M");
    }
    ...
}

在该方法中,筛选Win32键按下消息。

private const int WM_KEYDOWN = 0x0100;
    public bool PreFilterMessage(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_KEYDOWN:
                var e = new KeyEventArgs(((Keys)m.WParam) | Control.ModifierKeys);
                OnHotKeyPreview(FromHandle(m.HWnd), e);
                return e.Handled;
            default:
                break;
        }
        return false;
    }

然后为您感兴趣的快捷键实现自定义热键检测器。

private void OnHotKeyPreview(Control? sender, KeyEventArgs e)
    {
        switch (e.KeyData)
        {
            case Keys.Control | Keys.M:
                button1.PerformClick();
                e.Handled = true;
                break;
            case Keys.Control | Keys.R:
                richTextBox1.SelectionColor = Color.Red;
                richTextBox1.AppendText($"{nameof(Color.Red)} {Environment.NewLine}");
                e.Handled = true;
                break;
            case Keys.Control | Keys.G:
                richTextBox1.SelectionColor = Color.Green;
                richTextBox1.AppendText($"{nameof(Color.Green)} {Environment.NewLine}");
                e.Handled = true;
                break;
            case Keys.Control | Keys.B:
                richTextBox1.SelectionColor = Color.Blue;
                richTextBox1.AppendText($"{nameof(Color.Blue)} {Environment.NewLine}");
                e.Handled = true;
                break;
            case Keys.Left:
            case Keys.Up:
            case Keys.Right:
            case Keys.Down:
                richTextBox1.AppendText($"{e.KeyData} {Environment.NewLine}");
                break;
            default:
                break;
        }
    }

相关问题