AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Tastenkombination abfangen und anderes Zeichen senden
Thema durchsuchen
Ansicht
Themen-Optionen

Tastenkombination abfangen und anderes Zeichen senden

Ein Thema von NetSonic · begonnen am 27. Mai 2011 · letzter Beitrag vom 27. Mai 2011
Antwort Antwort
NetSonic

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

Tastenkombination abfangen und anderes Zeichen senden

  Alt 27. Mai 2011, 10:08
Hallo zusammen,

ich möchte beim drücken einer vorher festgelegten Tastenkombination ein bestimmtes Zeichen innerhalb meiner ganzen Anwendung senden. Dies soll für alle Controls gelten. D.h. ich drücke z.B. [STRG] + [A] und möchte, dass dann z.B. im gerade aktiven TEdit ein 'ä' ausgegeben wird.

Soweit habe ich es bis jetzt realisiert:

Delphi-Quellcode:
procedure OnAppMsg(var Msg: TMsg; var Handled: Boolean);

procedure TMyForm.FormCreate(Sender: TObject);
begin
     Application.OnMessage := OnAppMsg;
end;

procedure TMyForm.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
begin
     Handled := False;
     if (Msg.message = WM_KEYDOWN) then
     begin
          if (GetKeyState(VK_CONTROL) < 0) and (Msg.wParam = Ord('A')) then
          begin
               Handled := True;
               PostMessage(WindowHandle, WM_KEYDOWN, ord('Ä'), 0);
               PostMessage(WindowHandle, WM_KEYUP, ord('Ä'), 0);
          end;

          if (GetKeyState(VK_CONTROL) < 0) and (Msg.wParam = Ord('O')) then
          begin
               Handled := True;
          end;
     end;
end;
Die Tastenkombination wird zwar erkannt, aber PostMessage greift anscheinend nicht. Evtl. wäre noch wichtig zu wissen, dass es sich bei der Form um eine eigene abgeleitete Klasse von TForm handelt, die ich als Grundlage meiner weiteren Forms nutze. Ich möchte also an dieser Stelle die Behandlung der oben beschrieben Kombinationen umsetzen, um ein zentrales Handling zu haben. (Die Hauptform meiner Anwendung basiert auf TForm und nicht auf meiner eigenen Klasse.)

Was mache ich falsch? Kann mir jemand einen Tipp geben?!

Danke.
Gruß NetSonic
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#2

AW: Tastenkombination abfangen und anderes Zeichen senden

  Alt 27. Mai 2011, 10:13
Was ist WindowHandle?
Du sendest den code ganz bestimmt an das falsche Window (das richtige Ziel steht in Msg drin).
Und zur Wahrung der Befehlsreihenfoölge, solltest du besser auf SendMessage ausweichen.

'AX' in der Nachrichtenschleife würde ja zu XÄ, wenn du das Ä erst wieder hinten anhängst.



PS:
Handle=False und den Zeichencode direkt im Msg ändern.

PPS: ord('Ä') ... Hat das wirklich einen "eigenständigen" Tastaturcode?
Drücke einfach mal das Ä manuell und schau was alles an Messages ankommt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (27. Mai 2011 um 10:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Tastenkombination abfangen und anderes Zeichen senden

  Alt 27. Mai 2011, 10:15
zum senden der Zeichen könntest du folgende Routine verwenden:

http://www.delphipraxis.net/154931-s...reinfacht.html
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
thepaine91

Registriert seit: 29. Okt 2009
Ort: Neckarsulm
36 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Tastenkombination abfangen und anderes Zeichen senden

  Alt 27. Mai 2011, 10:24
Hmm funktioniert das überhaupt über ord('Ä')? Bin der Meinung das ging nich da dies eig. 2 Character sind o. i-was in der Art^^.
Ansonsten ans falsche Handle geschickt?
>>> Hier könnte eine Signatur stehen <<<
  Mit Zitat antworten Zitat
NetSonic

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

AW: Tastenkombination abfangen und anderes Zeichen senden

  Alt 27. Mai 2011, 10:30

PS:
Handle=False und den Zeichencode direkt im Msg ändern.
Habe die Funktion jetzt umgestellt:

Delphi-Quellcode:
procedure TMyForm.OnAppMsg(var Msg: TMsg; var Handled: Boolean);
begin
     Handled := False;
     if (Msg.message = WM_KEYDOWN) then
     begin
          if (GetKeyState(VK_CONTROL) < 0) and (Msg.wParam = Ord('A')) then
          begin
               SendMessage(Msg.hwnd, WM_KEYDOWN, ord('i'), 0);
               SendMessage(Msg.hwnd, WM_KEYUP, ord('i'), 0);
          end;

          if (GetKeyState(VK_CONTROL) < 0) and (Msg.wParam = Ord('O')) then
          begin
               //Handled := True;
          end;
     end;
end;
Trotzdem erfolgt keine Übergabe. Wenn ich mir den Msg.HWND ausgeben lasse, enthält dieser je Steuerelement auch den entsprechenden Wert, passieren tut aber nichts.

Geändert von NetSonic (27. Mai 2011 um 11:13 Uhr)
  Mit Zitat antworten Zitat
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, 12: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 12:48 Uhr) Grund: Procedure angepasst...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz