Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-60247
UDS
2003-06-05 21:12
2003.06.19
Простой вопрос о цвете в Делфи...


1-60229
Nucl
2003-06-05 08:59
2003.06.19
Обработка большого Excel файла


3-60090
Rel_
2003-05-28 14:39
2003.06.19
TQuery


11-60098
Alexander
2002-09-22 12:30
2003.06.19
Странное поведение свойства Align:


1-60219
BDRON
2003-06-05 14:48
2003.06.19
Кириллица в заголовке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский