Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Messages in WndProc empfangen (https://www.delphipraxis.net/136875-messages-wndproc-empfangen.html)

Viktorii 9. Jul 2009 11:55


Messages in WndProc empfangen
 
Hallo Forum.

Ich bekomme von einer anderen Anwendung Messages in folgender Art geschickt:

Delphi-Quellcode:
  PostMessage (HWND_BROADCAST, WM_MY_MESSAGE, Param1, Param2);
Nun habe ich nach Recherche herausgefunden, dass ich zum empfangen eine Funktion hooken muss:

Delphi-Quellcode:
  ...
  ...
  function AppHookFunc(var Message: TMessage): Boolean;
  ...
  ...
  Application.HookMainWindow(AppHookFunc);
Wieso muss ich das machen und kann die Messages nicht in der WndProc empfangen?

Vielen Dank

Muetze1 9. Jul 2009 11:58

Re: Messages in WndProc empfangen
 
1. Broadcast sendet nur an die TopLevel in Windows. Dein Hauptformular sollte diese trotzdem auch bekommen.
2. Anstatt Hook MainForm solltest du sonst eher die WndProc der Hauptform nutzen oder alternativ Application.OnMessage Handler verwenden.
3. Warum WndProc? Wenn es nur um die eine Message geht kannst du einen direkten Messagehandler definieren.

Viktorii 9. Jul 2009 12:12

Re: Messages in WndProc empfangen
 
Zitat:

Zitat von Muetze1
1. Broadcast sendet nur an die TopLevel in Windows. Dein Hauptformular sollte diese trotzdem auch bekommen.

Bedeutet das, dass meine WndProc des Hauptfensters diese Nachrichten empfangen sollte?

Zitat:

Zitat von Muetze1
2. Anstatt Hook MainForm solltest du sonst eher die WndProc der Hauptform nutzen oder alternativ Application.OnMessage Handler verwenden.

Genau das möchte ich ja. Ich habe die WndProc überschrieben um dort die Messages zu empfangen. Nur leider scheinen sie dort nich anzukommen... Application.OnMessage werde ich mir mal anschauen...

Zitat:

Zitat von Muetze1
3. Warum WndProc? Wenn es nur um die eine Message geht kannst du einen direkten Messagehandler definieren.

Es geht um das Empfangen von mehreren Messages. Allerdings nur eine Message von einer anderen Anwendung. Interessanterweise kann ich appliktionsinterne (an die Hauptform gesendete) Messages in der WndProc empfangen und die gebroadcasteten anscheinend nicht. Was genau bedeutet einen direkten Messagehandler? Über Application.OnMessage?

Viktorii 10. Jul 2009 13:23

Re: Messages in WndProc empfangen
 
ich pushe mal :-D

Sprint 10. Jul 2009 14:36

Re: Messages in WndProc empfangen
 
Applikationsübergreifende Nachrichten im Stil von HWND_BROADCAST müssen im System mit MSDN-Library durchsuchenRegisterWindowMessage angemeldet werden.

Viktorii 10. Jul 2009 14:54

Re: Messages in WndProc empfangen
 
Zitat:

Zitat von Sprint
Applikationsübergreifende Nachrichten im Stil von HWND_BROADCAST müssen im System mit MSDN-Library durchsuchenRegisterWindowMessage angemeldet werden.

Ja, das habe ich schon gemacht....

Muetze1 10. Jul 2009 15:17

Re: Messages in WndProc empfangen
 
Zitat:

Zitat von Viktorii
Bedeutet das, dass meine WndProc des Hauptfensters diese Nachrichten empfangen sollte?

Ja, ganz genau.

Zitat:

Zitat von Viktorii
Zitat:

Zitat von Muetze1
3. Warum WndProc? Wenn es nur um die eine Message geht kannst du einen direkten Messagehandler definieren.

Es geht um das Empfangen von mehreren Messages. Allerdings nur eine Message von einer anderen Anwendung. Interessanterweise kann ich appliktionsinterne (an die Hauptform gesendete) Messages in der WndProc empfangen und die gebroadcasteten anscheinend nicht. Was genau bedeutet einen direkten Messagehandler? Über Application.OnMessage?

Nein, ich meinte direkte Message Handler Methoden, z.B.
Delphi-Quellcode:
...
  private
    procedure WMMyMessage(var Message: TMessage) message WMMYMESSAGE;
...
Hallo sprint, schön dich mal wieder zu lesen!

Sprint 10. Jul 2009 17:12

Re: Messages in WndProc empfangen
 
Zitat:

Zitat von Viktorii
Zitat:

Zitat von Sprint
Applikationsübergreifende Nachrichten im Stil von HWND_BROADCAST müssen im System mit MSDN-Library durchsuchenRegisterWindowMessage angemeldet werden.

Ja, das habe ich schon gemacht....

Sender und Empfänger müssen RegisterWindowMessage benutzen. Wenn du das gemacht hast, dann liegt der Fehler im Quellcode.


Zitat:

Zitat von Muetze1
Hallo sprint, schön dich mal wieder zu lesen!

Hallo Thomas,

auch nach mehrjähriger Abwesenheit, sind mir deine Beiträge die liebsten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:15 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