Russian Qt Forum

Программирование => С/C++ => Тема начата: reD_Rus от Ноябрь 17, 2008, 15:57



Название: Просмотреть коды клавиш
Отправлено: reD_Rus от Ноябрь 17, 2008, 15:57
Хотелось бы посмотреть на коды клавиш сразу после нажания,
но показывает коды не сразу после нажатия, а только после того как нажму enter, сразу для всей кучи нажатых клавиш.
Код:
#include <QtCore/QCoreApplication>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int code = 0;
while (code !=10) {
code = getchar();
printf("%d\n", code);
}
return EXIT_SUCCESS;
}


Название: Re: Просмотреть коды клавиш
Отправлено: reD_Rus от Ноябрь 18, 2008, 12:48
Поробывал так
Код:
#include <QtCore/QCoreApplication>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define ESC 27

int main(int argc, char *argv[])
{
int c;
while (c != ESC) {
c = getch();
printf("Key \"%c\" = Code \"%d\"\n", c, (int)c);
}
return EXIT_SUCCESS;
}
получилось, но только на виндулсе. на линупсе сыпится с ошибками.


Название: Re: Просмотреть коды клавиш
Отправлено: pastor от Ноябрь 18, 2008, 14:04
getch() не входит в стандарт C, в линуксе ты его не найдешь. В винде эта функция есть в conio.h. Остальные извесные функции такие как getchar, cin требуют подтверждения ввода (нажатия Enter). Попробуй такой вот код:

Код:
#include <stdio.h>

#ifndef __linux
#include <conio.h>
#else
#include <unistd.h>
#include <termios.h>

int getch()
{
    int ch;
    struct termios oldt, newt;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}
#endif

int main(int argc, char *argv[])
{
    char ch;

    while (ch !=27) {
        ch = getch();
        printf("Key %c code %d\n", ch, ch);
    }

    return 0;
}

ЗЫ: Эта тема не имеет никакого отношения к Qt. Переношу её в раздел С\С++


Название: Re: Просмотреть коды клавиш
Отправлено: reD_Rus от Ноябрь 18, 2008, 15:58
Спасибо заработало, почему я постил в Qt форуме просто я на QtCreatore собираю -)

Только непонятен момент с
Код:
Key v code 118
Key j code 106  // буржуинская буква
Key � code -48
Key � code -71 // а на рускую "й" две строки
это получается у русских букв минусовой код?


Название: Re: Просмотреть коды клавиш
Отправлено: xintrea от Ноябрь 18, 2008, 16:40
Спасибо заработало, почему я постил в Qt форуме просто я на QtCreatore собираю -)

Только непонятен момент с
Код:
Key v code 118
Key j code 106  // буржуинская буква
Key � code -48
Key � code -71 // а на рускую "й" две строки
это получается у русских букв минусовой код?

Это видимо особенности взаимодействия данной программы с локалью UTF-8 (у тебя же UTF-8, не так ли?). Имеется в виду значки вместо букв и две строки для "й". У меня локаль KOI8-R, в ней всё нормально

Код:
Key a code 97
Key b code 98
Key c code 99
Key й code -54
Key ё code -93
Key а code -63
Key б code -62
Key в code -41


Название: Re: Просмотреть коды клавиш
Отправлено: pastor от Ноябрь 18, 2008, 16:52
Знак "-" очевидно потому что идет переполнение типа char. Попробуй изменить код вот так:

Код:
......

int main(int argc, char *argv[])
{
    int ch;                      // <--- вот эту строку

    while (ch !=27) {
        ch = getch();
        printf("Key %c code %d\n", ch, ch);
    }

    return 0;
}


Название: Re: Просмотреть коды клавиш
Отправлено: pastor от Ноябрь 18, 2008, 16:54
почему я постил в Qt форуме просто я на QtCreatore собираю -)

я пишу прогу на С\С++ в простом текстовом редакторе, комилю с консоли, куда мне постить вопросы? ;) Думаю намек понятен ))


Название: Re: Просмотреть коды клавиш
Отправлено: reD_Rus от Ноябрь 18, 2008, 16:55
да , локаль у меня utf8

с буквой "й" стало по лучше
Key � code 208
Key � code 185
но все равно крозяблы


Название: Re: Просмотреть коды клавиш
Отправлено: xintrea от Ноябрь 18, 2008, 17:12
да , локаль у меня utf8

с буквой "й" стало по лучше
Key � code 208
Key � code 185
но все равно крозяблы

Ну тут то тебе Qt и поможет.

попробуй воспользоваться функций QChar QChar::fromAscii ( char c ).

То есть вместо

Код:
printf("Key %c code %d\n", ch, ch);

напиши что-то в стиле

Код:
qDebug() << "Key " << QChar::fromAscii( (char)ch ) << " code " << ch;


UPD: Не, щас проверил - не прокатит, всетаки Ascii - это первые 128 символов, а не все 256.

Ну тогда ничего не остается как задать QTextCodec::codecForLocale(), а потом преобразовывать символ в сишную строку ( char s[2];s[0]=key;s[1]=0;); ) и после этого QString QString::fromLocal8Bit ( const char * str, int size = -1 ).

Единственная проблема - понять в какой кодировке захватываются символы, чтоб настроить QTextCodec. То что для одних символов идет одинарный код, а для других - двойной, меня не удивляет, ибо ты работаешь фактически со скан кодами напрямую. А вот как такие вещи преобразовывать в обычную однобайтовую кодировку - подсказать не могу.


Название: Re: Просмотреть коды клавиш
Отправлено: Tonal от Ноябрь 19, 2008, 11:58
В UTF-8 символ представлен последовательностью байт длинной от 1 до 6 (UTF-8]http://ru.wikipedia.org/wiki/UTF-8]UTF-8 (http://ru.wikipedia.org/wiki/UTF-8))
Так что getch вполне может выдавать последовательность побайтово - на этот счёт нужно смотреть доки и рыть интернет.

А со сканкодами можно работать или из голого ДОС-а по прерываниям, либо из драйвера клавиатуры, либо обращаясь к платформенному API (WinApi для винды или termios на никсах)


Название: Re: Просмотреть коды клавиш
Отправлено: xintrea от Ноябрь 19, 2008, 19:24
В UTF-8 символ представлен последовательностью байт длинной от 1 до 6 (UTF-8]http://ru.wikipedia.org/wiki/UTF-8]UTF-8 (http://ru.wikipedia.org/wiki/UTF-8))
Так что getch вполне может выдавать последовательность побайтово - на этот счёт нужно смотреть доки и рыть интернет.

Ну в UTF-8 символы кириллицы обнобайтовыми вроде как не бывают. А у товарища - однобайтовые коды, только "й" двухбайтовая. Это на UTF-8 не похоже. Так что getch() явно не в UTF-8 коды возвращает.

Тут видимо имеем не полную обработку сканкодов внутри getch(), есть видимо какие-то особенности, которые не учитываются.


Название: Re: Просмотреть коды клавиш
Отправлено: Tonal от Ноябрь 20, 2008, 11:34
Ещё раз, скан-коды клавиш обрабатывает драйвер клавиатуры а getch возвращает уже то, что ему отдал системный вызов.
Кроме того, на него скорее всего влияет ещё и текущая локаль установленная в программе.
Так что не смешивай понятия.
Нужно копать маны что же и как оно возвращает в таких случаях.
начать можно отсюда: http://www.cl.cam.ac.uk/~mgk25/unicode.html