gpt4 book ai didi

c++ - 使用重定向标准输入处理子进程中的 kbhit

转载 作者:可可西里 更新时间:2023-11-01 11:43:41 32 4
gpt4 key购买 nike

我编写了一个启动另一个进程并使用 Windows API(CreateProcess、CreatePipe 等)将其标准 I/O 重定向到管道的程序

该程序应启动多个不同的控制台程序并使用 stdio 与它们通信。

这一切都运行良好(我可以写入进程的标准输入并使用管道从进程中读取)直到我尝试启动并与使用 kbhit 的程序通信。

为了简化我想开始的程序对标准输入的处理:

while(1)
{
if(kbhit())
{
fgets(line, sizeof(line), stdin);
//do something with line
}
Sleep(100);
}

结果是 fgets 永远不会被调用,因为 kbhit 不会返回 true,即使我已经写入了我已将 stdin 重定向到的管道。我知道,因为我已经调试到另一个程序。我试图删除 kbhit 的调用,然后它确实有效,但我无法更改该代码。

有没有办法向进程发送一些东西,以便子进程中的 kbhit 返回 true?

最佳答案

_kbhit函数检查控制台 是否有最近的击键。它从不检查标准输入,而是打开 CONIN$(控制台输入)并始终从此处读取。

所以在这里重定向标准输入什么都不给。如果我们与 child 共享同一个控制台,我们可以使用 WriteConsoleInput为了这个任务。将字符串写入 child 的示例:

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;
}
}
}

关于c++ - 使用重定向标准输入处理子进程中的 kbhit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52167711/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com