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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.