![]() |
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 |
Re: HWND_BROADCAST + WM_USER auf MDI
Kann es sein, das SendMessage, PostMessage, etc... nur auf HWND Handles reagieren??
|
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:
Der Code zur Klasse:
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;
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:
Vielleicht hilft es ja einem weiter :-)
initialization
WM_RRPC_UPDATEREGISTRY := RegisterWindowMessage('RRPCUpdateRegistry'); Gruss Andi |
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] |
Re: HWND_BROADCAST + WM_USER auf MDI
Gute Idee ;-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:53 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