我有这个计时器滴答功能:
Private Sub controlTick(ByVal sender As Object, ByVal e As EventArgs)
Label2.Text = (Control.ModifierKeys = Keys.Control)
End Sub
如果我当前按住Control键,那么应该让我的标签说“True”,如果我不是,那么“False”。
但是,为什么我的标签总是“假”?有趣的是,如果我按照控制键一次点亮,我可以看到一小段时间“真”,但立即变为“假”。
计时器每隔50ms滴答一次。
我不明白......任何想法?
答案 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