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

C# 形成KeyUp和KeyDown事件以更改变量,c#,.net,winforms,events,keyboard,C#,.net,Winforms,Events,Keyboard,在我的申请中,我有: private bool _clear = true; 此布尔值用于查看当用户在文本框中输入新文本时(通过按TreeView中的树节点),是否应清除文本框 然后我的表格中有两个事件: private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.Modifiers == Keys.Control) { _clear = false; } } private v

在我的申请中,我有:

private bool _clear = true;
此布尔值用于查看当用户在文本框中输入新文本时(通过按TreeView中的树节点),是否应清除文本框

然后我的表格中有两个事件:

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键时,clear返回FALSE,当释放CTRL键时,clear返回TRUE


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

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

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

这是一个简单的修复方法,因为当您释放密钥时,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;
   }
}
如果您想看到它实时工作,请在表单中添加一个标签,并将其添加到“\u 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;
}
此条件唯一保持为真的时间是控件自身保持时。else情况用于在按下ctrl键后再按另一个键时将_clear设置为true,因为只要按下control键,它就会触发KeyDown事件

基于此更改,只要注意if语句之后的按键操作(例如else if()),就不需要在KeyUp事件中设置任何内容

看看你是否需要更深入的信息

编辑#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

   }

}

这是一个简单的修复方法,因为当您释放密钥时,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;
   }
}
如果您想看到它实时工作,请在表单中添加一个标签,并将其添加到“\u 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;
}
此条件唯一保持为真的时间是控件自身保持时。else情况用于在按下ctrl键后再按另一个键时将_clear设置为true,因为只要按下control键,它就会触发KeyDown事件

基于此更改,只要注意if语句之后的按键操作(例如else if()),就不需要在KeyUp事件中设置任何内容

看看你是否需要更深入的信息

编辑#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

   }

}
如果你用另一种方式做这件事会容易得多。检查treeview事件中的CTRL键是否已按下。大概是这样的:

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
        if ((Control.ModifierKeys & Keys.Control) == Keys.Control) {
            // Control key is down, do something...
        }
    }
如果你用另一种方式做这件事会容易得多。检查treeview事件中的CTRL键是否已按下。大概是这样的:

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


谢谢,这部分起作用了,它使
\u clear
为False,但是
KeyUp
事件不知何故不起作用,并且保持False。有什么想法吗?我试过一个测试,你的问题没有出现,在调试模式下,你只会看到一个事件触发,但两个事件正在触发。检查按键事件的结果谢谢,这部分起作用了,它使
\u clear
为假,但
按键事件不知何故不起作用,并且保持为假。有什么想法吗?我尝试了一个测试表单,您的问题没有出现,在调试模式下,您将只看到一个事件触发,但两个事件正在触发检查按键事件的结果谢谢,我也尝试了这个,但出现了一个问题。我还有其他快捷键,比如
CTRL+A
和类似的stuf。如果我出于其他目的按CTRL+A(这是菜单项的快捷方式),这将不是一个可靠的解决方案。有办法吗?修正了,检查答案的底部。你好,我也试过这种方法。不幸的是,这个问题仍然存在。例如,当我按CTRL+O打开FileOpenDialog时会发生这种情况,即使对话框关闭后,_clear也会保持为false,因此我必须再次按CTRL。有可能避免这种行为吗?目前我正在使用SHIFT键来实现这一目的,因为它不是任何东西的快捷方式,所以效果很好。如果能解决控制键的问题就好了!谢谢,我也试过了,但是有个问题。我还有其他快捷键,比如
CTRL+A
和类似的stuf。如果我出于其他目的按CTRL+A(这是菜单项的快捷方式),这将不是一个可靠的解决方案。有办法吗?修正了,检查答案的底部。你好,我也试过这种方法。不幸的是,这个问题仍然存在。例如,当我按CTRL+O打开FileOpenDialog时会发生这种情况,即使对话框关闭后,_clear也会保持为false,因此我必须再次按CTRL。有可能避免这种行为吗?目前我正在使用SHIFT键来实现这一目的,因为它不是任何东西的快捷方式,所以效果很好。如果能解决控制键的问题就好了!谢谢,这可以用鼠标操作,但如果用户使用箭头键并输入怎么办。我也有自动激活项目更改功能。哦,明白了,我对treeview键事件使用相同的方式,还是不?是的,不管你在哪里关心CTRL键是否已按下。谢谢,这可以使用鼠标,但如果用户使用箭头键和enter键进行操作怎么办。我也有自动激活的项目变化。哦,明白了,我用同样的方式为树状视图键事件,或不?是的,无论你在哪里关心是否按下CTRL键。