以下代码可以捕获任何按键。它用于从函数中返回。
文档:
https://learn.microsoft.com/en-us/windows/console/readconsoleinput?redirectedfrom=MSDN
https://learn.microsoft.com/en-us/windows/console/input-record-str?redirectedfrom=MSDN
https://learn.microsoft.com/en-us/windows/console/key-event-record-str?redirectedfrom=MSDN
目的
该函数执行一些计算,其进度在控制台上向用户显示。当所有操作完成后,用户希望从函数中返回。她可以通过按任意键来实现这一点。在我所有的其他应用程序中,用户可以使用Esc键返回,因此在这里也能够使用它是很好的。
它通过分配控制台并设置控制台输出和输入的句柄来工作。标志OKflg_out和OKflg_in被设置为在结束时验证操作。在向用户显示消息“按任意键”之后的for (; ;)循环将在用户按下键时结束。
按下键的数字代码是(((irec.Event).KeyEvent).uChar).AsciiChar,但在这里没有使用它。当然,它可以用作返回代码,以确定调用函数中的后续操作。
#include <windows.h>
void wrintf0(HANDLE stdOut, unsigned char *message)
{
DWORD written=0;
WriteConsoleA(stdOut, message, strleni(message), &written, NULL);
}
#define wrintf(message) wrintf0(stdOut,message)
void Myfunction(void)
{
unsigned char OKflg_in=0,OKflg_out=0;
HANDLE stdIn,stdOut;
AllocConsole();
stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (stdOut != NULL && stdOut != INVALID_HANDLE_VALUE)
{
OKflg_out = 1;
stdIn = GetStdHandle(STD_INPUT_HANDLE);
if (stdIn != NULL && stdIn != INVALID_HANDLE_VALUE) OKflg_in = 1;
}
if (OKflg_out)
{
if (OKflg_in)
{
DWORD cc;
INPUT_RECORD irec;
wrintf("Press any key.");
for(; ;) {
ReadConsoleInput(stdIn, &irec, 1, &cc );
if (irec.EventType == KEY_EVENT && ((irec.Event).KeyEvent).bKeyDown) break;
}
CloseHandle(stdIn);
}
CloseHandle(stdOut);
}
FreeConsole();
return;
}