Как можно написать на С так чтоб вовермя ввода ряд символов например спомощью getche(); то если вдруг я бы нажал F1 то програма закочила бы ввод и начала делать что-то другое, а если это был не F1 то програма продолжыла бы приниать символы. Может надо использават не эту фунлцию. А какую и как?
Здравствуйте, LegionRoka, Вы писали:
LR>Как можно написать на С так чтоб вовермя ввода ряд символов например спомощью getche(); то если вдруг я бы нажал F1 то програма закочила бы ввод и начала делать что-то другое, а если это был не F1 то програма продолжыла бы приниать символы. Может надо использават не эту фунлцию. А какую и как?
Можно спомощью getche примерно так
#include <conio.h>
#include <stdio.h>
#define F1_KEY 59
void main(void)
{
int key_kode;
while(true)
{
key_kode=getche();
if(key_kode==0 || key_kode==0xE)
{
key_kode=getche();
if(F1_KEY==key_kode)
{
printf("%s", " F1 pressed ");
break;
}
}
//do something
}
}
Функция getche считывает oдин симвoл с кoнсoли и дает эхo считаннoгo симвoла, не мoжет быть испoльзoвана для чтения CTRL+C.
При считывании функциoнальнoй клавиши или клавиши движения курсoра,getche дoлжна быть вызвана дважды. Первый вызoв вoзвращает 0 или 0xE0, а втoрoй вызoв вoзвращает фактический кoд клавиши.
Вoзвращаемoе Значение
Считанный симвoл. Ошибoчных вoзвратoв не бывает.
Здравствуйте, LegionRoka, Вы писали:
по нажатию на эти кнопки в буфер клавы заносится похоже по 2 байта
поэтому вызывать надо _getch() два раза
... << RSDN@Home 1.1.3 stable >>
Здравствуйте, LegionRoka, Вы писали:
LR>Как можно написать на С так чтоб вовермя ввода ряд символов например спомощью getche(); то если вдруг я бы нажал F1 то програма закочила бы ввод и начала делать что-то другое, а если это был не F1 то програма продолжыла бы приниать символы. Может надо использават не эту фунлцию. А какую и как?
к сожалению, не помню точно функцию, которая возвращает скан код нажатой клавиши.
getche в этом не годится, так как она только символы возвращает, а ф1 и тд не ловит...
и должна быть структура, типа
enum Key
{
int scancode;
unsigned char key[2];
}
в младщем чаре будут лежать функциональные клавиши, а в старшем символы...
постараюсь вспомнить эту функцию...
LR>>Как можно написать на С так чтоб вовермя ввода ряд символов например спомощью getche(); то если вдруг я бы нажал F1 то програма закочила бы ввод и начала делать что-то другое, а если это был не F1 то програма продолжыла бы приниать символы. Может надо использават не эту фунлцию. А какую и как?
RR>к сожалению, не помню точно функцию, которая возвращает скан код нажатой клавиши.
RR>getche в этом не годится, так как она только символы возвращает, а ф1 и тд не ловит...
RR>и должна быть структура, типа
RR>RR>enum Key
RR>{
RR> int scancode;
RR> unsigned char key[2];
RR>}
RR>
RR>в младщем чаре будут лежать функциональные клавиши, а в старшем символы...
RR>постараюсь вспомнить эту функцию...
так, воскресенье... в общем, с енум я переборщил

конечно же union надо

вот что я нашел у МС, но мне кажется, что с асемблерной вставкой они перестарались
Sample Code
int KeyPeek(void)
// Returns either the key value and scan code for that key or 0,
// indicating no key waiting.
{
union
{
int rc;
struct Key
{
char Value, ScanCode;
};
} KeyInfo;
KeyInfo.rc = 0;
_asm
{
mov AH, 01h
int 16h
jz done
mov KeyInfo.Value, AL
mov KeyInfo.ScanCode, AH
done:
}
return(KeyInfo.rc);
}