【问题标题】:Keyboard handling in a winforms appwinforms 应用程序中的键盘处理
【发布时间】:2012-07-03 02:48:13
【问题描述】:

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

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

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

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

2) 当焦点在任何地方但画布应将焦点返回到画布时按 ESC。特别是,当 Find 文本框具有焦点时,这应该有效。这可以通过将键盘钩在一个点而不是每个可能的焦点控件来完成吗?

【问题讨论】:

    标签: winforms events keyboard focus


    【解决方案1】:

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

    从上面的 MSDN 链接:

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


    看看这样的东西是否适合你,它仍然允许你同时执行 Alt + Accelerator Key 但如果它有焦点并且 会将焦点设置回用户控件Alt 被按下:

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

    【讨论】:

    • 谢谢 - 这可能适用于问题 #2。关于第一个问题的任何想法?
    • @bright 我对两者都使用了相同的程序。只需查找相应的修饰键即可。
    • 我明白了——不幸的是,这意味着要明确检查每个修饰符。如果没有通用方法,会这样做,但我仍然坚持。
    • @bright 我终于有机会坐在我的电脑前了。在测试情况下,使用 TextBox 而不是您的 Custom UserControl 按下 将阻止任何分配的加速器的初始按下被发送到 TextBox,任何后续的都被发送到 TextBox,直到再次按下
    • 使用 UserControl,分配的加速器总是会导致查找面板获得焦点,并且按键永远不会路由到 UserControl。作为另一个示例,假设 KeyPreview 在 Form 上设置为 true。现在,如果在重命名树中的项目时按下“c”,表单将收到按键。表单中的代码应该如何进行?在这种情况下,树有焦点并且应该接收按键。但是这个逻辑怎么推广呢?
    猜你喜欢
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多