在窗体加载时调用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_intsomegeneratednumber的和,它是30。但是,在调试之后,我得到了它的初始化值0。据我所知,在SendKeys.Send("{Enter}")之后,KeyDown事件应该继续。

为什么不是
我怎样才能得到正确的结果?我真的应该在Form_Load上做KeyDown事件,一个条件事件
或者我在这里做错了什么
注意:最初static_int是在类

在窗体加载时调用KeyDown事件

上初始化的

否,KeyDown甚至会在尽可能早的时刻进行,也就是从表单的消息队列中执行适当的消息时。在Load事件结束之前,这是不可能发生的,因为消息队列上的。即使不是这样,SendKeys也不会等待处理操作。它只是发送消息并立即返回。

另一个问题是SendKeys向当前活动窗口发送虚拟密钥。那永远不可能是你的窗口,因为你的窗口还没有显示!当某些事情表现得很奇怪时,一个好的第一步是阅读文档。

那么,为什么static_int的值为零,而不是2030?好吧,最有可能的情况是一个未处理的异常,我很确定当你执行tbxInput.Focus时会发生这种情况。控件还不完全存在,也无法将其作为输入焦点。如果你很难理解这一切,你可能想找一些关于Windows窗口工作原理的书——什么都没有。NET可以做到这一点,而正是在这样的地方(非常漂亮)。NET抽象泄漏很多。如果你打算进行任何Windows UI开发,你真的需要至少了解基本知识。

然而,无论如何,这是完全没有必要的。您不必执行KeyDown事件。只需生成一个从Load事件处理程序和KeyDown事件处理程序调用的方法。

尝试添加此事件Form1尚未加载,因此尚未加载任何事件。

private void Form1_Shown(Object sender, EventArgs e) 
{
   SendKeys.Send("{Enter}");
}

但这种设计确实是错误的