2011-08-20 107 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处理程序中的任何处理,直到表单被加载。

相关问题