Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

RedConsoleInput?

Привет всем!
Такой код:

void main()
{
HANDLE h=GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD rec;
DWORD w;

while(1)
{
ReadConsoleInput(h,&rec,1,&w);

if(w>=1 && rec.EventType == KEY_EVENT)
if(rec.Event.KeyEvent.bKeyDown==true)
cout<<"yes!"<<endl;

cout<<"NO!";
Sleep(10);
}
}

Должно выводиться "NO!" в строчку, пока не нажимается клавиша на
клавиатуре. Если нажата, то "Yes!" и пережод на новую строку.
А получается вот так:

"NO!""yes!"
"NO!""NO!""yes!"
"NO!""NO!""yes!"
"NO!""NO!""yes!"
"NO!""NO!""yes!"
"NO!""NO!"_

Одним словом он проходит всего два раза, и стаи на функции
ReadConsoleInput(h,&rec,1,&w);
Зато когда я трогаю мышку, он начинает лихорадочно писать "NO!" (как и
должно быть...)
Я уже все пробовал. Помогите, пожалйста...
На комбинацию If - оф не смотрите, я их переставлял сто раз. Проблема
в том, что он вообще останавливается...

Velora
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 21 Jan 2004 18:13:46 +0200 (#60311)

 

Ответы:

Hello Velora,

Wednesday, January 21, 2004, 7:13:46 PM, you wrote:



хм.. а цикл ведь бесконечный...

Ответить   haa***@n*****.ru Wed, 21 Jan 2004 19:23:47 +0300 (#60328)

 

Нет! Крайне желательно всегда ставить MSDN - избежишь уймы
проблем и потери времени.
ReadConsoleInput не возвращает управление, пока не
появится хоть какое-нибудь событие.

Это не проблема. Это логичное и, по-моему, очень удобное
поведение. Если тебе так уж хочется сделать бесконечный
цикл есть по меньшей мере два варианта:
1. использовать что-нибудь вроде WaitForSingleObject с указанием
дескриптора от GetStdHandle и нулевого таймаута; по
возвращаемому значению определять факт
наличия событий
2. вызывать GetNumberOfConsoleInputEvents; это,
правда, я никогда не пробовал

PS. Где-то у меня валялись примеры использования
некоторых консольных функций. На Delphi и C.
Если хочешь, брошу на мыло.
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 22 Jan 2004 09:35:25 +0300 (#60651)

 

Hello Velora,

Программа работает совершенно логично, как написано, если надо сначала
перевести строку а потом вывести YES то наверное правильно записать
cout<<endl<<"yes!";

Ответить   bvb Thu, 22 Jan 2004 19:23:17 +0500 (#61067)

 

Hello Velora,

Wednesday, January 21, 2004, 7:13:46 PM, you wrote:



ReadInputConsole - ждет(!!!) пока не произойдет какое-нибудь событие,
такое как нажатие клавиатуры или дрыганья мышью.

void main()
{
HANDLE h=GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD rec;
DWORD i,w;

while(1)
{
GetNumberOfConsoleInputEvents(h,&w)
for(i=0;i<w;i++)
{
ReadConsoleInput(h,&rec,1,NULL);
if((rec.Event.KeyEvent.bKeyDown==true)&&(rec.EventType == KEY_EVENT))
cout<<"yes!"<<endl;
cout<<"NO!";
Sleep(10);
};
}
}

Ответить   Havoc Fri, 23 Jan 2004 20:42:04 +0300 (#62039)