【问题标题】:C++ console keyboard eventsC++ 控制台键盘事件
【发布时间】:2011-01-05 06:57:42
【问题描述】:

有没有办法在 Windows 控制台中获取关键事件?我需要一种无需 GUI 即可快速获取 keydown 和 keyup 事件的方法。我尝试过使用 getch(),但它没有获得 keyups 并等待直到按下一个键才返回。

【问题讨论】:

  • 您说“没有 GUI”,但大多数时候(据我所知)在 Windows 上,您使用的是窗口内的控制台。如果您确实有一个窗口,您可以挂钩该窗口并捕获其消息。

标签: c++ windows console keyboard-events


【解决方案1】:

使用ReadConsoleInput() API。留意类似KEY_EVENT 的事件。这不适用于所有按键事件(无法读取 Ctrl 键、Shift 键、暂停键),但大多数都可以读取。

使用GetNumberOfConsoleInputEvents 避免阻塞。

【讨论】:

    【解决方案2】:

    您可以使用GetKeyStateGetAsyncKeyState,但这不会为您提供keydown/keyup 事件。它只会告诉您当前哪些键已关闭。

    所以如果你真的需要获取 keydown/keyup 事件,你可以安装一个钩子。 控制台窗口具有由 Windows 中的代码拥有的窗口句柄和也由 Windows 中的代码拥有的消息泵。

    您可以使用GetConsoleWindow获取控制台窗口的窗口句柄,然后使用SetWindowsHookEx安装WH_CALLWNDPROC钩子以监听发送到控制台窗口的消息。

    您可以尝试使用WH_MSGFILTER 挂钩。我不知道这是否适用于控制台窗口,但如果它确实有效,它会产生更少的被忽略的消息。

    【讨论】:

      【解决方案3】:

      我只是好奇,这么合乎逻辑的问题怎么在谷歌上没有任何解释, 所以必须在这里问。所以我搜索了:“键盘事件控制台应用程序” 和 猜猜看……前 2 个链接很有趣(但不幸的是,这并不完全是您问题的答案):

      【讨论】:

      • 我用谷歌搜索了同样的东西,猜猜是什么......第三个链接指向这个页面。
      【解决方案4】:

      有很多方法。 GetKeyboardState 将是最明显的一种。

      【讨论】:

        【解决方案5】:

        你也可以试试SetConsoleCtrlHandler

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-20
          • 2015-11-16
          • 2022-01-22
          相关资源
          最近更新 更多