2011-08-20 106 views
1

我正在運行VS 2008並在Windows 7框中構建我的應用程序。主窗體/窗口都有一個KeyDown事件處理程序,它遵循:VB.Net中KeyDown事件觸發當沒有按鍵時

Private Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown 
    MsgBox("control = " + e.Control.ToString + ", shift = " + e.Shift.ToString + ", e.Keycode = " + e.KeyCode.ToString) 

當我建立它並在VS運行它,它似乎運行正常。消息框顯示控制和換檔鍵的狀態以及按下的鍵的鍵碼。但是,如果我在主窗體打開後立即執行可執行文件並在XP上運行它(都使用.Net Runtime 3.5),則會出現消息框。基本上,「KeyDown」事件似乎是在沒有任何按鍵被按下的情況下觸發的。該消息框返回:"control = False, shift = False, e.Keycode = None"

這怎麼可能? keyDown事件如何被觸發,當沒有按鍵被按下(由消息框中包含的輸出確認?)

任何關於可能發生什麼或我如何診斷XP盒上的這種情況的建議,因爲它確實沒有Visual Studio嗎?

更新我試着創建一個全新的項目,其中只有「form1」,並且這個唯一的代碼是keyDown事件處理程序。它只是打開一個空白窗口,並按下按鍵彈出消息框。它在Win 7盒子上按預期工作,但當我將可執行文件移動到XP盒子時,它立即彈出打開消息框而不按任何鍵。很奇怪。

+0

更新...我嘗試創建一個全新的項目,其中只有「form1」,並且這背後的唯一代碼是keyDown事件處理程序。它只是打開一個空白窗口,並按下按鍵彈出消息框。它在Win 7盒子上按預期工作,但當我將可執行文件移動到XP盒子時,它立即彈出打開消息框而不按任何鍵。很奇怪。 – GregH

+0

不要添加評論以進一步解釋,而是更新原始問題 –

+0

開始+運行,Taskmgr.exe,進程選項卡。開始逐個關閉進程,直到找到麻煩製造者。 –

回答

0

這樣做的最好方法是重寫ProcesCmdKey爲您的表單,如下面的例子:

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean 
    MessageBox.Show("Pressed" & Convert.ToChar(keyData)) 
    Return MyBase.ProcessCmdKey(msg, keyData) 
End Function 

問候。

+0

好吧,我試過了,它仍然在射擊。我註釋掉了我的KeyDown處理程序並將其放入函數中。再次,在我的Win 7框中,只有按下某個鍵時纔會觸發該事件。但是,在我的生產XP盒子上,當沒有按鍵被按下時,偶發生火災。 – GregH

+0

如果我只是在消息框中輸出「keyData.ToString」,我會得到以下結果:「Pressed LButton,OemClear」 – GregH

0

有時.net控件在窗體或應用程序初始化時觸發。微軟稱這是「按設計」。如果你有問題,你可以使用一個標誌變量來放棄keydown處理程序中的任何處理,直到表單被加載。

相關問題