Здравствуйте, far-far, Вы писали:
FF>Как сделать так, чтобы консольное приложение определало, что была нажата клавиша при очередном поступленнии порции данных через unnamed pipe в стандартный ввод.
FF>Модифицировать можно только графическое приложение.
Если посмотреть в исходниках CRT реализацию kbhit (getch.c), то можно определить, что в конце концов дело сведется к вызову PeekConsoleInput, что вполне естественнно.
Значит, надо, чтобы в нужный момент в console input buffer оказалась запись требуемого вида. Это сделает WriteConsoleInput
Вот так это можно сделать для самого себя
INPUT_RECORD ir;
HANDLE hConsole = GetStdHandle(STD_INPUT_HANDLE); // !!
ir.EventType = KEY_EVENT;
memset(&ir.Event.KeyEvent, 0, sizeof(ir.Event.KeyEvent));
ir.Event.KeyEvent.bKeyDown = TRUE;
ir.Event.KeyEvent.uChar.AsciiChar = 'A';
ir.Event.KeyEvent.wVirtualKeyCode = 'A';
DWORD dwWritten;
WriteConsoleInput(hConsole,&ir, sizeof(ir), &dwWritten);
int b = _kbhit(); // возвращает 1
Этот код надо поместить в графическое приложение в нужное место. Строчку, что я пометил !!, надо заменить. Требуется передать туда hConsole не свой (как в моем примере), а того консольного приложения, что у тебя. Как ты его получаешь — не знаю, но судя по твоему письму, он у тебя есть.
Попробуй. На 100% не ручаюсь, но ИМХО должно сработать.