簡體   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