Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Textergänzer (https://www.delphipraxis.net/27306-textergaenzer.html)

cchris 7. Aug 2004 17:47


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:

Hierhttp://www.swissdelphicenter.ch/de/showcode.php?id=1722

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

Robert Marquardt 7. Aug 2004 18:44

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.

cchris 7. Aug 2004 19:31

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?

Phoenix 7. Aug 2004 19:34

Re: Textergänzer
 
Zitat:

Zitat von cchris
Das ist schon klar, aber darum geht es im Prinzip erstmal nicht

Doch, darum geht es im Prinzip im ersten Schritt schon.

Zitat:

Zitat von cchris
Aber wie kann ich wenn das an das Handle von Memo gesand wird, das auslesen und sinnvoll verarbeiten?

Ausschliesslich mit dem oben angegebenen Hook.

cchris 7. Aug 2004 20:02

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.

Phoenix 7. Aug 2004 20:32

Re: Textergänzer
 
Zitat:

Zitat von Robert Marquardt
Ein Hook ist ein Keyboard Hook und bekommt alle Tastenanschlaege. (...)
Zum Posten der Tasten benutze keybd_event bzw SendInput.

Der Keyboard Hook macht folgendes:
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.

cchris 7. Aug 2004 21:27

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:
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.
Aber wie zum Himmel kann ich das bearbeiten, sodass wenn ich beispielsweise ein m drücke ein b herauskommt?

Phoenix 7. Aug 2004 22:24

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: MSDN-Library durchsuchenKeyboardProc Function

cchris 8. Aug 2004 11:27

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?

cchris 8. Aug 2004 11:58

Re: Textergänzer
 
Ich hab das jez so umgeändert und jez funzts:

Delphi-Quellcode:
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;
Danke nochmal für die Hilfe sonst hätt ich das nie geschafft, das hinzukriegen.

cu Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 Uhr.
Seite 1 von 2  1 2      

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