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