【问题标题】:Get key press for only when got pressed and get it again when it is released and pressed again仅在按下时获取按键,并在释放并再次按下时再次获取
【发布时间】:2021-05-09 16:25:00
【问题描述】:

我试图只在按下它时才获得键输入,而不是在我们按住它的情况下。

我希望它停止输入,直到它再次“释放”和“按下”,但我无法做到。

我的代码:

while(isRunning)
{
    if(GetKeyState('K') & 0x8000) 
    {
        std::cout << "K is Pressed" << std::endl;
    }
}

按下时输出:

K 被按下
K 被按下
K 被按下
K 被按下
K 被按下
K 被按下
K 被按下
K 被按下
K 被按下
K被按下

但我希望自己成为一个

K 被按下

当我“释放”它并再次“按下”它时,我希望它再次打印它。

【问题讨论】:

标签: c++ windows io keyboard


【解决方案1】:

如果您只想通知状态更改,则不应在循环中调用GetKeyState。相反,您应该回复 WM_KEYDOWNWM_KEYUP 消息。

但是,在 Windows 控制台应用程序中,您无法处理控制台窗口的窗口消息,因为您的应用程序不拥有该窗口。因此,您将不得不改用ReadConsoleInput 并处理KEY_EVENT_RECORD 事件。请参阅this thread,了解有关为什么无法为控制台应用程序创建标准窗口消息循环的更多信息。

【讨论】:

  • 我环顾了一下,但我如何获得 UINT 消息,它始终是所有文档中的一个参数,但它从未显示如何获得“UINT 消息”或“WPARAM wParam”之一我提到的链接是docs.microsoft.com/en-us/windows/win32/inputdev/wm-keydown,这也不是一个 gui 应用程序
  • @RAGBOT:由于您现在已经添加了控制台应用程序所需的信息,因此我已经相应地编辑了我的答案。
【解决方案2】:

我不确定您使用的是什么库,但获得按键背后的想法是创建 bool 类型的数组,例如 bool lastKeys[256]; 并记录最后一帧中按下的所有键,您每次按下一个键或每一帧都需要更新它......然后当你想要一个按键时,你需要询问if (GetKeyState('k') &amp;&amp; !lastKeys['k'])如果你的图书馆有这个功能,这可能是它在幕后完成的方式。 尽量提高效率。

【讨论】:

    猜你喜欢
    • 2021-04-24
    • 1970-01-01
    • 2021-09-10
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多