繁体   English   中英

在表单加载时调用 KeyDown 事件

[英]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_intsomegeneratednumber的 SUM,它是 30。但是,在调试之后,我得到了它的初始化值 0。据我somegeneratednumber ,在SendKeys.Send("{Enter}")KeyDown事件应该继续。

为什么不是??
我将如何得到正确的结果? 我真的应该在Form_Load上执行KeyDown事件,这是一个条件事件......
或者我在这里做错了什么?
注意:原来 static_int 是在一个类上初始化的

不, 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}");
}

但这个设计确实是错误的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM