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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2012, 16:21   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию Получить символ из кода нажатой клавиши (WM_KEYDOWN)

У формы есть событие OnKeyPress, которое передает символ нажатой клавиши (var Key:Char)
Я пишу свой контрол, в котором получаю и обрабатываю сообщение WM_KEYDOWN.
Из этого сообщения мне известны:
CharCode: Word; // код нажатой клавиши
KeyData: Longint; // TShiftState
Как теперь получить непосредственно символ, который напечатался бы в текстовом поле?
т.е. если я нажимаю клавишу S, с русской раскладкой и нажатым шифтом, то символ - 'Ы'.

Спасибо =)
xrob вне форума Ответить с цитированием
Старый 23.12.2012, 16:36   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

По таблице.
Иначе никак.
Собственно, именно эту таблицу обычно и называют "раскладкой клавиатуры".
s-andriano вне форума Ответить с цитированием
Старый 23.12.2012, 16:48   #3
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

Ты не поверишь...
CharCode уже и есть твой искомый печатаемый символ. В utf16, ессно.
Smogg вне форума Ответить с цитированием
Старый 23.12.2012, 17:10   #4
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Smogg, ой не врите =)
Клавиша Q всегда имеет CharCode = 81,
независимо от раскладки и нажатых шифтов.

s-andriano, а подробнее?
руками то я и сам могу - расписать каждую клавишу "если-то или если-то"...
но полюбому есть уже готовая функция для получения символа.
вот мне ее и надо. как раз тот случай, когда я не хочу изобретать велосипед.
xrob вне форума Ответить с цитированием
Старый 23.12.2012, 17:20   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
независимо от раскладки и нажатых шифтов.
MapVirtualKeyEx тебе должна в преобразовании помочь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.12.2012, 17:24   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://msdn.microsoft.com/ru-ru/libr...(v=vs.85).aspx
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.12.2012, 18:54   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
Я пишу свой контрол, в котором получаю и обрабатываю сообщение WM_KEYDOWN.
А начните получать и обрабатывать WM_CHAR
waleri вне форума Ответить с цитированием
Старый 23.12.2012, 20:39   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
s-andriano, а подробнее?
Если Вы хотите узнать, как это лучше всего сделать, то лично я предпочел бы вариант, уже озвученный waleri.
Зачем что-то преобразовывать, если это преобразование уже сделали за Вас?
s-andriano вне форума Ответить с цитированием
Старый 23.12.2012, 21:03   #9
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,152
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
Smogg, ой не врите =)
Клавиша Q всегда имеет CharCode = 81,
независимо от раскладки и нажатых шифтов.
Хм... Mea culpa... Я то подумал, что если Вы добрались до написания контролов, то уж с MSDN уже успели ознакомится и разобраться, как там в TranslateMessage() происходит конверсия из кода клавиши через кодовую страницу в код символ.

Языковые настройки - это что-то с чем-то. И без крайней нужды напрямую с ними лучше не связываться.
Smogg вне форума Ответить с цитированием
Старый 25.12.2012, 13:42   #10
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Охохо, бинго!
waleri, это то что надо! ))
я просто не знал что есть такое событие.
OnKeyPress на форме возникает, наверно именно с него, а я думал с WM_KEYDOWN.

MapVirtualKeyEx курил, но что-то там слишком мудрено,
не хочу в это все вникать.

всем спасибо за участие =)

p.s.
ах да, Smogg, я, наверное дилетант, я пока с помощью
procedure MouseMove(var Message: TWMMouse); message WM_MOUSEMOVE;
все делаю...
не совсем api, наверное...
xrob вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить код нажатой клавиши на картинке Григоренко Степан Компоненты Delphi 8 27.11.2012 01:43
asm получить код нажатой клавиши... (?) Denutrror Общие вопросы Delphi 15 31.03.2012 16:19
Получения кода нажатой клавиши _PROGRAMM_ Win Api 8 11.02.2012 22:56
Определение кода нажатой клавиши Fataller Общие вопросы C/C++ 8 07.11.2009 19:29
код нажатой клавиши galaid Общие вопросы Delphi 4 24.05.2009 20:03