![]() |
WindowProc einer Klasse?
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:
Vielen Dank im voraus...
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; |
Re: WindowProc einer Klasse?
![]() democode siehe ![]() ![]() btw: progress heisst "fortschritt" |
Re: WindowProc einer Klasse?
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 |
Re: WindowProc einer Klasse?
mit setwindowlong kannste die adresse der wndproc überschreiben, also deinen eignen handler aufrufen
|
Re: WindowProc einer Klasse?
puuhh, seh aber noch ne wie das geht. könntest du das oben in meinem code irgendwie verdeutlichen????
|
Re: WindowProc einer Klasse?
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; |
Re: WindowProc einer Klasse?
Ich habe 2 Fehler...
#1
Delphi-Quellcode:
Kommt bei mir der Fehler, dass eine Variable erwartet wird, und bei...
SetWindowLong(hWnd, GWL_WNDPROC, LongInt(@NewWndProc));
#2
Delphi-Quellcode:
...sagt er mir, dass nicht genügend Paramter vorhanden sind?
Result := CallWindowProc(OldWndProc, hWnd, Msg, wParam, lParam);
|
Re: WindowProc einer Klasse?
ich hatte ein @ vergessen, habs nun korrigiert... probier nochma
|
Re: WindowProc einer Klasse?
yo, kompiliert...aber klappen tut es nicht ganz ;) (Was nicht heißt, dass du etwas falsch gemacht hast)
Ich habe:
Delphi-Quellcode:
und bei NewWndProc steht
SetWindowLong(WindowHandle, GWL_WNDPROC,LongInt(@NewWndProc));
Delphi-Quellcode:
nach Begin, jedoch wird anscheinend die Funktion NewWndProc nie aufgerufen...
ShowMessage('Message');
WindowHandle wird wie folgt gefunden:
Delphi-Quellcode:
...wobei ClassName natürlich der Klassenname ist...
FindWindow( PChar(ClassName), nil);
Gibt es eine Möglichkeit, wie man überprüfen kann, ob alles richtig gesetzt wurde oder ähnliches. vielen Dank Florian |
Re: WindowProc einer Klasse?
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 |
Re: WindowProc einer Klasse?
oder probiere es mal mit klasseninstanz.handle oder .FHandle
|
Re: WindowProc einer Klasse?
Also:
SetWindowText funzt, d.h. der Handle wurde richtig gefunden...nur scheint SetWindowLong nicht wirklich zu funktionieren...auch
Delphi-Quellcode:
nicht, denn wenn es um
OldWndProc := TWndProc(Pointer(GetWindowLong(WindowHandle, GWL_WNDPROC)));
Delphi-Quellcode:
geht, so wird die Kondition nicht erfüllt, d.h. OldWndProc ist nil...
if @OldWndProc <> nil then
Meine Funktion schaut so aus:
Delphi-Quellcode:
siehe
function TRONPSTransClass.RestoreHandle():boolean;
begin if @OldWndProc <> nil then begin SetWindowLong( WindowHandle, GWL_WNDPROC, LongInt(@OldWndProc)); SetWindowText( WindowHandle, PChar('...')); Result := true; end; end; function TRONPSTransClass.InjectOwnHandle(): boolean; begin if(isWindow( WindowHandle )) then begin RestoreHandle(); OldWndProc := TWndProc(Pointer(GetWindowLong(WindowHandle, GWL_WNDPROC))); if @OldWndProc <> nil then begin SetWindowLong( WindowHandle, GWL_WNDPROC, LongInt(@NewWndProc)); SetWindowText( WindowHandle, PChar('...')); end; end; end; ![]() |
Re: WindowProc einer Klasse?
Es wird wohl etwas komplizierter als ich dachte:
Win32 SDK The SetWindowLong function fails if the window specified by the hWnd parameter does not belong to the same process as the calling thread. Vielleicht helfen die Informationen aus diesem thread weiter: ![]() marabu |
Re: WindowProc einer Klasse?
oh also jungs ich komm jetzt hier nicht mehr nach und versteh nur bahnhof ???
also ich will die Botschaft WM_RBUTTONDOWN aus der Klasse TTBPopupWindow abfangen. Könnt bitte jemand so nett sein und den hier geposteten code mal für mein Problem umstricken? Wäre sehr dankbar!? |
Re: WindowProc einer Klasse?
Delphi-Quellcode:
@neoxan: wenn du das mit einem fremd-progamm machen willst musst du eine dll machen und die im zielprozess laden
setmsghook(meineKomponente.handle);
CreateRemoteThread |
Re: WindowProc einer Klasse?
äm, die Klasse TTBPopupWindow besitzt aber igrendwie kein Handle-Wert!???
Vielleicht ist es ja eine andere Klasse, bloß wie finde ich das raus? |
Re: WindowProc einer Klasse?
die klasse hab ich nicht, such doch einfach im source nach hwnd oder handle
dann solltest du die entsprechende property finden falls es sich um ein popupmenü handelt kann es jedoch gut möglich sein, dass es gar kein eigenes handle gibt |
Re: WindowProc einer Klasse?
naja, das weiß ich ne, bloß ich weiß das WinSpy mir die Botschaft anzeigt, also muss sie auch irgendwie abfangbar sein!
|
Re: WindowProc einer Klasse?
Hallo Frank,
als Entschädigung für das vorübergehende (und unbeabsichtigte) thread hijacking habe ich dir etwas Code in deinem ursprünglichen thread hinterlassen: ![]() Grüße vom marabu |
Re: WindowProc einer Klasse?
hi. danke, aber jetzt dreht es sich nur noch um die Toolbar2000.
Warum, habe ich dir auf dein Posting in meinem alten Thema beantwortet. ![]() trotzdem danke für deine mühe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 Uhr. |
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