【问题标题】:Calling function once调用函数一次
【发布时间】:2020-07-26 19:45:18
【问题描述】:
    if (GetKeyState(VK_DOWN) & 0x80)
    {
        func();
    }

当我按键时它会调用 func() 4 次 我希望它在我按键时只调用一次

编辑:

    SHORT keyState;
    SHORT keyState2;
    SHORT keyState3;

    static bool toogle1 = false;
    static bool toogle2 = false;
    static bool toogle3 = false;

    if (keyState = GetAsyncKeyState(VK_DOWN) && !toogle1)
    {
        toogle1 = true;
    }
    else
        toogle1 = !toogle1;

    if (keyState2 = GetAsyncKeyState(VK_NUMPAD0) && !toogle2)
    {
        toogle2 = true;
    }
    else
        toogle2 = !toogle2;

    if (keyState3 = GetAsyncKeyState(VK_NUMPAD1) && !toogle3)
    {
        toogle3 = true;
    }
    else
        toogle3 = !toogle3;

我是这样做的,它会起作用吗?

【问题讨论】:

  • 在第一次调用时提出一个标志handled = true 并在VK_UP 时删除它
  • 给我伪代码
  • 你先从tour开始读How to Ask怎么样。这实际上是一个有价值的提示,说明出了什么问题,你的行为是不可接受的。
  • 发布的代码最多调用一次func();。如果问题是关于未显示的其他代码,您需要发布完整代码。
  • @mynameisjef 同样,发布的代码有 one 行调用func();,它位于if 块内。该行最多可以执行一次。无论该代码是封闭循环的一部分,还是从多次调用的消息处理程序中调用,没有人能猜到,因为您没有显示任何其他代码。见How to create a Minimal, Reproducible Example

标签: c++ winapi


【解决方案1】:
static bool once = false;
if (GetKeyState(VK_DOWN) & 0x80)
{
    if (!once)
     {    once = true; func();     }
}

【讨论】:

    【解决方案2】:

    我猜你是循环运行的。您在调用时切换标志的想法还不错,但是由于您在 else 情况下将其切换回,因此您调用 func() 的频率是以前的一半(每 2 次)。 当你想再次调用它时(我想你想要,根据你的代码),当再次按下键,但不是垃圾函数调用时,你可以使用一个变量来存储最后按下哪个键并且只调用 @987654322 @,当它是另一个键时(您也可以添加“未按下键”状态。

    如果您真的只想调用一次,只需删除您的 else 语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-27
      • 2017-06-14
      • 2020-07-12
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多