获取用户键入的字符,当ContextMenuStrip有焦点时

本文关键字:ContextMenuStrip 焦点 字符 用户 获取 | 更新日期: 2023-09-27 17:53:14

当打开ContextMenuStrip时,如果用户键入可能选择的第一个字母-就好像他点击了它。我想截取它并获取他点击的字符

下面的代码做到了这一点,但是对可能的字符进行了硬编码。我想要一种通用的方法来做到这一点,要么通过禁用按键自动选择(只留下鼠标单击),要么以某种方式拦截字符。

下面的简化代码假设我想有一个winform的Text作为字符类型,并且ContextMenuStrip有一个选项是"a"。

public Form1()
{
    InitializeComponent();
    contextMenuStrip1.KeyDown += contextMenuStrip1_KeyDown;
}
private void button1_Click(object sender, EventArgs e)
{
    contextMenuStrip1.Show();
}
void contextMenuStrip1_KeyDown(object sender, KeyEventArgs e)
{
    e.SuppressKeyPress = true;
    if (e.KeyCode == Keys.A)
    {
        if (e.Shift) Text = "A";
        else Text = "a";
    }
}

使用KeyPress事件和检查e.KeyChar不工作,因为它没有被解雇。("A"点击事件会被触发)

使用e.KeyCode, e.KeyDatae.KeyValue中的任何一个都不能工作(没有进一步的硬编码),因为它们接受Shift作为密钥。

获取用户键入的字符,当ContextMenuStrip有焦点时

正如评论中所指出的,您必须从ContextMenuStrip派生自己的类,以便您可以覆盖ProcessMnemonic()方法。

注释一下,键盘处理在Winforms中非常复杂。在将快捷键击发送到具有焦点的控件之前,它们很早就被处理。因此,您不希望为每个控件实现KeyDown事件,以便您可以使快捷键击工作。

这是从外到内的工作,并涉及几个受保护的方法,ProcessCmdKey, ProcessDialogChar和ProcessMnemonic。以及OnKeyDown,如果窗体的KeyPreview属性设置,VB6的比较功能。因此,表单首先尝试它,然后从那里迭代控件,从容器到子控件。

ToolStrip类(ContextMenuStrip的基类)覆盖ProcessMnemonic()方法来识别按键,并将它们映射到菜单项。因此,为了拦截这个默认处理,您必须自己重写ProcessMnemonic()以首先获得键按的镜头。

相关文章:
  • 没有找到相关文章