Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.011 c
8-1111882439
Valera
2005-03-27 04:13
2005.07.25
DSPack не обрабатывает сообщение на включение заставки и питания


14-1120423608
Knight
2005-07-04 00:46
2005.07.25
П-270 в Москве и Питере...


1-1120544719
lexus3d
2005-07-05 10:25
2005.07.25
добавление строчки в начало текстового файла


3-1118428253
Andy Nortsov
2005-06-10 22:30
2005.07.25
импорт данных из Excel в Firebird


14-1120119803
Андрей Жук
2005-06-30 12:23
2005.07.25
Народ, только быстро





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский