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 3 von 4     123 4      
Assarbad
(Gast)

n/a Beiträge
 
#21

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 08:28
Also das mit dem Kapseln in der Funktion ist schonmal richtig. Aber ob du direkt vom Hook aus darauf zugreifen kannst, weiß ich nicht. Der Normale Weg sollte ja sein, daß der Hook unabhängig von Code in einer Anwendung ist. Zumindest weitgehend. Also würde ich zB innerhalb der DLL immer während der Initialisierung eine Variable mit dem Fensterhandle setzen - danach dann auf diese lokale Variable zugreifen. Meinetwegen noch mit Checks wie: IsWindow(hWindowHandle) ...
  Mit Zitat antworten Zitat
Alex_ITA01

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

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 09:20
ich dachte, ich brauche keine DLL?!
Ich habe doch nur in der Komponente den MouseHook und ich brauche ihn ja auch nur dort.Daher wäre eine DLL nicht angebracht (denke ich zumindest...).
Ich weiß auch noch nicht so ganz wie ich daran komme...
Ich kannte mal eine Funktion, die mir glaube ich ein TControl zurückgibt, wo sich die Maus grade darüber befindet.Nur weiß ich nicht mehr wie die hieß....

MFG Alex
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#23

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 10:04
Ist ja korrekt, du brauchst auch keine DLL. Ich kenne aber deine Implementierung nicht, daher kann ich ja nur mutmaßen.
  Mit Zitat antworten Zitat
Alex_ITA01

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

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 10:09
ich habe doch oben den kompletten source stehen...
Ich werde ihn nochmal Posten:

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 }
    HintWnd : THintWindow;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    function GetHandle : HWND;

    procedure WMHint(var Message: TWMMouseMove); message WM_HINT;

    Constructor Create(AOwner:TComponent); override;
    Destructor Destroy; override;
    procedure Loaded; 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;
var
  MPos : TPoint;
  Komp : TControl;
begin
  if (wParam = WM_MOUSEMOVE) then
  begin
    GetCursorPos(MPos);
    
    Komp := FindDragTarget(MPos, True);

    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);
end;
{ ---------------------------------------------------------------------------- }
constructor THintCBx.Create(AOwner: TComponent);
begin
  inherited;
  HintWnd := THintWindow.Create(Self);
  HintWnd.Color := clInfoBk;
  ShowHint := True;
  MouseHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, 0, GetCurrentThreadId());
end;
{ ---------------------------------------------------------------------------- }
destructor THintCBx.Destroy;
begin
  HintWnd.Free;
  if MouseHook <> 0 then
    UnhookWindowsHookEx(MouseHook);
  inherited;
end;
{ ---------------------------------------------------------------------------- }
function THintCBx.GetHandle: HWND;
begin
  Result := Self.Handle;
end;
{ ---------------------------------------------------------------------------- }
procedure THintCBx.Loaded;
begin
  Inherited Loaded;
  if ComponentState = [csDesigning] then Exit;
end;
{ ---------------------------------------------------------------------------- }
procedure THintCBx.WMHint(var Message: TWMMouseMove);
var
  rec : TRect;
  MPos: TPoint;
  tmpHint : String;
begin
  if Assigned(HintWnd) then
  begin
    tmpHint := Hint;
    GetCursorPos(MPos);
    MPos := ScreenToClient(MPos);

    rec := Rect(Self.Left, Self.Top, Self.Left + Self.Width, Self.Top + Self.Height);
    if (PtInRect(rec, point(MPos.X + Self.Left, MPos.Y + Self.Top))) and (not Self.Enabled) and (Self.ShowHint) then
    begin
      GetCursorPos(MPos);
      HintWnd.Color := clInfoBk;
      HintWnd.ActivateHint(Rect(MPos.X + 15, MPos.Y, MPos.X + 20 + HintWnd.Canvas.TextWidth(tmpHint), MPos.Y + 15), tmpHint);
    end
    else
      HintWnd.ReleaseHandle;
  end;
  Message.Result := 1;
end;
{ ---------------------------------------------------------------------------- }

{ ---------------------------------------------------------------------------- }
end.
In der MouseProc experiementiere ich grade noch rum, daher geht das nicht zu compilieren...
Ich brauche dieses Handle der Komponente...

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
 
#25

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 11:06
also wie gesagt, ich brauche in der MouseProc nur das Handle damit ich meine Komponente informieren kann...
Die Komponente wertet dann die Werte aus

Hoffe du kannst mir helfen Assarbad...

MFG Alex
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#26

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 11:54
Immer mit der Ruhe, ein alter Mann ist kein D-Zug ... ich schau vermutlich am späten Nachmittag mal drauf. Hab schließlich auch andere Sachen zu tun.
  Mit Zitat antworten Zitat
Alex_ITA01

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

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 12:25
ja ist okay, wollte dich nicht hetzen
bis dann, alex
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Assarbad
(Gast)

n/a Beiträge
 
#28

Re: Probleme mit Hooks

  Alt 6. Dez 2004, 20:30
Tja, zum eigentlichen Problem (Callback als Methode) gibt es hier einen schönen Artikel:
http://bdn.borland.com/article/0,1410,22225,00.html

Laut Implementierung in Forms.pas könnte man das auch an deinen Fall anpassen. Fehlt mir aber aktuell die Zeit für solche Späßchen.

Die relevanten Funktionen aus Forms.pas sind:
function MakeObjectInstance(Method: TWndMethod): Pointer;
procedure FreeObjectInstance(ObjectInstance: Pointer);

Problem sind Kleinigkeiten in der Implementierung und der Typ "TWndMethod" ... die angepaßt werden müssten. TWndMethod hat nämlich 4 Parameter + Rückgabe ... eine HookProc nur 3 + Rückgabe.
  Mit Zitat antworten Zitat
Alex_ITA01

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

Re: Probleme mit Hooks

  Alt 7. Dez 2004, 07:35
okay danke @Assarbad
werde es bei gelegenheit mal probieren.

Ich dachte, dass Problem sei einfacher zu lösen ))) aber naja ich werde mich da mal reinfitzen.
Danke nochmals.
Schön Tag noch
MFG Alex
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#30

Re: Probleme mit Hooks

  Alt 7. Dez 2004, 09:19
Du bekommst die Mausposition nicht angezeigt weil die DLL in jedes Programm eingebunden wird. Das heißt die DLL wird merhmals geladen. Somit musst du in der DLL die Informationen erst zu deiner Anwendung schicken (welche du natürlich davor erstmal finden musst)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 18:02 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