WinForms KeyDown事件在首次使用时丢失键盘输入

时间:2011-02-01 15:57:05

标签: c# winforms keypress keydown

我正在尝试创建一个WinForms程序,使得TextBox通常是隐藏的(Visible = false),直到用户开始在键盘上键入,此时TextBox应该变为可见,键盘输入应该进入TextBox

这是程序,简化为基本部分:

using System.Windows.Forms;

namespace TestTextEditPopup
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();

         this.KeyPreview = true;
         textBox1.Visible = false;
      }

      protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
      {
         if (keyData != Keys.Escape)
            return base.ProcessCmdKey(ref msg, keyData);

         textBox1.Visible = false;
         return true;  // Key has been processed
      }

      private void Form1_KeyDown(object sender, KeyEventArgs e)
      {
         textBox1.Visible = true;
         textBox1.Focus();
      }
   }
}

这是一系列的截图:

And here's a series of screen shots

首先我点击键盘上的“a”。这确实会导致TextBox变得可见并获得焦点,但“a”显然在某处丢失了。

然后我击中了Esc。这正确地使TextBox再次不可见。

然后我点击“b”。这一次(以及所有,或至少几乎所有后续时间)它都可以工作 - TextBox变得可见,获得焦点,键盘输入不会丢失 - 它会显示在TextBox中。

有关为什么它第一次不起作用的任何建议?还是完成我想要做的事情的替代方法?

感谢。

编辑:只需将KeyPress添加为附加标记。

2 个答案:

答案 0 :(得分:2)

使用表单上的KeyPress事件;然后您可以访问角色数据,因此您可以将角色添加到TextBox控件,然后将其聚焦:

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (this.ActiveControl != textBox1)
    {
        textBox1.Visible = true;
        textBox1.Focus();
        textBox1.Text += e.KeyChar;
        textBox1.Select(textBox1.Text.Length, 0);
        e.Handled = true;
    }                
}

答案 1 :(得分:0)

来自docs for KeyPreview

  

当此属性设置为true时,   表单将接收所有KeyDown(etc)事件。之后   form的事件处理程序已经完成   处理击键,   然后将击键分配给   控制焦点。

表单启动时,文本框控件被禁用,因此没有焦点。

当按下第一个键时,文本框控件没有焦点,按键失败,因为表单无法处理它:在后续按键上,控件接收输入,因为它仍然有焦点 - 我猜它是表单上唯一的控件,因为如果有另一个控件,当文本框被禁用时焦点将转移到它,后续的按键将像初始按钮一样消失。

另一种方法是从表单边界外的文本框开始,然后将其移入和移出,而不是使其可见/不可见。