Форум: "Основная";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];
ВнизПолучение названия клавиши по виртуальному коду Найти похожие ветки
← →
Ajax (2003-06-03 19:42) [0]Помогите разобраться с GetKeyNameText. Мне нужно по виртуальному коду получить название клавиши. В GetKeyNameText надо пердавать lparam:longint. А в этот lparam много чего входит кроме кода клавиши. Может кто-нибудь знает, как сформировать lparam. В хелпе написано какие байты за что отвечают, но у меня не получается.
← →
Skier (2003-06-03 19:51) [1]Установка бита производится через операцию побитового
сложения or
← →
Юрий Зотов (2003-06-03 20:20) [2]Реально надо заполнить только биты 16-23 (скэн-код), 24 (различать расширенную клавиатуру) и 25 (различать левые и правые Shift, Ctrl и пр.). Остальные биты функция игнорирует.
Биты 24 и 25 устанавливайте по собственному выбору, а для преобразования виртуального кода в скэн-код используйте MapVirtualKey. Вот и все.
← →
Ajax (2003-06-04 08:58) [3]Во первых, не могу понять как использовать MapVirtualKey, если она при разных значениях второго параметра возвращает разный результат. Какой нужно использовать второй параметр? Наверное 0? (Help читал).
Во вторых, взял несколько lparam из сообщений и попытался найти закономерность.
Esc (1B) - 1073676287 - 3FFEFFFF - 11111111 010110 1111111111111111
F1 (70) - 1069875199 - 3FC4FFFF - 11111111 000100 1111111111111111
` (C0) - 1071054847 - 3FD6FFFF - 11111111 010110 1111111111111111
1 (31) - 1073610751 - 3FFDFFFF - 11111111 111101 1111111111111111
2 (32) - 1073545215 - 3FFCFFFF - 11111111 111100 1111111111111111
Ну никак не могу понять как формируется число... Даже подставляя MapVirtualKey...
← →
Skier (2003-06-04 09:39) [4]
> взял несколько lparam из сообщений и попытался найти закономерность.
???
The GetKeyNameText function retrieves a string that represents the name of a key.
← →
Skier (2003-06-04 10:30) [5]Посмотри пример использования GetKeyNameText и MapVirtualKey в
ф-ции GetSpecialName (Menus.pas)
← →
Ajax (2003-06-04 17:11) [6]Выдернул функцию, переработал немного. Она уже ПОЧТИ работает.
function GetKeyName(KeyCode:cardinal): string;
var
ScanCode: Integer;
KeyName: array[0..255] of Char;
begin
Result := "";
ScanCode := MapVirtualKey(KeyCode, 0) shl 16;
if ScanCode <> 0 then
begin
GetKeyNameText(ScanCode, KeyName, SizeOf(KeyName));
Result := KeyName;
end;
end;
Только вот партаки с доп. клавиатурой и стрелками курсора...
← →
Юрий Зотов (2003-06-04 17:42) [7]Дык... а на что же 24-й бит?
GetKeyNameText(ScanCode or $1000000,
KeyName, SizeOf(KeyName));
← →
Ajax (2003-06-04 17:51) [8]>Юрий Зотов © (04.06.03 17:42)
>Дык... а на что же 24-й бит?
Я так пробывал. В таком варианте перестают определятся функциональные клавиши, ESC, ну и так местами...
← →
Skier (2003-06-04 17:54) [9]>Ajax © (04.06.03 17:51)
А как ты используешь GetKeyName в программе ?
← →
Юрий Зотов (2003-06-04 18:27) [10]> Ajax © (04.06.03 17:51)
Константу не перепутали? Иначе выставится другой бит, вот и будут глюки.
← →
Ajax (2003-06-04 20:13) [11]function GetKeyName(KeyCode:cardinal): string;
var
ScanCode: Integer;
KeyName: array[0..255] of Char;
begin
Result := "";
ScanCode := MapVirtualKey(KeyCode, 0) shl 16;
if ScanCode <> 0 then
begin
GetKeyNameText(ScanCode or $1000000, KeyName, SizeOf(KeyName));
Result := KeyName;
end;
end;
procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Edit1.Text:=GetKeyName(key);
end;
← →
Ajax (2003-06-04 22:04) [12]Наблюдал интересное явление. Оказалось, что в одной и той же ситуации, 24 бит lparam разный в зависимости от нажатой клавиши (хотя с чего бы ему быть разным). Винда всегда присылает правильно установленный бит, а как она выбирает ставить его или нет остается загадкой...
После небольшой доработки функция начала работать:
function GetKeyName(KeyCode:cardinal): string;
var
ScanCode: Cardinal;
KeyName: array[0..255] of Char;
begin
Result := "";
ScanCode := MapVirtualKey(KeyCode, 0) shl 16;
if (KeyCode>33) and (KeyCode<47) then ScanCode:=ScanCode or (1 shl 24);
if KeyCode=144 then ScanCode:=3242524673;
if KeyCode=19 then ScanCode:=3225747457;
if ScanCode <> 0 then
begin
GetKeyNameText(ScanCode, KeyName, SizeOf(KeyName));
Result := KeyName;
end;
end;
Но какой-то код получился некрасивый... :-(
← →
Юрий Зотов (2003-06-04 22:44) [13]> а как она выбирает ставить его или нет остается загадкой
Вероятно, она проверяет реальный тип клавиатуры и устанавливает (или наоборот, сбрасывает) его для расширенной.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c