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

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

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

Студворк — интернет-сервис помощи студентам
Всем привет!
Вот решил с винды перебраться на линукс, начал кодить в нём на Си++.
Но столкнулся с проблемойююю Мне надо написать программу, которая считывает коды клавиш и выводит на экран инфо о нажатой клавише. Но т.к. в линуксе нет getch(), я даже не знаю с какой стороны подступиться.
Что можете посоветовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.06.2010, 13:18
Ответы с готовыми решениями:

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

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

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

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

Решение

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  [ТС]
Конечно спасибо! Но это не то...
Эта программа ожидает нажатия клавиши Enter, а в таком случае проще использовать getchar().
Мне надо чтобы сразу после нажатия клавиши выводилась инфо о ней, без нажатия на Enter.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
02.06.2010, 19:07
Цитата Сообщение от AlexSMG Посмотреть сообщение
Эта программа ожидает нажатия клавиши Enter
А Вы точно эту программу компилировали и запускали?
1
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
02.06.2010, 19:09
AlexSMG, смотри в сторону ncurses.
0
52 / 52 / 10
Регистрация: 25.05.2010
Сообщений: 182
02.06.2010, 19:20
в моём линуксе есть getch, я видимо что-то делаю не так ?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
03.06.2010, 01:18
Цитата Сообщение от AlexSMG Посмотреть сообщение
Эта программа ожидает нажатия клавиши Enter
а подумать, прежде чем говорить глупости, вас не учили?

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

Решение

После долгого бороздования просторов гугла таки нашел толковый ответ на данный вопрос, сам пока мало чего понимаю, но факт остается фактом, что бы у вас работала данная функция стоит подключить
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
 Аватар для makkabi
10 / 10 / 3
Регистрация: 05.12.2009
Сообщений: 152
22.05.2011, 22:30
не компилируется нифига

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
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
23.05.2011, 01:15
Цитата Сообщение от makkabi Посмотреть сообщение
не компилируется
походу, только у тебя
0
0 / 0 / 1
Регистрация: 27.08.2012
Сообщений: 5
27.08.2012, 13:54
Пробовал скомпилировать этот код
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
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2012, 13:55
Цитата Сообщение от Kales Посмотреть сообщение
этот код
какой "этот"? их тут много.
0
0 / 0 / 1
Регистрация: 27.08.2012
Сообщений: 5
27.08.2012, 14:02
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

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
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2012, 14:03
так это же с++ код, а ты пытаешься скомпилить его в Си режиме.
0
0 / 0 / 1
Регистрация: 27.08.2012
Сообщений: 5
27.08.2012, 14:08
gcc -std=c90 -o test test.c не правильно писать?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
27.08.2012, 14:09
Цитата Сообщение от Kales Посмотреть сообщение
-std=c90
это указание компилятору использовать Си режим, да еще и стандарта 90го года.
вот код: http://liveworkspace.org/code/... 4eafaea58b
как видишь, компилится.
0
0 / 0 / 1
Регистрация: 27.08.2012
Сообщений: 5
27.08.2012, 14:11
gcc сам говорит так писать) я ему доверяю больше чем себе.
В любом случае, напишешь, как надо?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.08.2012, 14:11
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru