Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Scan-коды


Kaban ©   (2005-07-06 10:52:00) 

Как определить ScanCode определенного символа?
Попробовал поиграться со следующими функциями, не получается.

WriteLn( Byte(OemKeyScan(Byte('Q'))) );      //= 16 Правильно
WriteLn( Byte(OemKeyScan(Byte('q'))) );      //= 16
WriteLn( Byte(OemKeyScan(Byte('Й'))) );      //= 255

WriteLn( Byte(MapVirtualKey(Byte(VkKeyScan('Q')), 0))); //= 16
WriteLn( Byte(MapVirtualKey(Byte(VkKeyScan('q')), 0))); // = 16
WriteLn( Byte(MapVirtualKey(Byte(VkKeyScan('Й')), 0))); // = 0


Kaban   (2005-07-06 15:29:00) [1]

впрочем ваш код

ScanCode := MapVirtualKeyEx(VkKeyScanEx(AnsiLowerCase('й')[1], GetKeyboardLayout(1)), 0, GetKeyboardLayout(1));

даже проще


Kaban   (2005-07-06 15:28:00) [2]

я как раз думаю как бы это получше организовать
у меня получилось получить ScanCode с помощью кода

const
  MAX_LAYOUT = 5;

var
 Layouts  : array [0..MAX_LAYOUT - 1] of HKL;
 Index    : Integer;
 Count    : Integer;
 ScanCode : Byte;
...
Count := GetKeyboardLayoutList(MAX_LAYOUT, Layouts);
ScanCode := MapVirtualKeyEx(VkKeyScanEx(AnsiLowerCase('й')[1], Layouts[1]), 0, Layouts[1]);

а символы, понятно поступают не с клавиатуры, иначе проблемы бы не было :)


Юрий Зотов   (2005-07-06 15:17:00) [3]

> Kaban   (06.07.05 15:09) [11]

Привязываться придется (функции xxxEx это и делают), только можно сделать это немного хитрее.

Поскольку преобразуемый символ совершенно необязательно получен именно с клавиатуры, то раскладка в общем случае неизвестна и правильно вызвать функцию невозможно - но если на машине только 2 языка, то можно определить нужную раскладку по принадлежности символа к верхней (национальной) или нижней (английской) половине таблицы кодов ASCII.


Kaban   (2005-07-06 15:09:00) [4]

2 Юрий Зотов
Спасибо, видимо все равно придется привязываться к раскладке клавиатуры.


Юрий Зотов   (2005-07-06 14:58:00) [5]

Добавление: см. также VkKeyScan Ex


Юрий Зотов   (2005-07-06 14:44:00) [6]

> Kaban

Посмотрите в сторону MapVirtualKey Ex:

procedure TForm1.FormDblClick(Sender: TObject);
begin
 if Edit1.Text <> '' then
   Caption := IntToStr(MapVirtualKeyEx(VkKeyScan(AnsiLowerCase(Edit1.Text)[1]), 0, GetKeyboardLayout(0)))
 else
   Caption := ''  
end;

Скэн-код определяется правильно, но важно определить раскладку в момент нажатия клавиши, а не в текущий (как в примере).


Kaban   (2005-07-06 14:23:00) [7]

видимо это невозможно, так как в общем случае одинаковые символы в разных раскладках могут соответствовать разным клавишам, например .,;:


Kaban   (2005-07-06 13:43:00) [8]

я их и так знаю, они вроде не для когоне секрет

так я знаю что scancode 16 соответствует латинской q или русской й

теперь допустим программа работает на некотором компьютере с немецкой и французской раскладками, как по символу определить клавишу, которая ему соответствует на клавиатуре


Digitman   (2005-07-06 13:31:00) [9]

поставь хук WH_KEYBOARD_LL и будешь знать скан-коды всех клавиш текущей клавиатуры


Kaban   (2005-07-06 13:29:00) [10]

мож еще у кого есть какие-нибудь мысли


Kaban   (2005-07-06 11:44:00) [11]

во-первых, строчную букву тоже не возвращает
во-вторых, для английских работает независимо от регистра


AbrosimovA   (2005-07-06 11:37:00) [12]

А в сочетании с VK_Capital (Caps Lock) не поможет?


Kaban   (2005-07-06 11:34:00) [13]

Это я понимаю. Возможно неправильно сформулировал ворпос, хорошо как узнать ScanCode клавиши, на которой нацарапано 'Й'


Чапаев   (2005-07-06 11:30:00) [14]

> Как определить ScanCode определенного символа?
Скан-код бывает у клавиши на клавиатуре, а не у символа. В традиционной "американской" клавиатуре скан-кодом 16 будет обладать клавиша, на которой нацарапано "Q". В клавиатуре "французской" -- клавиша, на которой нацарапано "A", и тыды...


Наверх

Титульная страница Поиск, карта сайта Написать письмо