IPB
ЛогинПароль:

> 

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

 
 Ответить  Открыть новую тему 
> Считать комбинацию клавиш.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


Бодрого дня, господа.
Подскажите, пожалуйста, как в программе можно считать комбинацию клавиш? Т. е., например, Ctrl+N, Alt+Q и прочая.
При этом в то же самое время может быть и только одна клавиша, например, F1 или F2 и т. д.

PS. FreePascal.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 23
Пол: Мужской

Репутация: -  0  +


Я прошу прощения - не совсем точно или совсем не точно я выразился.
Необходимо на разные клавиши/сочетания клавиш "навесить" разные действия.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Большевик–концептуал
***

Группа: Пользователи
Сообщений: 160
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: octagram@jabber.ru
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +


Надо уточнить, какой интерфейс, текстовый или графический, и операционка. В текстовом интерфейсе в Windows дела получше. Windows берёт преемственность от DOS. В DOS отличить Ctrl+Alt+F7 от Alt+Shift+F7 или других забористых комбинаций никогда особой проблемой не было, состояние модификаторов можно было считать из BIOS. Вот правый Alt от левого Alt отличить уже было сложнее. BIOS позволял отличить правый и левый Shift, но Ctrl и Alt перекрывались левый и правый, и чтобы их отличить, надо было навесить собственный обработчик прерываний. В Windows эти проблемы порешали революционным путём, ввели совершенно новое WinAPI для консоли, и хоть какие там комбинации клавиш, как само собой разумеющееся, можно читать.

В Linux революций не было. Там тащится какое-то невероятной древности наследие. Meta? Hyper? Ээээ… что? 23 года программирую, но никаких Meta и Hyper никогда на клавиатурах не видел, а берёшь Linux, man к нему, API к нему, и вот оно там. Ну это что-то, по всей видимости, подревнее DOS будет, а модуль Crt в Turbo Pascal, и его аналог в Free Pascal, они же, соответственно, под DOS подогнаны. То, что было само собой разумеющееся в DOS, попало в Crt.

Вот только терминал в Linux до сих пор не смогли сделать не хуже, чем хотя бы DOS и BIOS были 20 лет назад, и отличить Ctrl+Alt+F7 от Alt+Shift+F7 — это едва досягаемые вершины шаманства. Да что там Ctrl+Alt+F7, банальный Delete-то не любой дистрибутив «позитивной» (адвокаты POSIX настаивают на прочтении ПОЗИКС, потому что позитив) операционки из коробки был способен различить. Нажмёшь Delete, получишь пик и тильду. Какая-то Escape-последовательность не распозналась, из-за этого терминал пищит. Но после того, как Escape-последовательность перестала пытаться быть распознанной, там ещё тильда в конце последовательности, и она распознаётся, будто тильду захотел написать.

Во-первых, разные терминалы шлют разные Escape-последовательности, и termcap с горем пополам только их распознаёт. Во-вторых, некоторые нажатия проецируются в идентичные Escape-последовательности, и их стандартными средствами не отличить. Только шаманством.

Шаманством заниматься приходится в первую очередь файловым менеджерам, там всякие разные кнопки в первую очередь надо навешивать для быстрой навигации. В проекте переноса FAR на Linux просто забили на этот ублюдочный терминал и сделали графическое приложение, которое само рисует себе текстовую сетку, а графическое приложение через X11 может посмотреть модификаторы, да и события клавиш другие приходят. Так же может поступить wineconsole. Wineconsole можно попытаться запустить в ублюдочном стандартном терминале, а можно тоже попросить нормальный графический, и в этом графическом не пищать как полудурок от каждого делита, не писать тильды и не придавать какие-то новые неожиданные смыслы клавише Escape.

Наиболее продвинулся в поддержке именно стандартного ублюдочного терминала Midnight Commander. Чтобы этого достичь, он умеет у некоторых терминалов через ioctl выпытывать состояние модификаторов, особенно это касается не-X11 консолей. Вот когда режим экрана натурально текстовый, не VGA, не SVGA, там как раз такой терминал. А если нет, то остаётся попробовать подключиться к X11. Да, Midnight Commander — это X11 клиент. Он ничего не рисует, подключается к X11 только чтоб надёжно понимать состояние модификаторов. И всё равно это не вполне получается. В настройках MC можно поднастроить распознавание клавиш, мне приходилось это делать. В общем, невероятно сложно сделать хорошо.

Как общий принцип, требуется библиотеки termcap/terminfo. Это базы данных, которые с горем пополам, но всё же лучше, чем полный туман, знают, какие терминалы производят какие Escape-последовательности. Как-то, работая с ними, можно уметь распознавать клавиши.

Есть гипотеза, что во Free Pascal модуль Crt для совместимости с перенесёнными из DOS программами (а зачем ещё он нужен, этот Crt, в FPC) уже и так работает с ncurses или с terminfo/termcap, распознаёт клавиши ими, а потом пихает в собственный буфер, так что если читать нажатия через ReadKey, результат будет как в DOS. По ссылке есть табличка.

Чтоб что-то навесить, можно устроить цикл repeat с выходом по условию, хранящемуся в логической переменной. В цикле читать клавиши, например, ReadKey, и обрабатывать их. В DOS специальные клавиши производили либо значения из множества #1 … #31 (до пробела #32, кроме нуля #0), либо #127, кажется, Ctrl+Delete, анклавом таким был. Либо #0, а следующий ReadKey возвращает произвольный код, например, безобидную букву H в верхнем регистре. #0, 'H' соответствует нажатию какой-то стрелки. Поэтому #0 надо обрабатывать особо. Либо Crt.ReadKey, либо termcap/terminfo, либо, может быть, через ncurses можно насквозь с клавиатурой взаимодействовать. Либо делать собственное подобие терминала. Либо, может быть, воспользоваться другим терминалом. Например, чтобы запустить программу в wineconsole, она не обязана быть для Windows. Она может быть скомпилирована с использованием WinAPI от Wine, которые по части консоли уж всяко получше того дна, что представляет собой терминал Linux.

Ещё есть возможность использовать PDCurses, замену ncurses. Кажется, там есть возможность сделать свой терминал в X11.


--------------------
If you want to get to the top, you have to start at the bottom
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.08.2019 12:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name