在 Windows Forms UserControl 中的 C# 按键监听器

3

你好,

我想在一个包含在主表单中的表单用户控件中添加键盘监听器。

当用户在我的应用程序中按下键时,我希望它执行某些操作。

我该如何做?

例如,如果我按下w,则会弹出一个窗口,显示你按下了w。

我已经在我的User Control类中尝试过这个方法;

  private void UC_ControlsTank_KeyPress(object sender, KeyPressEventArgs e)
    {
        Console.Write("You pressed:" + e.KeyChar);
    }

但是当我按键时,似乎没有任何反应。
编辑:
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        MessageBox.Show(e.KeyChar.ToString());
    }
}

这是我的表单: 这是我在Visual Studio中的链接方式: 输入图像描述


你是指 Windows Forms 应用程序中的 UserControl,还是 ASP.NET UserControl? - Ivaylo Slavov
你的控件是否具有焦点? - David Pilkington
@IvayloSlavov Windows Forms - Zapnologica
3个回答

13

在捕获键盘按键事件之前,您需要将 Win 表单的 KeyPreview 属性设置为 true。如果未将其设置为 true,则无法捕获键盘按键事件。


1
在WinForm上单击并按F4键,这将显示属性窗口,然后将KeyPreview设置为true。默认情况下它是false。 - Kurubaran
此外,如果您想捕获在表单本身之外的其他控件(例如TextBox)上按下的键,则应设置此选项。 - Artfaith

5

有一个 KeyPressed 事件可以使用

Control.KeyPress事件

此事件包含 System.Windows.Forms.KeyEventArgs e,可告诉您按下了哪个键

编辑:

我在样本应用程序上尝试过,它运行良好

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        MessageBox.Show(e.KeyChar.ToString());
    }

这只能在控制台上工作吗?还是它也可以在我的Windows表单中工作? - Zapnologica
甚至无法在主窗体中使这两个解决方案之一工作: - Zapnologica
你是如何连接事件的?我更新了我的答案,它可以工作。你在使用Visual Studio吗? - David Pilkington
我刚刚创建了一个临时项目,它也能正常工作。现在我回去尝试在我正在工作的项目中(在主窗体而不是用户控件中)再次尝试,但它没有工作,这很奇怪?请查看我的编辑。 - Zapnologica
你在这方面有什么进展了吗? - David Pilkington
我所做的是在主窗体中设置了按键事件,然后通过调用其 Keypressed 事件,将事件转发给用户控件。 - Zapnologica

2

以下是一个示例,

  private void control_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyData)
        {
            case Keys.W:
                {
                   MessageBox.Show("you pressed w");
                    break;
                }
            case Keys.B:
                {
                   MessageBox.Show("you pressed b");
                    break;
                }
            case Keys.F11:
                {
                   MessageBox.Show("you pressed F11");
                    break;
                }
            case Keys.Escape:
                {
                    this.Close();
                    break;
                }
            default:
                {
                    break;
                }
        }
}

或者

参考这篇文章:使用ProcessKeyPreview覆盖用户控件中的KeyDown事件


我尝试了这个,但是还是没有任何显示。 - Zapnologica
不幸的是,用户控件没有 KeyPreview 属性。我认为你可以看一下我的编辑。这个链接会对你有所帮助! - zey
肯定有比使用ProcessKeyPreview更简单的方法。 - Zapnologica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接