Форум: "Основная";
Текущий архив: 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