Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.72/117: Рейтинг темы: голосов - 117, средняя оценка - 4.72
0 / 0 / 1
Регистрация: 09.04.2010
Сообщений: 14
1

Считать коды клавиш и вывести на экран информацию о нажатой клавише

02.06.2010, 13:18. Показов 23037. Ответов 27
Метки нет (Все метки)

Всем привет!
Вот решил с винды перебраться на линукс, начал кодить в нём на Си++.
Но столкнулся с проблемойююю Мне надо написать программу, которая считывает коды клавиш и выводит на экран инфо о нажатой клавише. Но т.к. в линуксе нет getch(), я даже не знаю с какой стороны подступиться.
Что можете посоветовать?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2010, 13:18
Ответы с готовыми решениями:

Считать информацию из файла и вывести на экран
Можете дать простой пример в Си. 1) Надо открыть файл с записями в .txt файле и вывести на экран...

Считать информацию из текстового файла и вывести ее на экран
Есть такой текстовый файл: а.txt 2.617917 -0.865987 2.814260 -0.946903 3.010604 -0.991433...

Получить коды нажатой клавиши и вывести в Label
Здравствуйте, такой вопрос: 1.как получить коды(Unicode и ASCII) нажатой клавиши(вывести их...

Информация о нажатой на клавиатуре клавише
Всем привет! Я только начинаю изучать язык C# и не очень еще понимаю, как решать некоторые задачи....

27
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
02.06.2010, 14:13 2
Лучший ответ Сообщение было отмечено как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <sys/ioctl.h>
 
struct TerminalOpt {
    TerminalOpt() {
        termios new_settings;
        tcgetattr(0,&stored_settings);
        new_settings = stored_settings;
        new_settings.c_lflag &= (~ICANON);
        new_settings.c_cc[VTIME] = 0;
        new_settings.c_cc[VMIN] = 1;
        tcsetattr(0,TCSANOW,&new_settings);
    }
    ~TerminalOpt() {
        tcsetattr(0,TCSANOW,&stored_settings);
    }
    termios stored_settings;
};
 
int main() {
   TerminalOpt term;
 
   for ( char ch = 0; (ch=getc(stdin)) != 'q'; ) {
      fprintf(stdout, "pressed \"%c\"", ch);
   }
 
   return 0;
}
3
0 / 0 / 1
Регистрация: 09.04.2010
Сообщений: 14
02.06.2010, 19:03  [ТС] 3
Конечно спасибо! Но это не то...
Эта программа ожидает нажатия клавиши Enter, а в таком случае проще использовать getchar().
Мне надо чтобы сразу после нажатия клавиши выводилась инфо о ней, без нажатия на Enter.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11130 / 7075 / 1671
Регистрация: 25.07.2009
Сообщений: 12,927
02.06.2010, 19:07 4
Цитата Сообщение от AlexSMG Посмотреть сообщение
Эта программа ожидает нажатия клавиши Enter
А Вы точно эту программу компилировали и запускали?
1
Почетный модератор
7386 / 2632 / 280
Регистрация: 29.07.2006
Сообщений: 13,696
02.06.2010, 19:09 5
AlexSMG, смотри в сторону ncurses.
0
52 / 52 / 10
Регистрация: 25.05.2010
Сообщений: 182
02.06.2010, 19:20 6
в моём линуксе есть getch, я видимо что-то делаю не так ?
0
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.06.2010, 01:18 7
Цитата Сообщение от AlexSMG Посмотреть сообщение
Эта программа ожидает нажатия клавиши Enter
а подумать, прежде чем говорить глупости, вас не учили?

Добавлено через 1 минуту
Цитата Сообщение от Vourhey Посмотреть сообщение
смотри в сторону ncurses.
во имя чего?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11130 / 7075 / 1671
Регистрация: 25.07.2009
Сообщений: 12,927
03.06.2010, 01:51 8
Цитата Сообщение от time2die Посмотреть сообщение
я видимо что-то делаю не так ?
Ага... Вместо conio.h включаете curses.h
0
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.06.2010, 02:10 9
easybudda, дело даже не в этом... а в том, что в линукс, консоль в каноническом режиме
0
0 / 0 / 1
Регистрация: 09.04.2010
Сообщений: 14
03.06.2010, 09:18  [ТС] 10
Цитата Сообщение от niXman Посмотреть сообщение
а подумать, прежде чем говорить глупости, вас не учили?
Ну вообще я сначала попробовал откомпилировать, а потом запустить, работаю в Eclipse IDE for C/C++ Developers.
После стольких недоумений, попробовал откомпилить с помощью gcc в терминале и запустить, там все корректно работает... Ни кто не сможет объяснить почему?
0
34 / 34 / 9
Регистрация: 19.03.2010
Сообщений: 136
31.03.2011, 03:08 11
Лучший ответ Сообщение было отмечено как решение

Решение

После долгого бороздования просторов гугла таки нашел толковый ответ на данный вопрос, сам пока мало чего понимаю, но факт остается фактом, что бы у вас работала данная функция стоит подключить
C
1
2
3
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
и объявить функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
int getch( ) {
struct termios oldt,
newt;
int ch;
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;
}
Принцип работы на сколько мне удалось протестить тот же, к тому же все идет стандартное и с ncurses мучаться не нужно.
5
10 / 10 / 3
Регистрация: 05.12.2009
Сообщений: 152
22.05.2011, 22:30 12
не компилируется нифига

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct TerminalOpt {
        TerminalOpt() {
                termios new_settings;
                tcgetattr(0,&stored_settings);
                new_settings = stored_settings;
                new_settings.c_lflag &= (~ICANON);
                new_settings.c_cc[VTIME] = 0;
                new_settings.c_cc[VMIN] = 1;
                tcsetattr(0,TCSANOW,&new_settings);
        }
        ~TerminalOpt() {
                tcsetattr(0,TCSANOW,&stored_settings);
        }
        termios stored_settings;
};
здесь однозначно касяк
0
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
23.05.2011, 01:15 13
Цитата Сообщение от makkabi Посмотреть сообщение
не компилируется
походу, только у тебя
0
0 / 0 / 1
Регистрация: 27.08.2012
Сообщений: 5
27.08.2012, 13:54 14
Пробовал скомпилировать этот код
1) посоветовал компилятор использовать стандарт c90
воспользовался советом, но ошибки остались.
Говорит TerminalOpt undeclared (first use in this function)
2) Думал, что дело в библиотеках, просмотрел их - там все в норме,
3) попытался заменить
#include <termios.h>
#include <sys/ioctl.h>
на
#include <termio.h>
4) как только не пытался декларировать по зависимостям - ноль эффекта

