Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Menü-Event aus Main window in DLL erhalten? (https://www.delphipraxis.net/3257-menue-event-aus-main-window-dll-erhalten.html)

HPW 3. Mär 2003 21:02


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!

jbg 3. Mär 2003 21:36

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.

HPW 4. Mär 2003 07:28

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.

jbg 4. Mär 2003 10:24

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;

HPW 4. Mär 2003 17:31

Danke für den Code.
Werde ihn nachher ausprobieren.
Es gibt ja noch so viel zu lernen. :?

HPW 5. Mär 2003 17:44

Diese Zeile erzeugt beim Compilieren aber einen Fehler:

>SetWindowLong(hwnd, GWL_WNDPROC, @MyWndProc);

[Fehler]: Inkompatible Typen: 'Integer' und 'Pointer'

jbg 5. Mär 2003 18:11

Dann musst du eben Typecasten: Integer(@MyWndProc).

HPW 6. Mär 2003 06:50

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. :!:

HPW 10. Mär 2003 13:14

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:
procedure HookWndProc(hwnd: HWND);
 begin
  @OrgWndProc := Pointer(GetWindowLong(hwnd, GWL_WNDPROC));
  SetWindowLong(hwnd, GWL_WNDPROC, Integer(@MyWndProc));
 end;
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?

HPW 12. Mär 2003 06:51

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.
Seite 1 von 2  1 2      

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