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

如何检查C++上是否按下了一个键,c++,keyboard,key,C++,Keyboard,Key,我怎么可能检查Windows上是否按下了键?您是在谈论getchar函数吗 没有可移植的功能可以检查是否按了键,如果没有则继续。这始终取决于系统 针对linux和其他posix兼容系统的解决方案: 以与任何POSIX兼容系统兼容的方式提供kbhit功能。他使用了在termios级别取消缓冲的技巧 windows解决方案: 对于windows,Microsoft提供了,正如其他人提到的,没有跨平台的方法来实现这一点,但在windows上,您可以这样做: 下面的代码检查“A”键是否关闭 if(Get

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

您是在谈论getchar函数吗


没有可移植的功能可以检查是否按了键,如果没有则继续。这始终取决于系统

针对linux和其他posix兼容系统的解决方案:

以与任何POSIX兼容系统兼容的方式提供kbhit功能。他使用了在termios级别取消缓冲的技巧

windows解决方案:


对于windows,Microsoft提供了

,正如其他人提到的,没有跨平台的方法来实现这一点,但在windows上,您可以这样做:

下面的代码检查“A”键是否关闭

if(GetKeyState('A') & 0x8000/*Check if high-order bit is set (1 << 15)*/)
{
    // Do stuff
}
低阶位指示钥匙是否已切换

SHORT keyState = GetKeyState(VK_CAPITAL/*(caps lock)*/);
bool isToggled = keyState & 1;
bool isDown = keyState & 0x8000;
哦,还有别忘了

#include <Windows.h>
检查是否按下了某个键,如果是,则执行该操作

如果Posix功能在您的操作系统上可用,请考虑“选择”

“选择”使用3组位,您可以使用提供的函数创建这些位。请参见man select、FD_SET等。您现在可能只需要创建输入位

从手册页:

“选择”允许程序监视多个文件描述符,等待一个或多个文件描述符准备好进行某种类型的I/O操作(例如,可能的输入)。如果可以在不阻塞的情况下执行相应的I/O操作(如read2),则认为文件描述符已准备就绪

调用select时:

a函数查看集合中标识的每个fd,如果fd状态指示您可以执行某些操作,可能是读取,也可能是写入,则select将返回并让您执行该操作…”你所要做的就是扫描位,找到设定位,并对与该位相关联的fd采取行动

传递到select的第一组包含活动输入fd的典型设备。可能这个集合中的1位就是您所需要的。只需1个fd,即来自键盘的输入,1位,这一切都非常简单。使用select的返回,您可能可以在获取字符后“做一些事情”

b该函数还有一个超时,通过该超时,您可以确定等待fd状态更改的时间。如果fd状态不变,超时将导致“选择”返回0。i、 没有键盘输入,此时您的代码也可以做一些事情,可能是输出

仅供参考-fd通常为0,1,2。。。请记住,C使用0作为标准输入、1和标准输出

简单测试设置:我打开一个独立于控制台的终端,在该终端中键入tty命令以查找其id。响应通常类似于/dev/pts/0或3或17

然后,我通过使用open获得一个fd以在“选择”中使用:

// flag options are: O_RDONLY, O_WRONLY, or O_RDWR
int inFD = open( "/dev/pts/5", O_RDONLY ); 
计算这个值很有用

这是一个从man选择中考虑的片段:

  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

没有跨平台的方法可以做到这一点。请指定您想在哪个平台上开发。如果您在Windows上,则考虑使用API的GATASYNCKEYSTATE和GETKEY SATEAL欢迎到StAdvExcel。您当前形式的问题不适合堆栈溢出,无法在此网站范围内回答。请访问并阅读该部分。没有一种可移植的方式来确定程序是否可以访问键盘或任何I/O设备。更详细地编辑了我的问题,即使它的长时间AgBoOB用于数据,所以将按下一个键。我认为这个POSIX函数是可移植的。例如,我在嵌入式系统的vxWorks和Ubuntu Linux上使用了“选择”。因此,尽管有其他说法,这可能是跨平台的。在网络上所有复杂和超级困难的答案中,这是一个可以使用的答案!
  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