AGB  ·  Datenschutz  ·  Impressum  







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

WindowProc einer Klasse?

Ein Thema von TriphunEM · begonnen am 1. Feb 2006 · letzter Beitrag vom 4. Feb 2006
Antwort Antwort
Seite 1 von 2  1 2      
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#1

WindowProc einer Klasse?

  Alt 1. Feb 2006, 12:16
Hallo,

ich weiß nicht wie ich den folgenden Code ergänzen soll um die Windows-Botschaften einer Klasse einer Komponente abzufangen!
Der Code funktioniert wenn ich die eigentliche Komponente nehme (siehe Kommentare). Da aber die Klasse scheinbar ein eigenes Fensterhandle hat, komm ich so nicht ran.

Die Klasse heißt TTBToolbar !

Delphi-Quellcode:
private
  OldProgressWndProc: TWndMethod;
  procedure ProgressWndProc(var Msg: TMessage);
...
procedure TForm1.FormCreate(Sender: TObject);
var Index: integer;
begin
  // OldProgressWndProc:=TBToolbar1.WindowProc;
  // TBToolbar1.WindowProc:=ProgressWndProc;
  OldProgressWndProc:= ???
  ???:=ProgressWndProc;
end;

procedure TForm1.ProgressWndProc(var Msg: TMessage);
begin
  if msg.Msg = WM_RBUTTONDOWN then
  begin
    // Hier soll meine Aktion ausgeführt werden.
  end;
  OldProgressWndProc (Msg);
end;
Vielen Dank im voraus...
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 11. Feb 2005
193 Beiträge
 
#2

Re: WindowProc einer Klasse?

  Alt 1. Feb 2006, 13:08
MSDN-Library durchsuchenSetWindowLong

democode siehe Hier im Forum suchenSize Grip // suche scheint nicht zu funktionieren: http://www.delphipraxis.net/internal...ca28132447e449

btw: progress heisst "fortschritt"
  Mit Zitat antworten Zitat
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#3

Re: WindowProc einer Klasse?

  Alt 1. Feb 2006, 14:04
von SetWindowLong hab ich auch schon gehört, aber wie ich das anwenden soll hab ich keine ahnung!

Was ich nicht verstehe, der Code von Size Grip was hat das mit meinem Problem zu tun. ich finde da garnix was mir weiterhilft!

?

thx
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 11. Feb 2005
193 Beiträge
 
#4

Re: WindowProc einer Klasse?

  Alt 1. Feb 2006, 14:17
mit setwindowlong kannste die adresse der wndproc überschreiben, also deinen eignen handler aufrufen
  Mit Zitat antworten Zitat
TriphunEM

Registriert seit: 8. Jan 2004
147 Beiträge
 
#5

Re: WindowProc einer Klasse?

  Alt 1. Feb 2006, 18:19
puuhh, seh aber noch ne wie das geht. könntest du das oben in meinem code irgendwie verdeutlichen????
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 11. Feb 2005
193 Beiträge
 
#6

Re: WindowProc einer Klasse?

  Alt 1. Feb 2006, 21:52
Delphi-Quellcode:
// code ist aus flocke's sizegrip unit ausgeliehen, thx nochma :P
type
  TWndProc = function (hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

var
  OldWndProc: TWndProc;

function NewWndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

  function CallOld: LRESULT;
  begin
    Result := CallWindowProc(@OldWndProc, hWnd, Msg, wParam, lParam);
  end;

begin
  // Result := DefWindowProc(hWnd, Msg, wParam, lParam); // standardWndProc aufrufen

  case Msg of
    WM_DESTROY: begin
      SetWindowLong(hWnd, GWL_WNDPROC, LongInt(@OldWndProc));
      result := callold;
    end;

    WM_PAINT: Begin
      // dein code ^.^
    end;

    else
      Result := CallOld;
  end;
end;

procedure RemoveMsgHook(hWnd: HWND);
begin
  if @OldWndProc <> nil then
    SetWindowLong(hWnd, GWL_WNDPROC, LongInt(@OldWndProc));
end;

procedure SetMsgHook(hWnd: HWND);
begin
  RemoveMsgHook(hWnd);
  OldWndProc := TWndProc(Pointer(GetWindowLong(hWnd, GWL_WNDPROC)));
  SetWindowLong(hWnd, GWL_WNDPROC, LongInt(@NewWndProc));
end;
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#7

Re: WindowProc einer Klasse?

  Alt 2. Feb 2006, 15:38
Ich habe 2 Fehler...

#1
SetWindowLong(hWnd, GWL_WNDPROC, LongInt(@NewWndProc)); Kommt bei mir der Fehler, dass eine Variable erwartet wird, und bei...

#2
Result := CallWindowProc(OldWndProc, hWnd, Msg, wParam, lParam); ...sagt er mir, dass nicht genügend Paramter vorhanden sind?
  Mit Zitat antworten Zitat
Benutzerbild von retnyg
retnyg

Registriert seit: 11. Feb 2005
193 Beiträge
 
#8

Re: WindowProc einer Klasse?

  Alt 2. Feb 2006, 16:17
ich hatte ein @ vergessen, habs nun korrigiert... probier nochma
  Mit Zitat antworten Zitat
NeoXan
(Gast)

n/a Beiträge
 
#9

Re: WindowProc einer Klasse?

  Alt 2. Feb 2006, 17:29
yo, kompiliert...aber klappen tut es nicht ganz (Was nicht heißt, dass du etwas falsch gemacht hast)

Ich habe:
SetWindowLong(WindowHandle, GWL_WNDPROC,LongInt(@NewWndProc)); und bei NewWndProc steht
ShowMessage('Message'); nach Begin, jedoch wird anscheinend die Funktion NewWndProc nie aufgerufen...
WindowHandle wird wie folgt gefunden:
FindWindow( PChar(ClassName), nil); ...wobei ClassName natürlich der Klassenname ist...

Gibt es eine Möglichkeit, wie man überprüfen kann, ob alles richtig gesetzt wurde oder ähnliches.

vielen Dank
Florian
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: WindowProc einer Klasse?

  Alt 2. Feb 2006, 17:42
Die Gültigkeitsprüfung für deinen Fenstergriff hast du schon gemacht - dann kannst du noch mit SetWindowText() probeweise die Form.Caption verändern um zu sehen, ob du das richtige Fenster erwischt hast.

Grüße vom marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 05:51 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