Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для 9Символов
7 / 7 / 0
Регистрация: 25.03.2012
Сообщений: 72

Обработка нажатия клавиш

25.03.2012, 07:25. Показов 2621. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Я хочу написать простейшую консольную программу, в которой, для хорошего решения задачи, нужно обрабатывать нажатие клавиш (в частности нужно обрабатывать нажатие следующих клавиш: стрелок, Таb (и, возможно, других)). Как обрабатывать именно нажатие?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.03.2012, 07:25
Ответы с готовыми решениями:

Обработка не символьных клавиш
Всем привет! Разбираюсь как лучше реализовать простую вещь в консоли: нажимаем клавишу F1 - появляется справка. Вот что удалось найти...

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

Обработка нажатия клавиш
Здравствуйте. Я интересуюсь разработкой звуковых игр. Здесь я использую как игровое окно Windows Forms с настройками полного черного...

5
 Аватар для Buckminster
1032 / 703 / 66
Регистрация: 30.01.2012
Сообщений: 714
25.03.2012, 09:10
Цитата Сообщение от 9Символов Посмотреть сообщение
Как обрабатывать именно нажатие?
в разделе есть тема: Проверка ввода с клавиатуры
может быть, удастся развить этот подход...
0
 Аватар для 9Символов
7 / 7 / 0
Регистрация: 25.03.2012
Сообщений: 72
25.03.2012, 09:54  [ТС]
Цитата Сообщение от Buckminster Посмотреть сообщение
в разделе есть тема: Проверка ввода с клавиатуры
может быть, удастся развить этот подход...
Тамошний код:
import System.IO

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
getch :: IO Char
getch = do
  -- получаем старый режим буферизации для потока stdin
  oldBufferMode <- hGetBuffering stdin
  -- отключаем буферизацию для stdin
  hSetBuffering stdin NoBuffering
  c <- getChar                   -- читаем символ из stdin
  -- восстанавливаем режим буферизации для stdin
  hSetBuffering stdin oldBufferMode
  return c
 
-- пример
main :: IO ()
main = do
  c <- getch
  if c == '\n'
  then putStrLn "End"
  else do putStrLn $ "\tGot char " ++ [c]
          main
Не работает. Считывает символ только после нажатия "Enter".
0
 Аватар для Buckminster
1032 / 703 / 66
Регистрация: 30.01.2012
Сообщений: 714
25.03.2012, 11:42
status quo
there really seems to be a problem with getCh in WinGHCi: How to getCh on MS Windows command line? (Nov 10, 2008)
What I mean by getCh is the non-buffered non-echoed version of getChar, which Hugs used to provided as an extension but not any more.

Is there any way to have a non-buffered non-echoed single character input function on MS Windows command line using only the libraries in the MS Windows distribution packages of either GHC or Hugs?

I remember that this is an old problem for both of the two most widely used Haskell implementation, Hugs and GHC.

In ghc 6.8 getChar had a bit strange behavior. As far as I remember it always worked as if it were NoBuffering. Fortunately, in the recently released ghc 6.10, this has been fixed. We now actually have to set the buffering mode to NoBuffering with hSetBufferring to get the non-buffered behavior of getChar. But, it still isn't working on MS Windows.

In Hugs, hSetBuffering neither works on Unix terminal nor on MS Windows command line. Surprisingly, it works in WinHugs. However, I cannot use WinHugs for my purpose because the interactive calculator example in the book also uses beep characters and ANSI codes which do not work in WinHugs.
там же приведены некоторые сопутствующие вопросы и попытки их решения...
1
 Аватар для 9Символов
7 / 7 / 0
Регистрация: 25.03.2012
Сообщений: 72
25.03.2012, 16:02  [ТС]
Быть может позаимствовать getch из C через FFI?
0
 Аватар для Buckminster
1032 / 703 / 66
Регистрация: 30.01.2012
Сообщений: 714
25.03.2012, 17:11
Цитата Сообщение от 9Символов Посмотреть сообщение
Быть может позаимствовать getch из C через FFI?
по ссылке приводится код, реализующий эту идею:
Haskell
1
2
3
4
5
6
7
{-# LANGUAGE ForeignFunctionInterface#-}
import Monad
import Char
import Foreign.C
 
getCh = liftM (chr . fromEnum) c_getch
foreign import ccall "conio.h getch" c_getch :: IO CInt
но вот насколько он будет рабочим? к тому же, насколько я понял, многое зависит от того, о чём конкретно мы говорим: Hugs/WinHugs, GHCi/WinGHCi, компилятор/интерпретатор, Linux/Windows, версии всего перечисленного – однообразия здесь не наблюдается... например:
The action getCh is no longer provided as a primitive in Hugs
если удастся что-то обнаружить по теме – просьба обязательно сообщить...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2012, 17:11
Помогаю со студенческими работами здесь

Обработка нажатия клавиш
Доброго кодинга, форумчане. Требуется процедурка, реагирующая только на удержание клавиши. Задача в целом проста: надо чтоб круг на экране...

Обработка нажатия клавиш
Здравствуйте. Не могу придумать, как реализовать обработку нажатия клавиши в цикле repeat until на паскале. Требуется, чтобы цикл...

Обработка нажатия клавиш
Здравствуйте! Необходимо решить следующую задачу: Есть консольное приложение, которое разрабатывается с использованием C++, с...

Обработка нажатия клавиш
Как сделать так, чтобы при нажатии на стрелочку вверх на клавиатуре, делалось какое-то действие, например, менялся текст в Label1. ...

Обработка нажатия клавиш
procedure TForm1.HandleMessages(var Msg: TMsg; var Handled: Boolean); begin if (Msg.message = WM_KeyDown) AND (Msg.wParam in )...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru