Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как распознавать нажатия клавиш?  (Прочитано 12587 раз)
0 Пользователей и 5 Гостей смотрят эту тему.
BobCat
Интересующийся

ru
Offline Offline
Пол: Мужской

« : 23-05-2009 21:08 » 

Всем привет! Возник такой вопрос: под ДОС есть прерывания, но под ВинДос я так понял прерывания не прокатывают Здесь была моя ладья...  как же тогда распознавать какая клавиша нажата.(нужно нажатиями клавиш со стрелками гонять по экрану квадратик рисованный символами псевдографики) Для рисования то использую функции  SetConsolCursorPosition и WriteConsoleA.
Буду также благодарен за толковую литературу по теме. пользуюсь учебником Юрова и самоучителем Крупника
Записан

Отлаживать код вдвое сложнее, чем писать. Поэтому, если при написании программы вы используете весь свой интеллект, вы по определению недостаточно умны, чтобы ее отладить.     Брайан Керниган
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 24-05-2009 03:18 » 

BobCat,

попробуй
ReadConsole

Код:
The ReadConsole function reads character input from the console input buffer and removes it from the buffer.


BOOL ReadConsole(
  HANDLE hConsoleInput,
  LPVOID lpBuffer,
  DWORD nNumberOfCharsToRead,
  LPDWORD lpNumberOfCharsRead,
  LPVOID lpReserved
);

Parameters
hConsoleInput
[in] Handle to the console input buffer. The handle must have the GENERIC_READ access right. For more information, see Console Buffer Security and Access Rights.
lpBuffer
[out] Pointer to a buffer that receives the data read from the console input buffer. The total size of the buffer required will be less than 64K.
nNumberOfCharsToRead
[in] Number of TCHARs to read. The size of the buffer pointed to by the lpBuffer parameter should be at least nNumberOfCharsToRead * sizeof(TCHAR) bytes.
lpNumberOfCharsRead
[out] Pointer to a variable that receives the number of TCHARs actually read.
lpReserved
[in] Reserved; must be NULL.
Return Values
If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
ReadConsole reads keyboard input from a console's input buffer. It behaves like the ReadFile function, except that it can read in either Unicode (wide-character) or ANSI mode. To have applications that maintain a single set of sources compatible with both modes, use ReadConsole rather than ReadFile. Although ReadConsole can only be used with a console input buffer handle, ReadFile can be used with other handles (such as files or pipes). ReadConsole fails if used with a standard handle that has been redirected to be something other than a console handle.

All of the input modes that affect the behavior of ReadFile have the same effect on ReadConsole. To retrieve and set the input modes of a console input buffer, use the GetConsoleMode and SetConsoleMode functions.

If the input buffer contains input events other than keyboard events (such as mouse events or window-resizing events), they are discarded. Those events can only be read by using the ReadConsoleInput function.

This function uses either Unicode characters or 8-bit characters from the console's current code page. The console's code page defaults initially to the system's OEM code page. To change the console's code page, use the SetConsoleCP or SetConsoleOutputCP functions, or use the chcp or mode con cp select= commands.
Записан

BobCat
Интересующийся

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 24-05-2009 05:00 » 

вот в том то и дело, что ReadConsole считывает строку после нажатия Enter.
А мне нужно сразу же после нажатия на клавишу со стрелкой перерисовывать экран
Записан

Отлаживать код вдвое сложнее, чем писать. Поэтому, если при написании программы вы используете весь свой интеллект, вы по определению недостаточно умны, чтобы ее отладить.     Брайан Керниган
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 24-05-2009 08:59 » 

Есть функция GetAsyncKeyState, которая асинхронно проверяет состояние клавиши, то есть нажата она или нет.
Записан
BobCat
Интересующийся

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 24-05-2009 22:04 » 

спасибо, понял. набросал тестовый код, все работает
Код:
start:

invoke GetStdHandle, STD_OUTPUT_HANDLE ;получаем дескриптор экрана
mov stdout, eax


xor eax, eax
MainLoop:

invoke GetAsyncKeyState, 26h ;проверяем не нажата ли клавиша Up
cmp eax, -32767d
je up
invoke GetAsyncKeyState, 28h ;проверяем не нажата ли клавиша Down
cmp eax, -32767d
je down
invoke GetAsyncKeyState, 25h ;проверяем не нажата ли клавиша Left
cmp eax, -32767d
je left
invoke GetAsyncKeyState, 27h ;проверяем не нажата ли клавиша Right
cmp eax, -32767d
je right
invoke GetAsyncKeyState, 1Bh ;проверяем не нажата ли клавиша Esc
cmp eax, -32767d
je escape
        invoke Sleep, 100 ; задержка в 0,1 сек
jmp MainLoop  ;опять проверяем клавиши на нажатие
up:

invoke WriteConsoleA, stdout, ADDR UpText,\
               6, ADDR cWritten, NULL                  ; выводим строку на экран
jmp MainLoop
down:
invoke WriteConsoleA, stdout, ADDR DownText,\
               6, ADDR cWritten, NULL                  ; выводим строку на экран
jmp MainLoop
left:
invoke WriteConsoleA, stdout, ADDR LeftText,\
               6, ADDR cWritten, NULL                  ; выводим строку на экран
jmp MainLoop
right:
invoke WriteConsoleA, stdout, ADDR RightText,\
               6, ADDR cWritten, NULL                  ; выводим строку на экран
jmp MainLoop
escape:
invoke ExitProcess, 0
end start
только...
"меня терзают смутные сомнения"(с) : Здесь была моя ладья...
я загоняю процессор в бесконечный цикл, он работает почем зря. Можно как-то сделать чтоб он ждал нажатия клавиши и реагировал только непосредственно по нажатию?
« Последнее редактирование: 24-05-2009 22:52 от BobCat » Записан

Отлаживать код вдвое сложнее, чем писать. Поэтому, если при написании программы вы используете весь свой интеллект, вы по определению недостаточно умны, чтобы ее отладить.     Брайан Керниган
BobCat
Интересующийся

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 25-05-2009 00:44 » 

еще вопрос немножко не в тему:
как отключить возможность скроллинга в консоли?
« Последнее редактирование: 25-05-2009 01:09 от BobCat » Записан

Отлаживать код вдвое сложнее, чем писать. Поэтому, если при написании программы вы используете весь свой интеллект, вы по определению недостаточно умны, чтобы ее отладить.     Брайан Керниган
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 25-05-2009 04:07 » new

сразу после метки MainLoop: надо поставь паузу (~ 1...30 мс) тогда процесс не будет сильно грузить процессор
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines