[英]Calling a KeyDown Event on Form Load
我想在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
}
}
键下:
private void txtInput_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode == Keys.Enter)
{
static_int = 10;
//somemore codes here too
}
我static_int
和somegeneratednumber
的 SUM,它是 30。但是,在调试之后,我得到了它的初始化值 0。据我somegeneratednumber
,在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}");
}
但这个设计确实是错误的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.