Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Probleme mit Hooks (https://www.delphipraxis.net/34539-probleme-mit-hooks.html)

Alex_ITA01 24. Nov 2004 14:52

Re: Probleme mit Hooks
 
bin auch grade auf die Spur gekommen, das systemweite Hooks in DLL's müssen.
Okay habe auch ein Beispiel im Netz gefunden von -Assarbad-

Danke nochmals

MFg Alex

Luckie 24. Nov 2004 14:57

Re: Probleme mit Hooks
 
Zitat:

Zitat von Alex_ITA01
bin auch grade auf die Spur gekommen, das systemweite Hooks in DLL's müssen.

Äh, wir sind davon ausgegangen, dass so etwas grundlegendes über Hooks bekannt ist. :gruebel:

Alex_ITA01 26. Nov 2004 13:44

Re: Probleme mit Hooks
 
Liste der Anhänge anzeigen (Anzahl: 1)
da bin ich wieder... :-)
hab jetzt mal versucht den Hook in eine DLL einzubinden.
Nur leider weiß ich echt nicht, was ich falsch mache.Das Programm zeigt mir einfach keine X und Y Koordinaten an.Bitte helft mir (klingt ja fast wie: "Bitte melde dich" *ggg*)

Wäre echt toll wenn ihr mir ein Rat geben könntet woran es liegt.
Source für DLL und Formular liegt bei.

Assarbad ich habe nur von deinem Tutorial ein wenig abgespeckt. Ich gebe zu, das der Source von dir stammt :-D

MFG Alex

Alex_ITA01 2. Dez 2004 15:39

Re: Probleme mit Hooks
 
ich wollte mal fragen, wenn ich jetzt ein NICHT-Systemweiten Hook habe, brauche ich den ja nicht in eine DLL einbinden oder?

Funktioniert das, dass ich ein Hook in eine Komponente einbinde?
Ich habe es so probiert:

Delphi-Quellcode:
unit HintCheckBox;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Messages, Windows, Graphics, ExtCtrls;

type
  THintCheckBox = class(TCheckBox)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    MouseHook : HHOOK;
    Constructor Create(AOwner:TComponent); override;
    Destructor Destroy; override;
  published
    { Published-Deklarationen }
  end;

  function MouseProc(nCode : Integer; wParam: WPARAM; lParam : LPARAM): LRESULT; stdcall;

{ ---------------------------------------------------------------------------- }
procedure Register;
{ ---------------------------------------------------------------------------- }
implementation
{ ---------------------------------------------------------------------------- }
procedure Register;
begin
  RegisterComponents('Beispiele', [THintCheckBox]);
end;
{ ---------------------------------------------------------------------------- }
{ THintCheckBox }
{ ---------------------------------------------------------------------------- }
function MouseProc(nCode : Integer; wParam: WPARAM; lParam : LPARAM): LRESULT; stdcall;
begin
  case nCode < HC_ACTION of
    True :
      Result := CallNextHookEx(MouseHook, nCode, wParam, lParam);
  else
     //.....IRGENDWAS
    Result := CallNextHookEx(MouseHook, nCode, wParam, lParam);
  end;
end;
{ ---------------------------------------------------------------------------- }
constructor THintCheckBox.Create(AOwner: TComponent);
begin
  inherited;
  MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadId());
end;
Nur leider kennt er die Variable MouseHook in der Funktion "MouseProc" nicht. Ist ja logisch aber wenn ich die Funktion selber mit in den PRIVATE-Teil schreibe dann meckert der Compiler bei folgender Zeile:

Delphi-Quellcode:
  MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadId());
Variable erwartet an der Stelle: @MouseProc


Ich hoffe ihr könnt mir helfen...
MFG Alex

Muetze1 2. Dez 2004 17:56

Re: Probleme mit Hooks
 
Moin!

Ein Journalhook ist auch systemweit, benötigt aber keine DLL und kann in der Application eingebunden werden. Daher ist das mit der DLL keine zwingende Vorraussetzung.

MfG
Muetze1

Alex_ITA01 3. Dez 2004 13:45

Re: Probleme mit Hooks
 
also ich bin jetzt auf dem Stand, das ich in der Hook-Funktion eine Message an meine Komponente schicken will.Nur leider kenne ich das Handle der Komponente nicht.Könnt ihr mir bitte helfen?

Delphi-Quellcode:
unit HintCBx;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Messages, Windows, Graphics, ExtCtrls;

const
  WM_HINT = WM_USER + 1;

type
  THintCBx = class(TCheckBox)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WMHint(var Message: TWMMouseMove); message WM_HINT;

    Constructor Create(AOwner:TComponent); override;
    Destructor Destroy; override;
  published
    { Published-Deklarationen }
  end;

  function MouseProc(nCode : Integer; wParam: WPARAM; lParam : LPARAM): LRESULT; stdcall;

var
  MouseHook    : HHOOK;
{ ---------------------------------------------------------------------------- }
procedure Register;
{ ---------------------------------------------------------------------------- }
implementation
{ ---------------------------------------------------------------------------- }
procedure Register;
begin
  RegisterComponents('Beispiele', [THintCBx]);
