Как проверить, есть ли чтото в буфере ввода клавиатуры?

vertyal17

Всем привет
Вобщем столкнулся с такой проблемой:
Вот моя программа KEY: (здесь практически весь текст программы, нет только без шапки)

char buf[80];
while (1)
{
if (kbhit
{
char c;
c=getch;
printf("BUTTON %c!\n",c);
if (c=='r')
{
printf("\nENTED STRING\n");
scanf("%s",buf);
printf("String %s\n",buf);

}
fflush(stdout);
}
}

Все работает, но есть GUI программа, которая запускает программу KEY, перенаправляя поток ввода (с помощью Pipe). При этом, при нажатии кнопки 'SEND' в GUI, в пайп посылается строка "qwertest\n"
Вот тут прикол:
Оказывается функции getch и kbhit работают не с потоком ввода. Запущенная из GUI, программа KEY исправно ловит все нажатия клавишы, и выдает отчет на экран. Но если нажать клавишу 'r', то программа запрашивает строку - и после этого уже не чувствует клавиатуру. Зато если нажать 'send' в программе GUI, она отрапортует что приняла
"qwertest".
А хотелось бы, чтобы программа KEY при запуске из GUI вообще забывала и не ощущала клавиатуру, и при нажатии 'send', рапортовала бы о 'q','w','e',"test".
Вобщем функции getch и kbhit не подходят, нужен способ узнать есть ли чтото в STDIN.

vertyal17

Попробовал написать собственную прожку:

BOOL m_keypr
{
HANDLE m_stdin;
DWORD m_bytes_avail=0;

m_stdin=GetStdHandle(STD_INPUT_HANDLE);

if (PeekNamedPipe(m_stdin, NULL, 0, NULL, &m_bytes_avail, NULL
{
if (m_bytes_avail>0) return TRUE;
}
return FALSE;
};

Не работает (PeekNamedPipe всегда возвращает ошибку "номер 6").
Если заменить на ReadFile, то основная программа, при обрщении к m_keypr, останавливает работу до тех пор, пока в буфере не появится чтото, с '\n' на конце (чтото типа блокирующего чтения).

Dasar

на C пишешь или на C++?

vertyal17

Visual C++

Dasar

так пиши тогда cin.peek

vertyal17

попробовал, тоже блокирует программу до тех пор, пока в буфере чегонибудь не появится

vertyal17

UP

maggi14

я помню, в досе был соответствующий флаг. Собсна, он был не в досе, а вообще на х86, но я не уверен и даже сомневаюсь, что он будет работать в винде. Если думаешь, что это может помочь, я поищу в своих паскалевских прогах.

Elina74

в borland c++ 3.1 была такая функция bioskey
она могла возвращать некое значение, которое означало, что в буфере клавы что-то есть. А потом с помощью той же ф-ции можно это "что-то" считать.
Никаких пауз и ожиданий эта ф-ция не делает.

gusli

Могу с большой степенью точности предположить, что значение свое эта функция брала из блока памяти 0x0040:xxxx

evgen5555

Двадцатый раз читаю и не понимаю постановки задачи.

vertyal17

Проверить неблокирующим образом, есть ли чтолибо в stdin ?
Оставить комментарий
Имя или ник:
Комментарий: