![]() |
Tastenkombination abfangen und anderes Zeichen senden
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:
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.)
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; Was mache ich falsch? Kann mir jemand einen Tipp geben?! Danke. Gruß NetSonic |
AW: Tastenkombination abfangen und anderes Zeichen senden
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. |
AW: Tastenkombination abfangen und anderes Zeichen senden
zum senden der Zeichen könntest du folgende Routine verwenden:
![]() |
AW: Tastenkombination abfangen und anderes Zeichen senden
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? |
AW: Tastenkombination abfangen und anderes Zeichen senden
Zitat:
Delphi-Quellcode:
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.
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; |
AW: Tastenkombination abfangen und anderes Zeichen senden
Neue Erkenntnisse! Folgender Sourcecode:
Delphi-Quellcode:
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?
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; Ich vermute, dass Problem hängt mit der Abfrage von GetKeyState zusammen. Ich komme drauf, weil ich nun folgende Prozedur eingebunden habe:
Delphi-Quellcode:
Diese funktioniert aber nur, wenn ich auf GetKeyState verzichte. Auch das Ändern des Message-Typs auf WM_KEYDOWN bracht da keine Änderung!
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz