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

C# WinForms KeyDown事件首次使用时丢失键盘输入,c#,winforms,keypress,keydown,C#,Winforms,Keypress,Keydown,我正在尝试制作一个WinForms程序,这样一个文本框通常是隐藏的(Visible=false),直到用户开始在键盘上键入,此时文本框应该是可见的,键盘输入应该进入文本框 以下是程序,简化为基本部分: using System.Windows.Forms; namespace TestTextEditPopup { public partial class Form1 : Form { public Form1() { Initialize

我正在尝试制作一个WinForms程序,这样一个文本框通常是隐藏的(Visible=false),直到用户开始在键盘上键入,此时文本框应该是可见的,键盘输入应该进入文本框

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

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();
      }
   }
}
下面是一系列屏幕截图:

首先我在键盘上打了个“a”。这确实会使文本框变得可见并获得焦点,但“a”显然在某个地方丢失了

然后我按下Esc键。这将正确地使文本框再次不可见

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

关于为什么第一次不起作用有什么建议吗?或者其他方法来完成我想做的事情

谢谢


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

使用表单上的
KeyPress
事件;然后您可以访问字符数据,这样您就可以将字符添加到
文本框
控件中,然后对其进行聚焦:

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;
    }                
}

当此属性设置为true时 表单将接收所有键控(etc)事件。之后 表单的事件处理程序已完成 正在处理击键, 然后将击键指定给 聚焦控制。

表单启动时,textbox控件被禁用,因此没有焦点

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

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