Neue Erkenntnisse! Folgender Sourcecode:
Delphi-Quellcode:
procedure TMyForm.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
var
ccode: Word;
begin
if (Msg.message = WM_KEYDOWN) then
begin
if (Msg.wParam = Ord('Z')) then
begin
Color := clGreen;
Msg.wParam := ord('F');
Handled := False;
end;
if (Msg.wParam = Ord('A')) then
begin
Color := clMaroon;
if (GetKeyState(VK_CONTROL) < 0) and (GetKeyState(VK_MENU) < 0) then
begin
Color := clYellow;
Msg.wParam := Ord('Z');
Handled := False;
end;
end;
end;
end;
Der Druck von [Z] färbt das Formular grün und übermittelt 'F'. Soweit so gut. Der Druck von [A] färbt es rot/braun. Auch in Ordnung. Der Druck von [STRG]+[ALT]+[A] färbt es gelb - aber das Zeichen wird nicht ausgetauscht! Was ist da falsch?
Ich vermute, dass Problem hängt mit der Abfrage von GetKeyState zusammen. Ich komme drauf, weil ich nun folgende Prozedur eingebunden habe:
Delphi-Quellcode:
procedure TMyForm.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
type
TReplacement = record
chIn: Char;
chOut: string[2]
end;
TReplacements = array [0..6] of TReplacement;
const
Replacements: TReplacements = ((chIn: 'a'; chOut: 'ä'),
(chIn: 'o'; chOut: 'ö'),
(chIn: 'u'; chOut: 'ü'),
(chIn: 'A'; chOut: 'Ä'),
(chIn: 'O'; chOut: 'Ö'),
(chIn: 'U'; chOut: 'Ü'),
(chIn: 'S'; chOut: 'ß'));
var
i: Integer;
c: Char;
begin
Handled := False;
if (Msg.Message = WM_CHAR) then
begin
if (Chr(Msg.wParam) in ['a', 'o', 'u', 'A', 'O', 'U', 'S']) and (getasynckeystate(VK_MENU) < 0) then
begin
Color := clWhite;
for i := Low(Replacements) to High(Replacements) do
if Chr(Msg.wParam) = Replacements[i].chIn then
begin
Msg.wParam := Ord(Replacements[i].chOut[1]);
with Longrec(Msg.lParam) do
Hi := (Hi and $FF00) or VKKeyScan(Char(Replacements[i].chOut[2]));
PostMessage(Msg.hwnd, WM_CHAR, Ord(Replacements[i].chOut[2]),
Msg.wParam);
with Longrec(Msg.lParam) do
Hi := (Hi and $FF00) or VKKeyScan(Char(Msg.wParam));
Break;
end;
end;
end;
end;
Diese funktioniert aber nur, wenn ich auf GetKeyState verzichte. Auch das Ändern des Message-Typs auf WM_KEYDOWN bracht da keine Änderung!