将 GetAsyncKeyState() 重置为默认值

Posted

技术标签:

【中文标题】将 GetAsyncKeyState() 重置为默认值【英文标题】:Reset GetAsyncKeyState() to default 【发布时间】:2016-10-08 14:27:36 【问题描述】:

我正在学习使用kbhit()GetAsyncKeyState()getch() 的组合来构建我的主机游戏。

我正在使用 Visual Studio 2010 Express,我可以使用 c/c++ 标头。

兼容性问题(仅在 Windows 平台上运行)对我来说并不重要。

看看这个简单的代码:

#include<stdio.h>
#include<conio.h>
#include<Windows.h>

int main()

  printf("Welcome\n");
  while(true)
  
    if(_kbhit())
    
      if(GetAsyncKeyState(VK_UP))
        printf("UP\n");
      else if(GetAsyncKeyState(VK_DOWN))
        printf("DOWN\n");
      else if(GetAsyncKeyState(VK_LEFT))
        printf("LEFT\n");
      else if(GetAsyncKeyState(VK_RIGHT))
        printf("RIGHT\n");
      else 
        printf("NOT ARROW\n");
      getch();
    
  
  return 0;

问题是:任何虚拟键输入都会打印 TWICE 而其他运行正常。

我不知道是什么问题,但我找到了简单的解决方法。

#include<stdio.h>
#include<conio.h>
#include<Windows.h>

int main()

  printf("Welcome\n");
  while(1)
  
    if(_kbhit())
    
      if(GetAsyncKeyState(VK_UP))
      
        printf("UP\n");
        _getch();
      
      else if(GetAsyncKeyState(VK_DOWN))
      
        printf("DOWN\n");
        _getch();
      
      else if(GetAsyncKeyState(VK_LEFT))
      
        printf("LEFT\n");
        _getch();
      
      else if(GetAsyncKeyState(VK_RIGHT))
      
        printf("RIGHT\n");
        _getch();
      
      else 
      
        printf("NOT ARROW\n");
      
      _getch();
    
  
  return 0;

我的猜测是GetAsyncKeyState() 没有正确清除为默认值

有什么解释吗?

还为每个kbhit()GetAsyncKeyState() 添加_getch() 是一种冗余,因此会降低可读性,还有其他选择吗?

【问题讨论】:

GetAsyncKeyState "strange" behavior的可能重复 【参考方案1】:

(GetAsyncKeyState(VK_UP) & 1)

【讨论】:

以上是关于将 GetAsyncKeyState() 重置为默认值的主要内容,如果未能解决你的问题,请参考以下文章

来自windows.h的GetAsyncKeyState

如何使用 GetAsyncKeyState 查看按键被按下了 x 秒

GetAsyncKeyState 使用 cin 创建问题

使用 GetAsyncKeyState() 的键监听器/记录器

“getAsyncKeyState”是不是会触发防病毒程序 c++

杂文虚拟键码表(供函数GetAsyncKeyState()使用)