end;
{ ---------------------------------------------------------------------------- }
{ THintCBx }
{ ---------------------------------------------------------------------------- }
function MouseProc(nCode : Integer; wParam: WPARAM; lParam : LPARAM): LRESULT; stdcall;
begin
  if (wParam = WM_MOUSEMOVE) then
  begin
    if ControlHandle <> 0 then
    begin
      //SendMessage(ControlHandle,WM_MOUSEMOVE,wParam,lParam);
      SendMessage(HANDLE,WM_HINT,wParam,lParam);
    end;
  end;
  Result := CallNextHookEx(MouseHook,nCode,wParam,lParam);
end;
{ ---------------------------------------------------------------------------- }
constructor THintCBx.Create(AOwner: TComponent);
begin
  inherited;
  MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadId());
end;
{ ---------------------------------------------------------------------------- }
destructor THintCBx.Destroy;
begin
  if MouseHook <> 0 then
    UnhookWindowsHookEx(MouseHook);
  inherited;
end;
In WM_HINT erfolgt dann meine Auswertung...
Nur ich brauche das Komponenten-Handle für SendMessage?!
Hoffe ihr könnt mir helfen

MFG Alex

Alex_ITA01 4. Dez 2004 16:49

Re: Probleme mit Hooks
 
[push!!!]

Hat keiner eine Idee, wie ich an das "Komponenten-handle" herankomme um SendMessage in dem MouseHook zu verwenden?!
Ich wäre über jeden Lösungsvorschlag erfreut....

MFG Alex

Assarbad 5. Dez 2004 21:19

Re: Probleme mit Hooks
 
@Muetze: Journal-Hooks sind aber ursprünglich als Accessibility-Feature gedacht gewesen (also zur Erleichterung für Behinderte), nicht um sie als Maushook zu mißbrauchen. Hooks haben negativen Einfluß auf die Systemperformance (wenn auch nur gering), deshalb sollte man den passenden benutzen.

@Alex: Problem Problem ... du verstehst offenbar noch nicht, wie Klassen im Speicher liegen. Man kann auch statische Funktionen (sowas brauchst du für die Callback) in einem Objekt haben, dies ist aber absolut nicht zu empfehlen. Stattdessen sollte eine Callback-Funktion außerhalb des Objektes liegen und mit dem Objekt über dessen Interfaces kommunizieren. Das Problem mit Methoden von Klassen/Objekten ist, daß man deren Position im Speicher mit @ nicht zuverlässig ermitteln kann!

Zitat:

Zitat von Alex_ITA01
Assarbad ich habe nur von deinem Tutorial ein wenig abgespeckt. Ich gebe zu, das der Source von dir stammt :-D

Der Source ist mit Absicht frei. Also gibt's sicher kein Problem, solange man sich an die Lizenzvorgaben hält :-D

Zitat:

Zitat von Alex_ITA01
also ich bin jetzt auf dem Stand, das ich in der Hook-Funktion eine Message an meine Komponente schicken will.Nur leider kenne ich das Handle der Komponente nicht.Könnt ihr mir bitte helfen?

...

In WM_HINT erfolgt dann meine Auswertung...
Nur ich brauche das Komponenten-Handle für SendMessage?!
Hoffe ihr könnt mir helfen

Ganz simpel. TCheckBox hat ein Handle, also mußt du in deiner Komponente diese Eigenschaft nur als Public deklarieren, einen Wrapper schreiben oder eine Readonly-Property einführen, die den Wert zurückgibt. Dennoch gilt obiges für statische Funktionen.

Alex_ITA01 6. Dez 2004 07:17

Re: Probleme mit Hooks
 
okay danke @Assarbad...
also ich werde jetzt das CheckBox-Handle "veröffentlichen" und darüber kann ich dann also zugreifen? Ich hoffe das funktioniert so einfach wie es sich anhört :-))
also danke nochmal,werde es dann gleich mal testen
MFG Alex

Alex_ITA01 6. Dez 2004 07:47

Re: Probleme mit Hooks
 
also das Handle lasse ich mir jetzt so geben:

Delphi-Quellcode:
type
  THintCBx = class(TCheckBox)
  private
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    function GetHandle : HWND;
    //...
  end;

function THintCBx.GetHandle: HWND;
begin
  Result := Self.Handle;
end;
Kann ich da in meinem MouseHook jetzt so darauf zugreifen oder wie mache ich das jetzt?

Delphi-Quellcode:
var
  Test : THintCBx;
begin
  if (wParam = WM_MOUSEMOVE) then
  begin
    if Test.GetHandle <> 0 then
    begin
      //SendMessage(ControlHandle,WM_MOUSEMOVE,wParam,lParam);
      SendMessage(Test.GetHandle,WM_HINT,wParam,lParam);
    end;
  end;
  Result := CallNextHookEx(MouseHook,nCode,wParam,lParam);
MFG Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:44 Uhr.
Seite 2 von 4     12 34      

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