如何检查C ++上是否按下了键

时间:2017-01-11 21:27:10

标签: c++ keyboard key

我怎么可能检查Windows上是否按下了按键?

4 个答案:

答案 0 :(得分:13)

正如其他人所说,没有跨平台的方法可以做到这一点,但在Windows上你可以这样做:

以下代码检查密钥“A”是否已关闭。

if(GetKeyState('A') & 0x8000/*Check if high-order bit is set (1 << 15)*/)
{
    // Do stuff
}

如果出现轮班或类似情况,您需要传递以下其中一项:https://msdn.microsoft.com/de-de/library/windows/desktop/dd375731(v=vs.85).aspx

if(GetKeyState(VK_SHIFT) & 0x8000)
{
    // Shift down
}

低位指示键是否切换。

SHORT keyState = GetKeyState(VK_CAPITAL/*(caps lock)*/);
bool isToggled = keyState & 1;
bool isDown = keyState & 0x8000;

哦,也不要忘记

#include <Windows.h>

答案 1 :(得分:2)

没有便携式功能可以检查键是否被击中,如果没有则继续。这始终取决于系统。

Linux及其他符合posix标准的系统的解决方案:

Here, for Morgan Mattews's code以与任何POSIX兼容系统兼容的方式提供kbhit()功能。他使用了在termios级别停用缓冲的技巧。

Windows解决方案:

对于Windows,Microsoft提供_kbhit()

答案 2 :(得分:1)

  

检查是否按下了某个键,如果是,则执行操作

如果您的操作系统上有此功能(据报道为Posix),请考虑选择()&#39;

&#39;选择()&#39;使用3组位,使用提供的函数创建(参见man select,FD_SET等)。您可能只需要创建输入位(现在)

来自手册页:

&#39;选择()&#39; &#34;允许程序监视多个文件描述符,等待一个或多个文件描述符变为&#34; ready&#34;对于某类I / O操作(例如,输入可能)。如果可以执行相应的I / O操作(例如,读取(2)而不阻塞...),则认为文件描述符已准备就绪。&#34;

调用select时:

a)该函数查看集合中标识的每个fd,如果该fd状态表明您可以执行某些操作(可能是读取,也许是写入),则选择将返回并允许您执行此操作...&#39;所有你要做的事情&#39;扫描位,找到设置位,并对与该位相关联的fd执行操作。

第一组(传入select)包含有效输入fd(通常为设备)。你可能需要的只有1位。只有1个fd(即来自键盘的输入),1位,这一切都非常简单。通过选择返回,您可以“做什么”。 (也许,在你拿到了炭之后)。

b)该函数还有一个超时,您可以使用该超时来确定等待更改fd状态的时间。如果fd状态没有改变,超时将导致&#39; select()&#39;返回0.(即没有键盘输入)你的代码也可以在这个时候做一些事情,也许是一个输出。

fyi - fd&#39; s通常为0,1,2 ...记得C使用0作为STDIN,1和STDOUT。

简单的测试设置:我打开一个终端(与我的控制台分开),然后在该终端中键入tty命令以查找其ID。响应通常类似于&#34; / dev / pts / 0&#34;,或3或17 ...

然后我得到一个fd用于&#39; select()&#39;通过使用open:

// flag options are: O_RDONLY, O_WRONLY, or O_RDWR
int inFD = open( "/dev/pts/5", O_RDONLY ); 

小心这个值很有用。

这是一个需要考虑的片段(来自man select):

  fd_set rfds;
  struct timeval tv;
  int retval;

  /* Watch stdin (fd 0) to see when it has input. */
  FD_ZERO(&rfds);
  FD_SET(0, &rfds);

  /* Wait up to five seconds. */
  tv.tv_sec = 5;
  tv.tv_usec = 0;

  retval = select(1, &rfds, NULL, NULL, &tv);
  /* Don't rely on the value of tv now! */

  if (retval == -1)
      perror("select()");
  else if (retval)
      printf("Data is available now.\n");  // i.e. doStuff()
      /* FD_ISSET(0, &rfds) will be true. */
  else
      printf("No data within five seconds.\n"); // i.e. key not pressed

答案 3 :(得分:-3)

您在谈论getchar功能吗?

http://en.cppreference.com/w/c/io/getchar