Имею два приложения.
Одно консольное, использующее как стандартные ф-ции си такие как, printf(), gets(), getchar(), так и одну нестандартную ф-цию _kbhit() (Microsoft VS 6.0), определяющую была ли нажата клавиша.
Второе приложение — графическое. Запускает из под себя консольное приложение. Использует два unnamed pipe, продключенных к стандартному вводу и выводу консольного приложения.
Стандартный ввод/вывод консольного приложения прекрасно работает.
Проблема состоит в том, что при запуске консольного приложения с перенаправленным вводом/выводом не работает его ф-ция _kbhit(), определяющая была ли нажата клавиша.
Как сделать так, чтобы консольное приложение определало, что была нажата клавиша при очередном поступленнии порции данных через unnamed pipe в стандартный ввод.
Модифицировать можно только графическое приложение.
Здравствуйте, 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% не ручаюсь, но ИМХО должно сработать.
Уф. День потратил на решение проблемы. Буду краток.
Решается это так.
1. Стандартным образом, с использованием unnaped pipes, делается перенаправление консоли консольного приложения.
2. Ожидается запуск консольного приложения и создание его консольного окна.
3. Отыскивается хэндел консольного окна hWnd=FindWindow("ConsoleClassWindow","c:\\MyApp.exe")
4. Перед посылкой в консоль очередного символа через unnaped pipe посылаем сообщение WM_KEYDOWN консольному окну SendMessage(hWnd,WM_KEYDOWN,wParam,lParam)
5. Все