我想在KeyDown
上发起一个Form_Load
活动,但它会把我带到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.据我所知,在{{1 } SendKeys.Send("{Enter}")
事件应继续进行。
为什么不呢?
我怎样才能得到正确的结果?我真的应该在KeyDown
上进行KeyDown
事件,这是一个有条件的事件......
或者我在这里做错了什么?
注意:最初的static_int是在Class
答案 0 :(得分:1)
不,KeyDown
甚至会尽早进行,即从表单的消息队列中执行相应的消息。在Load
事件结束之前不会发生这种情况,因为消息队列上的也是。即使情况并非如此,SendKeys
也不会等待处理操作。它只是发送消息并立即返回。
另一个问题是SendKeys
将虚拟密钥发送到当前活动的窗口。这永远不会成为你的窗口,因为你的窗户还没有显示出来!当某些事情表现得很奇怪时,第一步就是阅读文档。
那么,为什么static_int
的值为零,而不是20
或30
?嗯,最有可能的情况是一个未处理的例外情况,而且我非常确定当你执行tbxInput.Focus
时会发生什么。控件还不存在,并且它不能成为输入焦点。如果你无法理解这一切,你可能想找一些关于Windows窗口如何工作的基础知识的书 - 没有.NET可以做些什么,而且这样的地方就是这样的(非常很漂亮).NET抽象泄漏了很多。如果您计划进行任何Windows UI开发,您至少需要了解基础知识。
但是,无论如何,这完全是不必要的。您不必执行KeyDown
事件。只需创建一个从Load
事件处理程序和KeyDown
事件处理程序调用的方法。
答案 1 :(得分:0)
尝试添加此活动 Form1尚未加载,因此尚未发生任何事件。
private void Form1_Shown(Object sender, EventArgs e)
{
SendKeys.Send("{Enter}");
}
但真的这个设计是错误的