Ввод символов
От: LegionRoka  
Дата: 27.03.04 15:05
Оценка:
Как можно написать на С так чтоб вовермя ввода ряд символов например спомощью getche(); то если вдруг я бы нажал F1 то програма закочила бы ввод и начала делать что-то другое, а если это был не F1 то програма продолжыла бы приниать символы. Может надо использават не эту фунлцию. А какую и как?
Re: Ввод символов
От: Alexander_S_U https://github.com/alexanders-code/cmdxmlinstaller
Дата: 28.03.04 09:11
Оценка:
Здравствуйте, 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в не бывает.
https://github.com/alexanders-code/cmdxmlinstaller
Re: Ввод символов
От: _joker Россия  
Дата: 28.03.04 14:23
Оценка:
Здравствуйте, LegionRoka, Вы писали:

по нажатию на эти кнопки в буфер клавы заносится похоже по 2 байта
поэтому вызывать надо _getch() два раза
... << RSDN@Home 1.1.3 stable >>
Re: Ввод символов
От: RvRom  
Дата: 28.03.04 15:53
Оценка:
Здравствуйте, LegionRoka, Вы писали:

LR>Как можно написать на С так чтоб вовермя ввода ряд символов например спомощью getche(); то если вдруг я бы нажал F1 то програма закочила бы ввод и начала делать что-то другое, а если это был не F1 то програма продолжыла бы приниать символы. Может надо использават не эту фунлцию. А какую и как?


к сожалению, не помню точно функцию, которая возвращает скан код нажатой клавиши.
getche в этом не годится, так как она только символы возвращает, а ф1 и тд не ловит...
и должна быть структура, типа

enum Key
{
 int scancode;
 unsigned char key[2];
}

в младщем чаре будут лежать функциональные клавиши, а в старшем символы...

постараюсь вспомнить эту функцию...
Re[2]: Ввод символов
От: RvRom  
Дата: 28.03.04 16:07
Оценка:
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);

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.