AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Menü-Event aus Main window in DLL erhalten?
Thema durchsuchen
Ansicht
Themen-Optionen

Menü-Event aus Main window in DLL erhalten?

Ein Thema von HPW · begonnen am 3. Mär 2003 · letzter Beitrag vom 12. Mär 2003
Antwort Antwort
Seite 1 von 2  1 2      
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#1

Menü-Event aus Main window in DLL erhalten?

  Alt 3. Mär 2003, 22:02
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!
Hans-Peter
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2
  Alt 3. Mär 2003, 22: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.
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#3
  Alt 4. Mär 2003, 08: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.
Hans-Peter
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4
  Alt 4. Mär 2003, 11: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;
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#5
  Alt 4. Mär 2003, 18:31
Danke für den Code.
Werde ihn nachher ausprobieren.
Es gibt ja noch so viel zu lernen.
Hans-Peter
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#6
  Alt 5. Mär 2003, 18:44
Diese Zeile erzeugt beim Compilieren aber einen Fehler:

>SetWindowLong(hwnd, GWL_WNDPROC, @MyWndProc);

[Fehler]: Inkompatible Typen: 'Integer' und 'Pointer'
Hans-Peter
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7
  Alt 5. Mär 2003, 19:11
Dann musst du eben Typecasten: Integer(@MyWndProc).
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#8
  Alt 6. Mär 2003, 07: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.
Hans-Peter
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#9
  Alt 10. Mär 2003, 14: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?
Hans-Peter
  Mit Zitat antworten Zitat
HPW

Registriert seit: 28. Feb 2003
160 Beiträge
 
Delphi 7 Professional
 
#10
  Alt 12. Mär 2003, 07: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;
Hans-Peter
  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 03:32 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