如何在按下键时将 bool 变量设置为 true,再次按下时如何设置为 false?

How to set a bool variable to true when a key is pushed and false when it is pushed again?

我在 C# 中遇到了一个很大的问题,现在我正在尝试编写一个函数来检测 F8 按钮何时被按下并将 bool F8Pushed 设置为 true,然后当它再次被按下时将 F8Pushed 设置为 false。

这是我目前的代码:

static bool IsKeyPressed() //This Function Returns True if F8 Is Pushed and False if F8 is up
{
    bool is_pressed = (GetAsyncKeyState(119) & 0x8000) != 0;
    return is_pressed;
}

static void CheckHotKey() //This is the Function that I am calling the other function from for debugging.
{
    while (true)
    {
        Console.WriteLine(IsKeyPressed());
    }
}

现在我遇到但无法解决的问题是,我无法找到一种方法让变量将其自身复制到另一个变量,并在有意义的情况下能够返回 false。如果 IsKeyPressed() == true 我可以将 bool 设置为 true,但是当它再次 returns 为真时,我无法弄清楚如何将其恢复为 false。

提前致谢!

编辑: 感谢您的帮助,但是我仍然遇到了一些问题,这是更新。

static bool IsKeyPressed()
    {
        is_pressed = (GetAsyncKeyState(119) & 0x8000) != 0 && !is_pressed; 
        return is_pressed;
    }

    static void CheckHotKeys()
    {
        while (true)
        {
            IsKeyPressed();
            if(is_pressed)
            {
                F8Pushed = true;
            }
            Console.WriteLine(F8Pushed);
            if(IsKeyPressed())
            {
                F8Pushed = false;
            }
            Console.WriteLine(F8Pushed);
        }
    }

我设法让它工作了一点,但是它有很多错误,很多时候击键没有检测到任何想法?

您必须将该变量 is_pressed 设置为全局变量以保持当前状态。然后像这样尝试:

static bool is_pressed;
static bool IsKeyPressed()
{
    is_pressed = (GetAsyncKeyState(119) & 0x8000) != 0 && !is_pressed;
    return is_pressed;
}

其中 && !is_pressed 每次都会为您切换值

假设您将按键结果存储在布尔值中:

bool isKeyPressed = true;

然后您可以这样做:

isKeyPressed == IsKeyPressed() && !isKeyPressed;

我不确定我是否完全理解你想要完成的事情。您的代码包含太多有问题的部分,我选择编写一个全新的代码:

class Program
{
  const byte VK_F8 = 0x77;
  const byte VK_ESC = 0x1b;

  static bool globalAppState = false;

  static void Main(string[] args)
  {
    bool lastState = IsKeyPressed(VK_F8);
    while (!IsKeyPressed(VK_ESC))
    {
      bool newState = IsKeyPressed(VK_F8);
      if (lastState != newState)
      {
        if (newState)
        {
          Console.WriteLine("F8: pressed");
          globalAppState = !globalAppState;
        }
        else
          Console.WriteLine("F8: released");
        lastState = newState;
      }
    }
  }

  static bool IsKeyPressed(byte keyCode)
  {
    return ((GetAsyncKeyState(keyCode) & 0x8000) != 0);
  }

  [DllImport("user32.dll")]
  static extern short GetAsyncKeyState(int vKey);
}

函数 IsKeyPressed(VK_F8) 始终告诉您指定键的当前状态 (pressed/released)。

当您只需要在更改时执行某些操作时(从按下到释放,或从释放到按下) 用您的特定任务替换控制台输出函数。

当你需要一些多线程时,比如在新线程中处理事件,这是一个不同的问题......(在此范围之外)

编辑:在每个新的按键事件上添加了变量更改。这是肮脏的解决方案...