Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Код виpтуальной клавиши в символ (строку). Как? GetAsyncKeyState, GetKeyNameText, ToAsci 
:(
    Опции темы
kalexi
  Дата 1.12.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.2.2008

Репутация: нет
Всего: нет



Я с помощью GetAsyncKeyState определяю активно нажатую клавишу, точнее ее код. 
Мне нужно перевести ее в текст на активном языке если это тест, цифра или символ, и в название клавиши в ином случае (Ctrl, Enter,...). 
Сделал большой массив со всеми клавишами, но поиск отбирает много процессорного времени, а это плохо хотябы потому, что GetAsyncKeyState не успевает и пропускает некоторые нажатия.

В результате наткнулся на 2 функции: GetKeyNameText и ToAscii

Цитата
Функция GetKeyNameText

Функция GetKeyNameText извлекает строку, которая представляет название клавиши.

Синтаксис
Код
int GetKeyNameText(
    LONG lParam,    // второй параметр сообщения клавиатуры
    LPTSTR lpString,    // адрес буфера с именем клавиши
    int nSize    // максимальная длина строки с именем клавиши
);



Функция ToAscii

Функция ToAscii переводит заданный код виртуальной клавиши и состояние клавиатуры в соответствующий символ или символы Windows. Функция переводит код, используя язык ввода данных и физическую раскладку символов на клавиатуре, идентифицированную данным дескриптором раскладки символов.

Синтаксис
Код
int ToAscii
(
    UINT uVirtKey,    // код виртуальной клавиши
    UINT uScanCode,    // скэн-код
    PBYTE lpKeyState,    // адрес массива состояния клавиши
    LPWORD lpChar,    // буфер для трансляции клавиши
    UINT uFlags    // флажок активного меню
);



Но пока не совсем разобрался как с ними работать, а именно у них присутствует больше параметров, чем у меня данных. Например lParam - я ведь не сообщение принимаю.

Как с ними работать, посоветуйте пожалуйста.
PM MAIL WWW   Вверх
Snowy
Дата 2.12.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Код
function GetKeyName(Code: Integer): string;
var
  KeyName: array[0..255] of Char;
begin
  result := '';
  Code := MapVirtualKey(Code, 0);
  if Code <> 0 then
    if GetKeyNameText(Code shl 16, KeyName, SizeOf(KeyName)) > 0 then
      Result := KeyName;
end;
Вот только GetAsyncKeyState не определяет активно нажатую клавишу, а определяет - нажата ли конкретная клавиша...
PM MAIL   Вверх
Snowy
Дата 2.12.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Наверное имелось ввиду что-то вроде этого:
Код
function GetKeys: string;
var
  i, c: integer;
  KeyName: array[0..255] of Char;
  ks:      TKeyboardState;
begin
  Result := '';
  GetKeyboardState(ks); // Берём состояние всех клавиш
  for i := 0 to 128 do // Перебираем клавиши
    if ks[i] and 128 > 0 then // Если в данный момент нажата
    begin
      c := MapVirtualKey(i, 0);
      if GetKeyNameText(c shl 16, KeyName, SizeOf(KeyName)) > 0 then // Получаем имя клавиши
        Result := Result + '+' + KeyName;
    end;
  Result := Copy(Result, 2, Length(result));
end;
Функция вернёт строку со списком нажатых клавиш
PM MAIL   Вверх
kalexi
Дата 2.12.2009, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.2.2008

Репутация: нет
Всего: нет



Большое спасибо. А как тогда использовать ToAscii?
PM MAIL WWW   Вверх
Snowy
Дата 2.12.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(kalexi @  2.12.2009,  14:46 Найти цитируемый пост)
А как тогда использовать ToAscii?
Эта функция для получения печатного символа клавиши (получить то, что будет в поле ввода, при наборе текста)
Код
function GetKey(Code: Integer): Char;
var ks:      TKeyboardState;
begin
  GetKeyboardState(ks);
  ToAscii(Code, Code, ks, PAnsiChar(@result), 0);
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.