在 C# 中覆盖 bool ProcessKeyPreview

本文关键字:bool ProcessKeyPreview 覆盖 | 更新日期: 2023-09-27 18:34:23

我使用以下代码来处理用户控件中的键控。但是我想知道如何对用户进行按键控制

const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
protected override bool ProcessKeyPreview(ref Message m)
{
    if (m.Msg == WM_KEYDOWN && (Keys)m.WParam == Keys.A)
    {
        messagebox.show("You have pressed A");
    }
    return base.ProcessKeyPreview(ref m);
}

我想在按键中为键字符执行此操作。

这些代码只是给了我例如键。A 不能让我工作,例如键字符 ='A'

提前致谢

在 C# 中覆盖 bool ProcessKeyPreview

KeyPress 事件与 KeyDown 和 KeyUp 事件非常不同。 您只能使用ProcessKeyPreview和ProcessCmdKey等替代来覆盖KeyDown事件处理。

这样的覆盖只看到虚拟键,在任何人的键盘上都是一样的。 然后,KeyDown 的默认处理通过 Windows 中的代码发送虚拟键,该代码应用用户选择的特定键盘布局。 如果这会在韩语键盘上生成键入键,例如"a"或"A"或"我不知道什么">,则会产生KeyPress事件。 它直接传递到具有焦点的控件,您只能通过为其 KeyPress 事件实现事件处理程序在控件处截获它。

上一段中的"我不知道是什么"条款是重要的部分。 尝试拦截键入键通常没有意义。 除了"a"和"A"之间的区别之外,您的软件有 20 亿潜在用户一生中从未输入过"A"。 目前还不清楚您为什么要这样做,因此我不能建议另一种方法。