【发布时间】:2017-05-07 19:59:38
【问题描述】:
我正在尝试使用 Win API ReadConsole(...),并且我想传入一个分隔符来停止来自控制台的输入。
下面的代码有效,但它只停止读取\r\n 上的输入。
例如,我希望它停止读取 '.' 上的控制台输入。
void read(char *cIn, char delim)
{
HANDLE hFile;
DWORD charsRead;
DWORD charsToRead = MAX_PATH;
CONSOLE_READCONSOLE_CONTROL cReadControl;
cReadControl.nLength = sizeof(CONSOLE_READCONSOLE_CONTROL);
cReadControl.nInitialChars = 0;
cReadControl.dwCtrlWakeupMask = delim;
cReadControl.dwControlKeyState = NULL;
DWORD lpMode;
// char cIn[MAX_PATH]; //-- buffer to hold data from the console
hFile = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
GetConsoleMode(hFile,&lpMode);
// lpMode &= ~ENABLE_LINE_INPUT; //-- turns off this flag
// SetConsoleMode(hFile, lpMode); //-- set the mode with the new flag off
bool read = ReadConsole(hFile, cIn, charsToRead * sizeof(TCHAR), &charsRead, &cReadControl);
cIn[charsRead - 2] = '\0';
}
我知道还有其他简单的方法可以做到这一点,但我只是想了解一些 win api 函数以及如何使用它们。
谢谢。
【问题讨论】:
-
如果您想要完整的控制台输入并获得有关按下任何键的信息,就在按下时(但不等待 VK_RETURN),您需要使用 ReadConsoleInput i> 而不是 ReadConsole
-
@RbMm 谢谢,这很有帮助。