![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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", и тыды...