Hier nun das Ergebnis meines Tastaturproblems:
Delphi-Quellcode:
//Sondertaste:
// 0 = Keine Sondertaste gedrückt
// 1 = SHIFT-Taste gedrückt
// 2 = ALTGR-Taste gedrückt
function VKToChar(Key:smallint;Sondertaste:byte=0;layout:HKL=0):string;
var
kb : TKeyboardState;
VK : UINT;
scan : UINT;
hs : array [0..255] of char;
erg : Integer;
begin
result := '';
fillchar(hs,sizeof(hs),0);
if (layout = 0) then
layout := GetKeyboardlayout(0);
VK := VKKeyScan(chr(key));
scan := MapVirtualKey(VK,0);
GetKeyboardState(kb);
Fillchar(KB,sizeof(KB),0);
Case Sondertaste of
1 : kb[VK_SHIFT] := KB[VK_SHIFT] OR $80;
2 : begin
KB[VK_CONTROL] := $81;
KB[VK_MENU] := $81;
KB[VK_LCONTROL] := $81;
KB[VK_RMENU] := $81;
end;
end;
kb[VK] := (kb[VK] or $80);
SetKeyboardState(kb);
erg := toAsciiEx(VK,scan,kb,@hs,0,layout);
//Deadkey-Behandlung
if (erg < 0) then
begin
fillchar(hs,sizeof(hs),0);
kb[VK_SPACE] := (kb[VK_SPACE] or $80);
SetKeyboardState(kb);
erg := toAsciiEx(VK,scan,kb,@hs,0,layout);
result := hs[0];
end
else
if (erg > 0) then
result := StrPas(HS);
end;
Die Routine gibt das Zeichen für eine Taste zurück. Je nach parameter kann zusätzlich auch die SHIFT oder die ALTGR-Taste mitsimuliert werden. So ist es z.B. möglich herauszufinden welches Zeichen beim drücken der
Tastenkombination ALTGR+E ausgegeben wird. Das ganze sollte auch im multilingualen umfeld funktionieren da man das Tastaturlayout mit angegeben kann. Wird dies nicht getan wird automatisch das Tastaturlayout des aktuellen Threads benutzt.