该_kbhit函数检查控制台是否有最近的击键。它从不检查标准输入,而是打开CONIN$(控制台输入)并始终从这里读取。
所以在这里重定向标准输入什么都没有。如果我们与孩子共享同一个控制台,我们可以使用WriteConsoleInput这个任务。将字符串写入孩子的示例:
void write_to_conin(PCWSTR msg)
{
if (ULONG len = (ULONG)wcslen(msg))
{
if (INPUT_RECORD* lpBuffer = new INPUT_RECORD[len])
{
INPUT_RECORD* pir = lpBuffer;
ULONG n = len;
do
{
WCHAR UnicodeChar = *msg++;
WORD wVirtualKeyCode = UnicodeChar;
DWORD dwControlKeyState = CAPSLOCK_ON;
if ((USHORT)(UnicodeChar - 'a') <= (USHORT)('z' - 'a'))
{
dwControlKeyState = 0;
wVirtualKeyCode &= ~0x20;
}
pir->Event.KeyEvent.bKeyDown = TRUE;
pir->Event.KeyEvent.dwControlKeyState = dwControlKeyState;
pir->Event.KeyEvent.wRepeatCount = 1;
pir->Event.KeyEvent.uChar.UnicodeChar = UnicodeChar;
pir->Event.KeyEvent.wVirtualKeyCode = wVirtualKeyCode;
pir->Event.KeyEvent.wVirtualScanCode = (WORD)MapVirtualKey(wVirtualKeyCode, MAPVK_VK_TO_VSC);
pir++->EventType = KEY_EVENT;
} while (--n);
HANDLE hcon = CreateFileW(L"CONIN$", FILE_GENERIC_WRITE, FILE_SHARE_VALID_FLAGS, 0, OPEN_EXISTING, 0, 0);
if (hcon != INVALID_HANDLE_VALUE)
{
WriteConsoleInput(hcon, lpBuffer, len, &n);
CloseHandle(hcon);
}
delete [] lpBuffer;
}
}
}