How can I detect if there is input waiting on stdin on windows?
c, c++, windows
Solution
As stated in the `ReadConsoleInput()` documentation:
A process can specify a console input buffer handle in one of the wait functions to determine when there is unread console input. When the input buffer is not empty, the state of a console input buffer handle is signaled.
To determine the number of unread input records in a console's input buffer, use the GetNumberOfConsoleInputEvents function. To read input records from a console input buffer without affecting the number of unread records, use the PeekConsoleInput function. To discard all unread records in a console's input buffer, use the FlushConsoleInputBuffer function.
You can use `GetStdHandle()` to get a handle to STDIN for use in the above functions.
Problem
I want to detect whether or not there is input waiting on stdin in Windows. I use the following generic structure on Linux: ``` fd_set currentSocketSet; struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; int result = 1; while (result > 0){ FD_ZERO(¤tSocketSet); FD_SET(STDIN, ¤tSocketSet); result = select(STDIN+1, ¤tSocketSet, NULL, NULL, &tv); if (result == -1){ printf("Network Error -- select errored with id=%d.\n", errno); return; } else if (result > 0){ //...do stuff } } ``` Note: I do not want to deal with the keyboard and keyboard functions like kbhit. I want a way to do what I asked. I do not want a third party library to do this either, I would like a native Windows library call to get the answer. Note #2: On windows the above code fails with windows error code 10038 "An operation was attempted on something that is not a socket" which probably means that windows does not support selecting on STDIN.