![]() |
Textergänzer
Hallo!
Ich will ein Programm schreiben, dass Text in jedem Programm ergänzt, zum Beispiel: Eingabe ( irgendwo ): Mül Automatische Ergänzung ( virtueller Tastaturanschlag ): ler Das mit dem Umlauten ist jez nur ein Beispiel, umlaute kommen erstmal nicht vor. Zum auslesen der Tastenanschläge im Systemm wollte ich folgendes verwenden: ![]() Aber es ist sehr lange her, als ich das lezte Mal mit sowas gearbeitet hab, kurz ich krieg es nicht hin, das was in das Memo geschrieben wird auszulesen, das alle eingaben ignoriert werden, nur wen mül in dieser Reihenfolge betätigt werden, soll dann Was passieren, und zweitens, wie kriege ich es hin, dass die Tasten dann virtuelkl angeschlagen werden? cu Chris |
Re: Textergänzer
Um das sicher hinzukriegen brauchst du zwei globale Hooks in einer DLL (sonst funktioieren sie nicht).
Ein Hook ist ein Keyboard Hook und bekommt alle Tastenanschlaege. Der zweite Hook ist ein WH_SHELL Hook, damit du Programmwechsel mitbekommst. Es koennte sonst eine falsch positive Erkennung geben, wenn ein Teil der Buchstaben in einem anderen Programm eingegeben wurden. Zum Posten der Tasten benutze keybd_event bzw SendInput. |
Re: Textergänzer
Das ist schon klar, aber darum geht es im Prinzip erstmal nicht, diese Erweiterung kann man ja später noch hinzufügen. Aber wie kann ich wenn das an das Handle von Memo gesand wird, das auslesen und sinnvoll verarbeiten?
|
Re: Textergänzer
Zitat:
Zitat:
|
Re: Textergänzer
Ich meine diese Fehlerabfabgen mit einer neuen Anwendung dass kann man später noch hinzufügen, aber ich versteh nicht wie ich das hinkriegen soll, das der Hook nicht die Ausgabe in das Memo macht sondern in irgendwas was ich auslesen kann, das Memo scheint beim auslesen leer.
|
Re: Textergänzer
Zitat:
Er gibt Deinem Programm bei jedem(!) Tastaturanschlag eine Meldung, welche Taste denn nun gedrückt oder losgelassen wurde (also pro Taste eigentlich sogar 2 Messages). Dein Hook liest den Tastaturanschlag, und speichert den am besten irgendwo zwischen. Danach wird der Tastaturanschlag an die normale Anwendung weitergeleitet (also in dem Fall wohl das Memo). Du prüfst also bei jedem Anschlag, ob die zuletzt zwischengespeicherten Tasten plus die aktuelle Dein Wort darstellen, wenn ja, dann vervollständigst Du das Wort indem Du mit keybd_event bzw. SendInput den restlichen Text abschickst. Achtung: Auch die selber gesendeten Zeichen des keybd_event lassen Deinen Hook reagieren. |
Re: Textergänzer
Das Ziel ist eigentlich, dass eine Gewisse Eingabe nicht ermöglicht wird, also das Wort falsch beendet wird oder die Events von dem Hook abgefangen und verändert werden.
Ich hab jez was gefunden, was in etwa meiner Vorstellung entspricht:
Delphi-Quellcode:
Aber wie zum Himmel kann ich das bearbeiten, sodass wenn ich beispielsweise ein m drücke ein b herauskommt?
library KeyboardHook;
uses Windows, Messages; var HookHandle: Cardinal = 0; WindowHandle: Cardinal = 0; function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin //es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen //it's possible to call CallNextHookEx conditional only. Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); case nCode < 0 of TRUE: exit; //wenn code kleiner 0 wird nix gemacht //if code smaller 0 nothing has to be done FALSE: begin //Hier kann jetzt alles bearbeitet werden //Here one can work with the parameters end; end; end; function InstallHook(Hwnd: Cardinal): Boolean; stdcall; begin Result := False; if HookHandle = 0 then begin //Erstmal Hook installieren //First install the hook HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc, HInstance, 0); //Uebergebenes Fensterhandle sichern //Save the given window handle WindowHandle := Hwnd; Result := TRUE; end; end; function UninstallHook: Boolean; stdcall; begin //Hook aus der Hookchain entfernen //Uninstall hook from hook chain Result := UnhookWindowsHookEx(HookHandle); HookHandle := 0; end; exports //Installations- und Deinstallationsroutine exportieren //Export the installation and deinstallation routine InstallHook, UninstallHook; end. |
Re: Textergänzer
In lparam bzw. wparam werden die Daten des Hooks geliefert, in dem Fall also die Taste bzw. auch noch den Status der Sondertasten (shift gedrückt? strg gedrückt?). Hier kannst Du also abfragen, welche Taste gedrückt wurde.
Den Wert der Taste ändern ist so über einen Hook nicht möglich. Es gibt da aber einen Workaround: Kommt ein 'm' musst Du als Rückgabe der Hook-Funktion einen Wert kleiner 0 zurückgeben. Das bedeutet, der Tastendruck wird nicht weitergereicht. Gleichzeitig sendest Du den Druck eines 'b'. Das wars dann eigentlich schon. Nachtrag: Weitere Informationen zu den Parametern im Hook stehen übrigens im MSDN: ![]() |
Re: Textergänzer
Wenn ich das verstandfen hab muss ich wenn in lparam oder wparam ein M vorkommt Result auf kleiner null zum Beispiel -1 Sezen, aber lparam und wparam sind doch longints, soll ich da VK_M oder was nehmen?
|
Re: Textergänzer
Ich hab das jez so umgeändert und jez funzts:
Delphi-Quellcode:
Danke nochmal für die Hilfe sonst hätt ich das nie geschafft, das hinzukriegen.
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):
LRESULT; stdcall; begin //es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen //it's possible to call CallNextHookEx conditional only. Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); case nCode < 0 of TRUE: exit; //wenn code kleiner 0 wird nix gemacht //if code smaller 0 nothing has to be done FALSE: begin if (wparam=$4D)or(lParam=$4D) then Result:=-1 end; end; end; cu Chris |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 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-2025 by Thomas Breitkreuz