AGB  ·  Datenschutz  ·  Impressum  







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

Probleme mit Hooks

Ein Thema von Alex_ITA01 · begonnen am 24. Nov 2004 · letzter Beitrag vom 13. Dez 2004
Antwort Antwort
Seite 2 von 4     12 34      
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#11

Re: Probleme mit Hooks

  Alt 24. Nov 2004, 14:52
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Probleme mit Hooks

  Alt 24. Nov 2004, 14:57
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#13

Re: Probleme mit Hooks

  Alt 26. Nov 2004, 13:44
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

MFG Alex
Angehängte Dateien
Dateityp: zip hook.zip (14,2 KB, 19x aufgerufen)
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#14

Re: Probleme mit Hooks

  Alt 2. Dez 2004, 15:39
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:

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


Ich hoffe ihr könnt mir helfen...
MFG Alex
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#15

Re: Probleme mit Hooks

  Alt 2. Dez 2004, 17:56
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
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#16

Re: Probleme mit Hooks

  Alt 3. Dez 2004, 13:45
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#17

Re: Probleme mit Hooks

  Alt 4. Dez 2004, 16:49
[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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#18

Re: Probleme mit Hooks

  Alt 5. Dez 2004, 21:19
@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 von Alex_ITA01:
Assarbad ich habe nur von deinem Tutorial ein wenig abgespeckt. Ich gebe zu, das der Source von dir stammt
Der Source ist mit Absicht frei. Also gibt's sicher kein Problem, solange man sich an die Lizenzvorgaben hält

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.
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#19

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 07:17
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#20

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 07:47
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 13:19 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