Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.25;
Скачать: CL | DM;

Вниз

Scan-коды   Найти похожие ветки 

 
Kaban   (2005-07-06 10:52) [0]

Как определить 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


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

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


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

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


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

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


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

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


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

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


 
Digitman ©   (2005-07-06 13:31) [6]

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


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

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

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

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


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

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


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

> Kaban

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

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

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


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

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


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

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


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

> Kaban   (06.07.05 15:09) [11]

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

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


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

я как раз думаю как бы это получше организовать
у меня получилось получить 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]);

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


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

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

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

даже проще



Страницы: 1 вся ветка

Текущий архив: 2005.07.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
3-1118777780
snaip
2005-06-14 23:36
2005.07.25
DBNavigator(работа с БД)


14-1120415546
P.N.P.
2005-07-03 22:32
2005.07.25
Лицензионная музыка?


1-1120828756
onics
2005-07-08 17:19
2005.07.25
Параметры ф-ции Excel.ActiveWorkbook.SaveAs


1-1120470968
mmms
2005-07-04 13:56
2005.07.25
Вызов ф-и из DLL


9-1112782104
lifo
2005-04-06 14:08
2005.07.25
правельная отрисовка формулы