Может кто подсказать мне, в чем может быть дело? Буду чрезмерно признателен, так как не хочу пользоваться curse.h, мне кажется этот вариант симпатичнее. Гранд респект)
0
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2012, 13:55 15
Цитата Сообщение от Kales Посмотреть сообщение
этот код
какой "этот"? их тут много.
0
0 / 0 / 1
Регистрация: 27.08.2012
Сообщений: 5
27.08.2012, 14:02 16
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <sys/ioctl.h>
 
struct TerminalOpt {
    TerminalOpt() {
        termios new_settings;
        tcgetattr(0,&stored_settings);
        new_settings = stored_settings;
        new_settings.c_lflag &= (~ICANON);
        new_settings.c_cc[VTIME] = 0;
        new_settings.c_cc[VMIN] = 1;
        tcsetattr(0,TCSANOW,&new_settings);
    }
    ~TerminalOpt() {
        tcsetattr(0,TCSANOW,&stored_settings);
    }
    termios stored_settings;
};
 
int main() {
   TerminalOpt term;
 
   for ( char ch = 0; (ch=getc(stdin)) != 'q'; ) {
      fprintf(stdout, "pressed \"%c\"", ch);
   }
 
   return 0;
}
0
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2012, 14:03 17
так это же с++ код, а ты пытаешься скомпилить его в Си режиме.
0
0 / 0 / 1
Регистрация: 27.08.2012
Сообщений: 5
27.08.2012, 14:08 18
gcc -std=c90 -o test test.c не правильно писать?
0
Эксперт С++
3210 / 1458 / 73
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2012, 14:09 19
Цитата Сообщение от Kales Посмотреть сообщение
-std=c90
это указание компилятору использовать Си режим, да еще и стандарта 90го года.
вот код: http://liveworkspace.org/code/... 4eafaea58b
как видишь, компилится.
0
0 / 0 / 1
Регистрация: 27.08.2012
Сообщений: 5
27.08.2012, 14:11 20
gcc сам говорит так писать) я ему доверяю больше чем себе.
В любом случае, напишешь, как надо?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.08.2012, 14:11
Помогаю со студенческими работами здесь

Как программно послать сообщение форме, о нажатой клавише?
Например, с такими параметрами &quot;message = WM_KeyDown, wParam = VK_UP&quot;.

Как отследить клик мыши при нажатой клавише Ctrl?
Всем здравствуйте. Нужно выполнить команду только в том случае, если пользователь кликнул по...

Держать мышку в одном положении при нажатой левой клавише мыши
Нужен код для копки, который будет запускать программу которая в свою очередь будет держать мышку в...

Вывести коды сканирования клавиш до тех пор, пока не будет нажата клавиша Esc
Написать программу, которая читает и выводит коды сканирования клавишей до тех пор, пока не будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru