C#:TextBox在表单上使用TextPreview时没有收到密钥

时间:2011-09-12 18:06:56

标签: c# winforms keypreview

我在c#中以windows形式实现搜索功能。我已在表单上将KeyPreview设置为true,并为KeyDown添加了事件处理程序,因此我可以捕获ctrl+fescenter等内容。< / p>

我正好抓住这些钥匙,我可以让我的文本框出现,但我无法输入框。所有密钥都将转到PortsTraceForm_KeyDown(...),但它们永远不会进入文本框。根据关于KeyPreview的msdn页面,将e.Handled设置为false会导致事件传递到焦点视图(文本框),但这不会发生。我没有为文本框注册KeyDown事件,因此它应该使用默认行为。我错过了什么吗?

KeyDown事件:

    private void PortsTraceForm_KeyDown(object sender, KeyEventArgs e)
    {
        e.SuppressKeyPress = true;
        e.Handled = false;

        if (e.KeyData == (Keys.F | Keys.Control)) // ctrl+f
        {
            e.Handled = true;
            ShowSearchBar();
        }
        else if (e.KeyCode == Keys.Escape) // esc
        {
            e.Handled = true;
            HideSearchBar();
        }
        else if (e.KeyCode == Keys.Enter) // enter
        {
            if (searchPanel.Visible)
            {
                e.Handled = true;
                if (searchShouldClear)
                    SearchStart();
                else
                    SearchNext();
            }
        }
    }

显示搜索栏:

    private void ShowSearchBar()
    {
            FindBox.Visible = true;
            FindBox.Focus(); // focus on text box   
    }

隐藏搜索栏:

    private void HideSearchBar()
    {
            this.Focus(); // focus on form
            FindBox.Visible = false;
    }

2 个答案:

答案 0 :(得分:1)

即使您正在呼叫Focus(),您的TextBox也可能没有焦点。来自the documentation:

  

Focus是一种低级方法,主要用于自定义控件作者。相反,应用程序员应该对子控件使用Select方法或ActiveControl属性,或者对表单使用Activate方法。

你可以检查Focus()的返回值是否成功,但过去我运气不好,使用该方法将焦点设置为任意控件。相反,请尝试使用文档建议的方法,即调用Select()

编辑:

没关系(尽管它仍然是有效的建议),我想我看到了你的问题:

e.SuppressKeyPress = true

你为什么要这样做?同样,来自the docs:

  

[SuppressKeyPress]获取或设置一个值,该值指示是否应将键事件传递给基础控件

因此,您故意阻止TextBox获取关键事件。如果您想要通过该活动,则不应将该属性设置为false

答案 1 :(得分:0)

尝试这个覆盖方法的例子。

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        // your code here

        // this is message example
        MessageBox.Show(keyData.ToString());
        return base.ProcessCmdKey(ref msg, keyData);
    }

问候。