我怎么可能检查Windows上是否按下了按键?
答案 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
功能吗?