C# 如果按下c键,如何更改布尔值

C# 如果按下c键,如何更改布尔值,c#,winforms,C#,Winforms,如果按下一个键,我会尝试更改一个布尔值,但释放后会恢复为false,因此只有在所有参数都正确且按下一个键时,我才能触发if语句 public class boolean { public static Boolean keyPresed = false; } private void mainForm_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.A) {

如果按下一个键,我会尝试更改一个布尔值,但释放后会恢复为false,因此只有在所有参数都正确且按下一个键时,我才能触发if语句

public class boolean
{
    public static Boolean keyPresed = false;
}

private void mainForm_KeyDown(object sender, KeyEventArgs e)
{                
    if (e.KeyData == Keys.A)
    {
        MessageBox.Show(" just for debugging ");
        boolean.keyPresed = true;
     } 
      else {
          boolean.keyPressed = false;
         }
        if (tileBuyPlayer2.Checked && ownerShipsPlayer2.peacockOwner == false && boolean.keyPresed == true)
        {
            // do this sorry not on here cause how big it is
        }
    }
}
您可以在此类中将keyAPressed声明为全局变量,并在KeyDown事件中重置它:

public class DemoClass
{
    public static Boolean keyAPressed = false;

    private void mainForm_KeyDown(object sender, KeyEventArgs e)
    {                
        if (e.KeyCode == Keys.A)
        {
            MessageBox.Show(" just for debugging ");
            keyAPressed = true;
        } 
        else 
        {
            keyAPressed = false;
        }
        if (keyAPressed == true)
        {
            // Reset keyAPressed to false
            keyAPressed = false
            if (tileBuyPlayer2.Checked && ownerShipsPlayer2.peacockOwner == false)
            {
                // do this sorry not on here cause how big it is
            }
        }
    }
}
或使用KeyUp事件重置keyAPressed:


如果您愿意尝试Microsoft的反应式框架,那么您可以尝试执行以下操作:

var keyDown = Observable.FromEventPattern<KeyEventArgs>(mainForm, "KeyDown");

var query =
    from kd in keyDown
    where kd.EventArgs.KeyCode == Keys.A
    where tileBuyPlayer2.Checked
    where ownerShipsPlayer2.peacockOwner == false
    select kd;

query.Subscribe(x =>
{
    // do your code here
});

我可能错过了您试图做的事情,但我认为这会让事情变得更容易。

您将keyPresed设置为true。看看这是不是真的。这永远是事实。为什么要这样做?keyPresed是否有可以设置为false的位置?使用KeyUp事件将标志设置为false。很抱歉,这只是代码的演示版本。我会更改它,我有一个else语句将其设置回false。首先,您应该尝试了解KeyDown事件的工作原理毕竟,mainForm\u KeyDown处理KeyDown事件。如果您理解了这一点,那么在释放密钥时,如何使用KeyUp事件将布尔变量重置回false,您会立即明白。您是在问我如何设置事件处理程序吗?看见我不明白为什么你甚至需要一个全局变量来保持按下键的状态。您可以使用KeyPressed事件,只需检查按下的键是否是所需的键,然后进行验证。Thx以获取您的评论。我将检查我的源代码。请删除第一个源代码块。它包含关于第二个if语句的错误。第二个代码块似乎几乎正确,它包含了KeyDown和KeyUp两个处理程序。但是,KeyDown处理程序不应该将布尔值设置回false。如果按住A键并点击SHIFT,会发生什么?对不起,但是第二个if语句中的错误是什么?如果keyAPressed是真的,我会做一些事情。但是在做事情之前,我先重置按键a。我这样做了,但是它没有显示消息框。它没有显示消息框。你按了a还是a?
var keyDown = Observable.FromEventPattern<KeyEventArgs>(mainForm, "KeyDown");

var query =
    from kd in keyDown
    where kd.EventArgs.KeyCode == Keys.A
    where tileBuyPlayer2.Checked
    where ownerShipsPlayer2.peacockOwner == false
    select kd;

query.Subscribe(x =>
{
    // do your code here
});