AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Textergänzer

Ein Thema von cchris · begonnen am 7. Aug 2004 · letzter Beitrag vom 10. Aug 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von cchris
cchris

Registriert seit: 16. Jun 2003
Ort: Taucha
71 Beiträge
 
Delphi 2005 Personal
 
#1

Textergänzer

  Alt 7. Aug 2004, 18:47
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
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: Textergänzer

  Alt 7. Aug 2004, 19:44
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.
  Mit Zitat antworten Zitat
Benutzerbild von cchris
cchris

Registriert seit: 16. Jun 2003
Ort: Taucha
71 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Textergänzer

  Alt 7. Aug 2004, 20:31
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?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#4

Re: Textergänzer

  Alt 7. Aug 2004, 20:34
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 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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von cchris
cchris

Registriert seit: 16. Jun 2003
Ort: Taucha
71 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Textergänzer

  Alt 7. Aug 2004, 21:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#6

Re: Textergänzer

  Alt 7. Aug 2004, 21:32
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von cchris
cchris

Registriert seit: 16. Jun 2003
Ort: Taucha
71 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Textergänzer

  Alt 7. Aug 2004, 22:27
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?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#8

Re: Textergänzer

  Alt 7. Aug 2004, 23:24
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
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von cchris
cchris

Registriert seit: 16. Jun 2003
Ort: Taucha
71 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Textergänzer

  Alt 8. Aug 2004, 12:27
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?
  Mit Zitat antworten Zitat
Benutzerbild von cchris
cchris

Registriert seit: 16. Jun 2003
Ort: Taucha
71 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Textergänzer

  Alt 8. Aug 2004, 12:58
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:39 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