【问题标题】:C++ Check if key is pressed, not held downC ++检查是否按下键,而不是按住
【发布时间】:2018-07-07 16:58:01
【问题描述】:

我有以下代码:

for (int i = 0; i < 1;) {
        if (GetKeyState(VK_SHIFT) & 0x8000)
        {
            cout << "op";
        }
}

如果按住 Shift 键,则会打印出op,实际上,如果您按住该键,则会输出垃圾邮件。

这正是我想要的:

当您按下/按住某个键而不是发送垃圾邮件时,程序会打印一次,而再次打印它的唯一方法是放开该键并再次按下它。不管你按住这个键多久,程序只会执行一次下面的代码,除非你再次按下它。

如何让我的代码做到这一点?

【问题讨论】:

  • 添加一个标志并在第一次按下键时设置它,并在释放键时取消设置。在每次按键时检查此标志以确定键是刚刚按下还是按住。
  • 或使用GetAsyncKeyState() 代替:“确定在调用函数时某个键是向上还是向下,以及在上一次调用 GetAsyncKeyState 之后是否按下了该键.

标签: c++ windows key


【解决方案1】:

您可以在检测到“按键按下”事件时简单地将bool 设置为true,然后仅在检测到“按键按下”事件后将其设置回false。这样您就可以知道该键是否已按下,并且仅在尚未处于该状态时才报告它已被按下。

【讨论】:

  • 我不确定我是否关注,只要您按住它,它仍然会是垃圾邮件,不是吗?你能提供一些代码吗?
  • @J.确实,Windows 仍会生成事件。 point 是您将跟踪按键状态,允许您说“发生了按键按下事件,但是 ohh 我已经看到其中一个没有中间键启动事件,所以我将忽略这个”。您无法真正阻止操作系统生成事件,但您可以跟踪要处理的事件。
  • 好的,听起来不错。所以每次按下 SHIFT 时我都必须检查当前时间,然后检查上次检查是多久以前的?那我该怎么做呢?我知道你可以在 Java 中使用“CurrentTimeMilis”,但在 C++ 中我不确定。
  • @J.不,不,不。你为什么要把时间混进去?这真的很简单。只需为每个键设置一个标志,说明您是否已经看到该键的按键事件。设置是否在收到新闻事件时,在收到发布事件时清除它。在决定是否对新闻事件采取行动时,请考虑标志 - 仅在标志尚未设置时才采取行动。不要通过在等式中添加时间和其他废话来混淆事物。这只是一个简单的布尔标志。
  • @J.Doe if (keyPressed = false) 必须是if (keyPressed == false),或更简单的if (!keyPressed)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
相关资源
最近更新 更多