形成KeyUp和KeyDown事件以更改变量

时间:2011-11-28 14:53:43

标签: c# .net winforms events keyboard

在我的申请中,我有:

private bool _clear = true;

此布尔值用于查看当用户向其中输入新文本时是否应清除文本框(通过按TreeView中的TreeNode)。

然后我为我的表格提供了这两个事件:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Modifiers == Keys.Control)
    {
        _clear = false;
    }

}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    if (e.Modifiers == Keys.Control)
    {
        _clear = true;
    }
}

我想以某种方式当用户持有CTRL键,清除为FALSE并且当CTRL被释放时,clear将返回TRUE。

显然我在这里写的代码不起作用!什么可能是错的和/或有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

这是一个简单的修复,因为当您释放密钥时,KeyUp事件不会收到任何已释放密钥的信息,因此只需将该属性设置为true:

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
   _clear = true;       
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
   if (e.Modifiers == Keys.Control)
   {
      _clear = false;
   }
}

如果您希望实时查看它,请在表单中添加标签,并在“_clear”变量的每个设置下添加:

label1.Text = _clear.ToString();

根据您的评论,将第二个代码块更改为:

if (e.KeyData.ToString() == "ControlKey, Control")
{
   _clear = false;                  
}
else if(other shortcut conditionals go here or on other else if's)
{
   _clear = true;
}

此条件唯一适用的时间是控制本身。其他情况是为了将_clear设置为true,当你按下ctrl后跟另一个键时,由于按下控件后它会触发KeyDown事件。

根据这一变化,只要你在if语句之后处理按键,(例如if if()),你就不需要在KeyUp事件中设置任何东西了。

如果您想要更深入的信息,请参阅my answer here to the intricacies of keys and their properties

编辑#3:

只要您在每个条件的第一行设置_clear为true,您就应该能够避免在评论中遇到的问题:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{

   if (e.KeyData.ToString() == "ControlKey, Control")
   {
      _clear = false;

   }
   else if(e.KeyData.ToString() == "O, Control")
   {
       _clear = true;
       //Do other stuff here, such as opening a file dialog

   }

}

答案 1 :(得分:2)

如果您以相反的方式执行此操作,则很多更容易。检查树视图事件中的CTRL键是否已关闭。像这样:

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
        if ((Control.ModifierKeys & Keys.Control) == Keys.Control) {
            // Control key is down, do something...
        }
    }

答案 2 :(得分:1)

您需要将表单的KeyPreview属性更改为True。