AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi HWND_BROADCAST + WM_USER auf MDI
Thema durchsuchen
Ansicht
Themen-Optionen

HWND_BROADCAST + WM_USER auf MDI

Ein Thema von andimx · begonnen am 6. Apr 2006 · letzter Beitrag vom 7. Apr 2006
Antwort Antwort
andimx

Registriert seit: 14. Apr 2005
Ort: Hohenstein-Ernstthal
67 Beiträge
 
#1

HWND_BROADCAST + WM_USER auf MDI

  Alt 6. Apr 2006, 14:02
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
Miniaturansicht angehängter Grafiken
rra_369.jpg  
  Mit Zitat antworten Zitat
andimx

Registriert seit: 14. Apr 2005
Ort: Hohenstein-Ernstthal
67 Beiträge
 
#2

Re: HWND_BROADCAST + WM_USER auf MDI

  Alt 6. Apr 2006, 14:19
Kann es sein, das SendMessage, PostMessage, etc... nur auf HWND Handles reagieren??
  Mit Zitat antworten Zitat
andimx

Registriert seit: 14. Apr 2005
Ort: Hohenstein-Ernstthal
67 Beiträge
 
#3

Re: HWND_BROADCAST + WM_USER auf MDI

  Alt 6. Apr 2006, 16:07
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
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: HWND_BROADCAST + WM_USER auf MDI

  Alt 6. Apr 2006, 18:38
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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
andimx

Registriert seit: 14. Apr 2005
Ort: Hohenstein-Ernstthal
67 Beiträge
 
#5

Re: HWND_BROADCAST + WM_USER auf MDI

  Alt 7. Apr 2006, 07:23
Gute Idee
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:22 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