未检查控制键是否正确按下

时间:2011-04-05 04:32:41

标签: vb.net winforms

我有这个计时器滴答功能:

Private Sub controlTick(ByVal sender As Object, ByVal e As EventArgs)
    Label2.Text = (Control.ModifierKeys = Keys.Control)
End Sub

如果我当前按住Control键,那么应该让我的标签说“True”,如果我不是,那么“False”。

但是,为什么我的标签总是“假”?有趣的是,如果我按照控制键一次点亮,我可以看到一小段时间“真”,但立即变为“假”。

计时器每隔50ms滴答一次。

我不明白......任何想法?

3 个答案:

答案 0 :(得分:3)

我无法重现您描述的行为...我尝试创建一个新的WinForms项目,在表单中间放置一个Label控件,并添加了一个Timer控件。

每当我按 Ctrl 键时,标签都会显示True。否则,它会显示False。确实是你期望看到的行为。我不必以闪电般的速度按任何东西。

(编辑:当窗体上放置更多控件时,它不会中断。你有什么不同的做法?)

我的代码如下所示:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
    ' Start the timer
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    ' Update the label
    Label1.Text = (Control.ModifierKeys = Keys.Control).ToString
End Sub

唯一不同的是,您显然正在编译而未启用类型检查(Option Strict Off) 我总是喜欢在VB.NET中打开代码(检查你的项目的属性窗口),在这种情况下你必须使用ToString显式地将布尔类型转换为字符串类型。

答案 1 :(得分:1)

我已经创建了一个winform应用程序来证明这一点。我正在使用表单并且我已将“KeyPreview”属性设置为true,并且对于按下的每个键,我都能正确获取代码。

请使用我提到的方式再次检查,如果它结算,请告诉我。

private void Form1_KeyDown(object sender, KeyEventArgs e) { MessageBox.Show(e.KeyCode.ToString()); }

对于Control键,代码是(e.KeyCode == Keys.ControlKey)....

答案 2 :(得分:0)

我不确定这会有所帮助,但请尝试使用HasFlag,因为ModifierKeys中可能还有一些其他标志也在使用:

http://msdn.microsoft.com/en-us/library/system.enum.hasflag.aspx