Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi HWND_BROADCAST + WM_USER auf MDI (https://www.delphipraxis.net/66922-hwnd_broadcast-wm_user-auf-mdi.html)

andimx 6. Apr 2006 14:02


HWND_BROADCAST + WM_USER auf MDI
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute,

Ist wahrscheinlich einfacher als ich denk.
Ich hab mir selbst eine Registry (TrrRegistry Klasse) mir gebastelt, die jetzt von verschiedenen Orten aufgerufen wird. Wenn jetzt natürlich einer der Anwendungen eine änderung in der Registry macht, dann sollen auch die anderen Instanzen upgedatet werden.
Dies will ich durch eine Sendmessage(HWND_BROADCAST... erreichen... nur leider kommen keine Messages an.

Zudem hab ich jetzt auch in meiner Hauptform mehrere MDI Childs, z.B. der Registry Editor. Anbei mal ein Screenshot. Ich hab nun gelesen das mit HWND_BROADCAST nur Top-Level Fenster ansteuert. Aber nicht einmal da kommt was an.

Hier kurz zu meinem Code:

Delphi-Quellcode:
  // Die Message

  {$EXTERNALSYM RRPC_REGISTRY_UPDATE}
  RRPC_REGISTRY_UPDATE = WM_USER + 65;

  // z.B.
  TrrRegistryUpdate = class
   private
    procedure DoRegistryUpdate;
    procedure OnRegistryUpdate(var Message: TMessage); message RRPC_REGISTRY_UPDATE;
  end;
   
  implementation

   procedure TrrRegistryUpdate.DoRegistryUpdate;
    begin
     SendMessage(HWND_BROADCAST, RRPC_REGISTRY_UPDATE, hInstance, 0);
    end;

   procedure TrrRegistryUpdate.OnRegistryUpdate(var Message: TMessage);
    begin
     // Wenn message eintrifft...
     UpdateRegistry(..);
    end;

Irgendwelche Ideen???

Gruss

Andi

andimx 6. Apr 2006 14:19

Re: HWND_BROADCAST + WM_USER auf MDI
 
Kann es sein, das SendMessage, PostMessage, etc... nur auf HWND Handles reagieren??

andimx 6. Apr 2006 16:07

Re: HWND_BROADCAST + WM_USER auf MDI
 
So hab die Lösung:

Man muss natürlich erstmal ein eigenen Message Handler machen :-) Hier mal meine Lösung:

Die Klasse:

Delphi-Quellcode:
  TrrRegistryAutoUpdater = class(TThread)
   private
    FSignalShutdown : Boolean;
    FWinHandle     : HWND;
    FWaitMessage   : Cardinal;
    FOnMessage     : TNotifyEvent;
    procedure DeallocateHWnd(Wnd: HWND);
   published
    property OnMessage: TNotifyEvent read FOnMessage write FOnMessage;
   protected
    procedure Execute; override;
    procedure WndProc(var msg: TMessage);
   public
    constructor Create(Msg: Cardinal);
    destructor Destroy; override;
  end;
Der Code zur Klasse:

Delphi-Quellcode:
//------------------------------------------------------------------------------
// Regist
constructor TrrRegistryAutoUpdater.Create(Msg: Cardinal);
begin
        FSignalShutdown := False;
        FWinHandle     := AllocateHWND(WndProc);
        FreeOnTerminate := TRUE;
        FWaitMessage   := Msg;
        inherited Create(TRUE);
end;

destructor TrrRegistryAutoUpdater.Destroy;
begin
        inherited;
end;

procedure TrrRegistryAutoUpdater.WndProc(var msg: TMessage);
begin
        if Msg.Msg = FWaitMessage then begin
         if Assigned(FOnMessage) then FOnMessage(Self);
        end else
          Msg.Result := DefWindowProc(FWinHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;

procedure TrrRegistryAutoUpdater.Execute;
begin
        while not Terminated do begin
         Sleep(10);
        end;
        DeallocateHWnd(FWinHandle);
end;

procedure TrrRegistryAutoUpdater.DeallocateHWnd(Wnd: HWND);
var Instance: Pointer;
begin
  Instance := Pointer(GetWindowLong(Wnd, GWL_WNDPROC));
  if Instance <> @DefWindowProc then begin
   SetWindowLong(Wnd, GWL_WNDPROC, Longint(@DefWindowProc));
   FreeObjectInstance(Instance);
  end;
  DestroyWindow(Wnd);
end;

procedure TrrRegistryAutoUpdater.Shutdown;
begin
        Terminate;
end;

Jetzt noch die Message registrieren:

Delphi-Quellcode:
initialization
 WM_RRPC_UPDATEREGISTRY := RegisterWindowMessage('RRPCUpdateRegistry');
Vielleicht hilft es ja einem weiter :-)


Gruss Andi

Christian Seehase 6. Apr 2006 18:38

Re: HWND_BROADCAST + WM_USER auf MDI
 
Moin Andi,

[EDIT]
Als String für RegisterWindowMessage könntest Du gut ein GUID verwenden, damit Du sicher sein kannst, dass der String nicht schon registriert wurde.
[/EDIT]

andimx 7. Apr 2006 07:23

Re: HWND_BROADCAST + WM_USER auf MDI
 
Gute Idee ;-)


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