【问题标题】:GetKeyState() vs. GetAsyncKeyState() vs. getch()?GetKeyState() 与 GetAsyncKeyState() 与 getch()?
【发布时间】:2013-07-20 04:40:48
【问题描述】:

与获得按键有什么区别:

  • GetKeyState()
  • GetAsyncKeyState()
  • getch()?

我应该什么时候使用一个而不是另一个?

【问题讨论】:

  • 为什么投反对票?我无法从 stackoverflow 中找到任何结果,即使我忽略 getch() 并搜索 GetKeyState() vs. GetAsyncKeyState()

标签: c++ input keyboard getchar


【解决方案1】:

GetKeyState() 和 GetAsyncKeyState() 是 Windows 特定的 API,而 getch() 适用于其他非 Windows 特定的 C 编译器。

GetKeyState() 获取从线程的消息队列返回的键状态。该状态不反映与硬件相关的中断级状态。

GetAsyncKeyState() 指定自上次调用 GetAsyncKeyState() 以来是否按下按键,以及 当前按键是向上还是向下。如果设置了最高有效位,则按键按下,如果设置了最低有效位,则在上一次调用 GetAsyncKeyState() 之后按键被按下。

我在实践中看到的是,如果您按住一个键并在按下该键时分配一个行为,如果您使用 GetKeyState(),则该行为将被调用的次数比使用 GetAsyncKeyState 的次数多()。

在游戏中,我更喜欢使用 GetAsyncKeyState()。

(您也可以在 MSDN 博客上查看更多详细信息)。

【讨论】:

    【解决方案2】:

    想想异步是什么意思。

    • GetAsyncKeyState()异步获取密钥状态,即无需等待任何内容,即现在

    • GetKeyState()同步获取key的状态,就是你即将用getch()读取的key的key状态。它与按键本身一起在键盘缓冲区中排队。

    作为一个例子,假设已经输入了以下内容,但尚未阅读:

    • h
    • 移位+1
    • ctrl(按住)

    GetAsyncKeyState() 将返回 ctrl pressed

    GetKeyState() will returnH 按下until you callgetch()`

    GetKeyState() 将返回I pressed,直到您调用getch()

    GetKeyState() 将返回 shift pressed, 1 pressed,直到您调用 getch(),这将返回 !(按 shift+1 的结果)

    GetKeyState() 然后将返回ctrl pressed

    【讨论】:

    • 感谢您的编辑,从不知道您可以做关键符号。
    • 这些函数的签名是“SHORT GetAsyncKeyState( [in] int vKey ); 来自 api 文档:“如果函数成功,返回值指定自上次调用以来是否按下了键GetAsyncKeyState,以及密钥当前是向上还是向下。如果设置了最高有效位,则键按下,如果设置了最低有效位,则在上一次调用 GetAsyncKeyState 后按下了键。但是,您不应该依赖最后一种行为;有关更多信息,请参阅备注。”所以这个答案具有误导性,没有像“我按下”这样的返回值
    • 因为我也有问题要说清楚,我的意思是:使用此功能,您“询问”是否按下了某个键,您事先已指定。这不会返回被按下的键(所以不像也提到的 getch() 的行为,这可能会使这个答案如此混乱)。这就像非阻塞一样,例如使用转义键:“if ((GetAsyncKeyState(VK_ESCAPE) & 0x01)) { ... "
    • 对不起,这里的异步/同步解释也是错误的。 "SHORT GetKeyState([in] int nVirtKey);" (没有 ASYNC 的那个)不会阻塞! GetKeyState 返回虚拟键状态,即您的输入队列。 GetAsyncKeyState 直接检测键盘上的硬件中断。请参阅:devblogs.microsoft.com/oldnewthing/20041130-00/?p=37173topic.alibabacloud.com/a/…
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2014-08-21
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多