Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2012, 13:07   #1
Elloriane
Пользователь
 
Регистрация: 19.02.2012
Сообщений: 60
По умолчанию Коды клавиш

Добрый день!
Я написал некую программу, которая увеличивает или уменьшает определенное число с помощью клавиш влево и вправо (только их можно использовать по условию)
Код:
whatKeyPr=readkey();
switch(whatKeyPr)
{
	case LEFT_ARROW:
		iterationNumber--;
		if (iterationNumber==-2) 
			iterationNumber++;
		break;
	case RIGHT_ARROW:
		iterationNumber++;
		break;
и так далее.
Суть в том, что при нажатии клавиш Shift+M и Shift+K совершаются аналогичные действия, то есть у них совпадают коды. Это нужно исключить.
Суть вопроса: как определить нажатие и удержание клавиши SHIFT и, если она удерживается, перескочить в другое место (goto например)

Ах да, left/right arrow это definitions 75 и 77 соответственно

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

Мне не нужно писать полностью решение, лишь подсказать путь/функцию, которая бы показывала, удерживается шифт, или нет

Последний раз редактировалось Elloriane; 16.03.2012 в 13:55. Причина: никто не откликается
Elloriane вне форума Ответить с цитированием
Старый 16.03.2012, 14:23   #2
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

const int SHIFTED = 0x8000;


((GetKeyState(VK_SHIFT)&SHIFTED)!=0 ) - клавиша нажата(правая или левая)

VK_LSHIFT - левая
VK_RSHIFT - правая
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 16.03.2012, 18:13   #3
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от Elloriane Посмотреть сообщение
Добрый день!
... с помощью клавиш влево и вправо (только их можно использовать по условию)
Код:
// whatKeyPr=readkey(); // убрать
whatKeyPr =  _getch()==0xE0 ? _getch() : 0;
EUGY вне форума Ответить с цитированием
Старый 20.03.2012, 13:13   #4
Elloriane
Пользователь
 
Регистрация: 19.02.2012
Сообщений: 60
По умолчанию

Спасибо, пробую

Второй вариант не подошел, т.к. вся картина перестает реагировать на какое-либо нажатие

А вот первый - требует:
Header winuser.h
Library Kbdui.lib
Если h. файл у меня есть, то библиотеки нету, можно как-то обойтись без доп. библиотек?

Последний раз редактировалось Stilet; 20.03.2012 в 23:09.
Elloriane вне форума Ответить с цитированием
Старый 20.03.2012, 13:47   #5
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
Сообщение от Elloriane Посмотреть сообщение
А вот первый - требует:
Header winuser.h
Library Kbdui.lib
Если h. файл у меня есть, то библиотеки нету, можно как-то обойтись без доп. библиотек?
Я думал, что Вы пишите обычное консольное приложение под windows.
Ошибся?
EUGY вне форума Ответить с цитированием
Старый 20.03.2012, 13:52   #6
Elloriane
Пользователь
 
Регистрация: 19.02.2012
Сообщений: 60
По умолчанию

Верно, я воспользовался поиском, потому что VK_LSHIFT и подобные функции компилятор не смог прочитать (подумал, мол нужен какой-то #include)

ссылка:
http://msdn.microsoft.com/en-us/library/aa932743.aspx

инклуд не заработал, было много ошибок в самом файле - я решил подключить в ресурсы библиотеку (из ссылки), а у меня её нету в каталоге.

Или я просто совсем Вас не понял?
Elloriane вне форума Ответить с цитированием
Старый 20.03.2012, 14:02   #7
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Для варианта предложенного Krock27
нужно #include <windows.h>
Библиотека User32.lib в которой определена функция GetKeyState у Вас должна быть. Всякие студии подключают ее по умолчанию.
Но прочитав фразу:
Цитата:
Суть в том, что при нажатии клавиш Shift+M и Shift+K совершаются аналогичные действия, то есть у них совпадают коды.
я предложил не шифт отлавливать, а четко идентифицировать нажатия стрелок, т.к. в буфере консоли их код идет после служебного 0xE0.
EUGY вне форума Ответить с цитированием
Старый 20.03.2012, 14:19   #8
Elloriane
Пользователь
 
Регистрация: 19.02.2012
Сообщений: 60
По умолчанию

Всё заработало с windows.h , спасибо вам обоим, но хотелось бы разобраться с Вашим вариантом, EUGY.
Он работает, но без ведомой причины (по крайней мере я не понимаю, потому cleardevice() стоит после этого условия) экран становится черным и картинка обновляется если перейти (кликнуть) на смд окно и назад.

Однако при Shift + M итерация не меняется! (т.е. идея сработала)
Elloriane вне форума Ответить с цитированием
Старый 20.03.2012, 14:31   #9
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Я не вижу всей картины. Покажите что из себя представляет readkey() и вкратце как сделан главный цикл.
Всё заработало с windows.h - Очень рад.
Но вообще я бы не стал вводить новые сущности без необходимости. (это так- принцип экономии).
EUGY вне форума Ответить с цитированием
Старый 20.03.2012, 14:34   #10
Elloriane
Пользователь
 
Регистрация: 19.02.2012
Сообщений: 60
По умолчанию

есть только один минус у Вашего варианта - по esc нужно выходить (:
поэтому он выйдет чуть дольше, если вам интересно - я могу отправить вам письмом программу, чтобы Вы поняли о чем речь
Elloriane вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
коды функ. клавиш XemyL Паскаль, Turbo Pascal, PascalABC.NET 4 24.04.2011 01:08
коды клавиш на ТС alex(21) Общие вопросы C/C++ 1 13.11.2009 10:23
коды клавиш-? Evgenii Общие вопросы Delphi 8 28.10.2009 22:00
Коды клавиш valerij Microsoft Office Excel 0 20.08.2008 07:49
Коды клавиш KAMASUTR Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 09.08.2007 22:25