在窗体加载时调用KeyDown事件
本文关键字:KeyDown 事件 调用 窗体 加载 | 更新日期: 2024-09-25 14:36:15
我想在Form_Load
上启动KeyDown
事件,但它会将我带到Form_Load
事件中的其他地方。
Form_Load:
int static_int = 0;
private void Form1_Load(object sender, EventArgs e)
{
if(condition == true)
{
txtInput.Text = "something";
txtInput.Focus();
SendKeys.Send("{Enter}");
int somegeneratednubmer = 20;
static_int = static_int + somegeneratednumber;
//somemore code here
}
}
KeyDown:
private void txtInput_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter)
{
static_int = 10;
//somemore codes here too
}
我想得到static_int
和somegeneratednumber
的和,它是30。但是,在调试之后,我得到了它的初始化值0。据我所知,在SendKeys.Send("{Enter}")
之后,KeyDown
事件应该继续。
为什么不是
我怎样才能得到正确的结果?我真的应该在Form_Load
上做KeyDown
事件,一个条件事件
或者我在这里做错了什么
注意:最初static_int是在类
否,KeyDown
甚至会在尽可能早的时刻进行,也就是从表单的消息队列中执行适当的消息时。在Load
事件结束之前,这是不可能发生的,因为消息队列上的也。即使不是这样,SendKeys
也不会等待处理操作。它只是发送消息并立即返回。
另一个问题是SendKeys
向当前活动窗口发送虚拟密钥。那永远不可能是你的窗口,因为你的窗口还没有显示!当某些事情表现得很奇怪时,一个好的第一步是阅读文档。
那么,为什么static_int
的值为零,而不是20
或30
?好吧,最有可能的情况是一个未处理的异常,我很确定当你执行tbxInput.Focus
时会发生这种情况。控件还不完全存在,也无法将其作为输入焦点。如果你很难理解这一切,你可能想找一些关于Windows窗口工作原理的书——什么都没有。NET可以做到这一点,而正是在这样的地方(非常漂亮)。NET抽象泄漏很多。如果你打算进行任何Windows UI开发,你真的需要至少了解基本知识。
然而,无论如何,这是完全没有必要的。您不必执行KeyDown
事件。只需生成一个从Load
事件处理程序和KeyDown
事件处理程序调用的方法。
尝试添加此事件Form1尚未加载,因此尚未加载任何事件。
private void Form1_Shown(Object sender, EventArgs e)
{
SendKeys.Send("{Enter}");
}
但这种设计确实是错误的