winforms应用程序中的键盘处理

winforms应用程序中的键盘处理,winforms,events,keyboard,focus,Winforms,Events,Keyboard,Focus,我正在构建一个WinForms应用程序,大致如下所示: 有一个单一的表单,包括菜单、工具栏、状态栏、导航树、自定义绘图画布(它是一个用户控件,接受键盘输入并绘制文本,还呈现插入符号)和一个查找面板,允许用户搜索文本 我很难让这些行为发挥作用: 1) “查找”面板上的加速器(例如,“c”表示匹配大小写,“w”表示整个单词)阻止将这些字符输入画布,即使画布具有焦点 2) 当焦点位于画布以外的任何位置时,按ESC键应将焦点返回到画布。特别是,当Find文本框有焦点时,这应该可以工作。这可以通过在单个

我正在构建一个WinForms应用程序,大致如下所示:

有一个单一的表单,包括菜单、工具栏、状态栏、导航树、自定义绘图画布(它是一个用户控件,接受键盘输入并绘制文本,还呈现插入符号)和一个查找面板,允许用户搜索文本

我很难让这些行为发挥作用:

1) “查找”面板上的加速器(例如,“c”表示匹配大小写,“w”表示整个单词)阻止将这些字符输入画布,即使画布具有焦点


2) 当焦点位于画布以外的任何位置时,按ESC键应将焦点返回到画布。特别是,当Find文本框有焦点时,这应该可以工作。这可以通过在单个点而不是每个可能的焦点控件上挂接键盘来实现吗?

如果有多个控件竞争键盘输入,请将窗体设置为
True
,以便在窗体的按键事件处理程序中处理按键事件。然后可以相应地引导键盘输入

从以上MSDN链接:

获取或设置一个值,该值指示窗体在将事件传递给具有焦点的控件之前是否接收键事件


看看这样的功能是否适合您,它仍然允许您同时执行Alt+加速键,但如果有焦点且按下Alt,则会将焦点设置回usercontrol:

private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (ActiveControl.Name == userControl11.Name )
        {
            if (e.Alt)
            {
                e.Handled = true;
                userControl11.Focus();
            }
        }
    }

谢谢-这可能适用于问题2。对第一个问题有什么想法吗?@bright我对这两个问题都使用了相同的程序。只需查找相应的修饰符键。我明白了-不幸的是,这意味着显式地检查每个修饰符。如果没有通用的方法,我会这样做,但我仍然坚持这样做。@bright我终于有机会坐在我的电脑前。在测试情况下,使用文本框而不是自定义用户控件按将阻止任何分配的加速键的初始按下被发送到文本框,任何后续的都是,直到再次按下。对于用户控件,分配的加速键总是使查找面板获得焦点,按键永远不会被发送到用户控件。作为另一个示例,假设表单上的KeyPreview设置为true。现在,如果在重命名树中的项目时按下“c”,表单将收到按键。表单中的代码应如何进行?在这种情况下,树具有焦点,应该接收按键。但这一逻辑如何被推广?