C# WinForms KeyDown事件首次使用时丢失键盘输入
我正在尝试制作一个WinForms程序,这样一个文本框通常是隐藏的(Visible=false),直到用户开始在键盘上键入,此时文本框应该是可见的,键盘输入应该进入文本框 以下是程序,简化为基本部分: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
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控件没有焦点,按键会丢失,因为表单无法处理它:在后续按键时,控件接收输入,因为它仍然有焦点-我猜它是表单上唯一的控件,因为如果有另一个控件,当文本框被禁用时,焦点将转移到它,随后的按键将像最初的按键一样消失
另一种方法是从表单边界外的文本框开始,将其移入移出,而不是使其可见/不可见