![]() |
Menü-Event aus Main window in DLL erhalten?
Ich habe eine DLL mit der ich einem Main-Window, von dem meine DLL gestartet wird, per API-Aufruf ein Menü erzeuge. Diese Main-Window ist eine Fremdanwendung mit Plugin-Schnittstelle. Ich komme also nicht direkt an die message-loop dieser Anwendung. Kann ich trotzdem irgenwie diese message mitbekommen um einen Menüevent zu erkennen und zu verarbeiten?
PS: Sehr nützlich waren dabei bisher die Tutorials von Michael Puff. Danke! |
Läuft die DLL im selben Adressraum wie das Main-Window? Wenn ja, dann könntest du die WindowProc des Hauptfensters auf eine eigene umbiegen und WM_COMMAND abfangen.
|
Wenn die DLL vom Main-window aufgerufen wird, ist das doch wohl so.
>die WindowProc des Hauptfensters auf eine eigene umbiegen und WM_COMMAND abfangen. Wie geht das Umbiegen denn? Ansonsten muss das Main-window natürlich ungestört weiter arbeiten können. Es geht nur um das Rausfischen der WM_COMMAND's die aus einer Menüwahl heraus entstehen. |
Delphi-Quellcode:
var
OrgWndProc: function(hwnd: HWND; Msg: Word; wParam: WPARAM; lParam: LPARAM): Integer; stdcall; function MyWndProc(hwnd: HWND; Msg: Word; wParam: WPARAM; lParam: LPARAM): Integer; stdcall; begin if Msg = WM_COMMAND then begin // Auswerten end; if Assigned(OrgWndProc) then Result := OrgWndProc(hwnd, Msg, wParam, lParam) else Result := DefWindowProc(hwnd, Msg, wParam, lParam); end; procedure HookWndProc(hwnd: HWND); begin @OrgWndProc := Pointer(GetWindowLong(hwnd, GWL_WNDPROC)); SetWindowLong(hwnd, GWL_WNDPROC, @MyWndProc); end; procedure UnHookWndProc(hwnd: HWND); begin SetWindowLong(hwnd, GWL_WNDPROC, @OrgWndProc); end; |
Danke für den Code.
Werde ihn nachher ausprobieren. Es gibt ja noch so viel zu lernen. :? |
Diese Zeile erzeugt beim Compilieren aber einen Fehler:
>SetWindowLong(hwnd, GWL_WNDPROC, @MyWndProc); [Fehler]: Inkompatible Typen: 'Integer' und 'Pointer' |
Dann musst du eben Typecasten: Integer(@MyWndProc).
|
Eben mal Typecasten! Wenn man weiss wie es funktioniert! :)
Also nochmal Danke für den Tip, jetzt funktioniert es wie gewünscht. Wieder eine Lektion gelernt. :!: |
Zu früh gefreut! Entwickelt auf XP und getestet auf WIN95. Läuft wie gewünscht. Dann mit ins Büro genommen.
WIN2K bricht die Anwendung mit Fehlermeldung ab und ein NT4 bringt einen Dr.Watson.
Delphi-Quellcode:
Diese Funktion durch Auskommentieren definitiv als Verursacher eingekreist. Laut delphi-Hilfe sind die Funktion aber unter NT verfügbar. Was kann das denn sein? Und warum laufen dann die beiden anderen Plattformen?
procedure HookWndProc(hwnd: HWND);
begin @OrgWndProc := Pointer(GetWindowLong(hwnd, GWL_WNDPROC)); SetWindowLong(hwnd, GWL_WNDPROC, Integer(@MyWndProc)); end; |
Nach der Duchsicht von Michael (Luckie) Puff's tutorial "Subclassing" mit dem Thema 'Die Standard-Fensterprozedur "umbiegen"' und der Übernahme einer Änderung läuft der Code jetzt auf allen Plattformen.
Danke Luckie!!
Delphi-Quellcode:
var
OrgWndProc: function(hwnd: HWND; Msg: Word; wParam: WPARAM; lParam: LPARAM): Integer; stdcall; function MyWndProc(hwnd: HWND; Msg: Word; wParam: WPARAM; lParam: LPARAM): Integer; stdcall; begin if Msg = WM_COMMAND then begin // Auswerten end; if Assigned(OrgWndProc) then //Hier geändert zu CallWindowProc! Result := CallWindowProc(@OrgWndProc, hwnd, Msg, wParam, lParam) else Result := DefWindowProc(hwnd, Msg, wParam, lParam); procedure HookWndProc(hwnd: HWND); begin @OrgWndProc := Pointer(GetWindowLong(hwnd, GWL_WNDPROC)); SetWindowLong(hwnd, GWL_WNDPROC, @MyWndProc); end; procedure UnHookWndProc(hwnd: HWND); begin SetWindowLong(hwnd, GWL_WNDPROC, @OrgWndProc); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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