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