Einzelnen Beitrag anzeigen

NetSonic

Registriert seit: 10. Mai 2007
124 Beiträge
 
Delphi 10 Seattle Professional
 
#6

AW: Tastenkombination abfangen und anderes Zeichen senden

  Alt 27. Mai 2011, 13:04
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!

Geändert von NetSonic (27. Mai 2011 um 13:48 Uhr) Grund: Procedure angepasst...
  Mit Zitat antworten Zitat