我如何检测是否有input等待在Windows上的标准input?

我想检测在Windows中是否有input等待stdin。

我在Linux上使用以下通用结构:

fd_set currentSocketSet; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; int result = 1; while (result > 0){ FD_ZERO(&currentSocketSet); FD_SET(STDIN, &currentSocketSet); result = select(STDIN+1, &currentSocketSet, NULL, NULL, &tv); if (result == -1){ printf("Network Error -- select errored with id=%d.\n", errno); return; } else if (result > 0){ //...do stuff } } 

注意:我不想处理像kbhit这样的键盘和键盘function。 我想要一个办法来做我所问的。 我不希望第三方库也这样做,我想要一个本地Windows库调用来获得答案。

注意#2:在窗口上面的代码失败,Windows错误代码10038“一个操作试图在不是一个套接字”这可能意味着Windows不支持在STDINselect。

ReadConsoleInput()文档中所述 :

进程可以在其中一个等待函数中指定控制台输入缓冲区句柄,以确定何时有未读的控制台输入。 当输入缓冲区不为空时,控制台输入缓冲区句柄的状态将发出信号。

要确定控制台输入缓冲区中未读输入记录的数量,请使用GetNumberOfConsoleInputEvents函数。 要从控制台输入缓冲区中读取输入记录而不影响未读记录的数量,请使用PeekConsoleInput函数。 要放弃控制台输入缓冲区中的所有未读记录,请使用FlushConsoleInputBuffer函数。

您可以使用GetStdHandle()获取STDIN的句柄以用于上述功能。

如你所知,Linux!= Windows,在这两种环境下你都不会得到相同的“select()”语义。

您没有指定是否是Windows GUI或控制台模式程序。 它有所作为。

但是…

两个Win32 API你可能要看看:

  • GetAsyncKeyState

  • PeekConsoleInput

“希望有所帮助

PS:

如果这是一个控制台模式的程序,你将需要一个窗口句柄。 调用GetStdHandle(STD_INPUT_HANDLE)来获取它。

正如已经指出的那样,在Windows中你必须使用GetStdHandle()并且返回的句柄不能和套接字混合使用。 但幸运的是,返回的句柄可以用WaitForSingleObject()来测试,就像Windows中的许多其他句柄一样。 你可以做这样的事情:

 #include <stdio.h> #include <windows.h> BOOL key_was_pressed(void) { return (WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE),0)==WAIT_OBJECT_0); } void wait_for_key_press(void) { WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE),INFINITE); } int main() { if(key_was_pressed()) printf("Someone pressed a key beforehand\n"); printf("Wait until a key is pressed\n"); wait_for_key_press(); if(key_was_pressed()) printf("Someone pressed a key\n"); else printf("That can't be happening to me\n"); return 0; } 

编辑:忘了说,你需要从句柄读取字符,以便key_was_pressed()返回FALSE。