AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

Ein Thema von Kostas · begonnen am 11. Mai 2020 · letzter Beitrag vom 16. Mai 2020
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.395 Beiträge
 
Delphi 12 Athens
 
#1

AW: HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

  Alt 11. Mai 2020, 18:12
Eigentlich schickt man Broadcasts nicht via SendMessage, sondern per PostMessage umher, dazumal man sowieso keine Rückgabewerte bekommen kann,
ansonsten musst du natürlich warten, bis ALLE TopLevel-Fenster fertig sind, womöglich auch mit der Fehlerbehandlung deiner "unverständlichen" Daten.

Gut, WM_COPYDATA schickt man natürlich via SendMessage an ein Programm Fenster,
und ich bin mir auch relativ sicher, dass man WM_COPYDATA eh nicht als Broadcast an ALLE versenden sollte,
und du willst nicht wissen was alles kaputt gehen kann, wenn irgendein Programm das Format deines WM_COPYDATA nicht versteht, weil es etwas Anderes erwartet.
Also siehe der Vorschlag meines Vorredners.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Mai 2020 um 18:22 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

  Alt 11. Mai 2020, 22:33
... oder nutze HWND_BROADCAST gar nicht.

Wenn du von App B den Namen des Fensters FB kennst, welches die WM_COPYDATA Meldungen auswerten soll, dann kannst du in App A das Handle HANDLE_B von FB mittels FinwdWindow ermitteln.

Danach sendest du deine Daten von FA nach FB mittels SendMessage( HANDLE_B, WM_COPYDATA, ... );

Etwa so:

https://www.delphipraxis.net/201045-..._copydata.html

Oder: Falls App A immer App B startet, dann kannst du beim Starten von App B als Parameter das Handle des Fensters FA übergeben. App B liest den Wert HANDLE_A via paramstr(..) aus.


Vielleicht interessiert dich in diesem Zusammenhang auch
WM_MEINEMELDUNG := RegisterWindowMessage( 'MeinePrivateMeldung' );

https://docs.microsoft.com/en-us/win...windowmessagea
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.395 Beiträge
 
Delphi 12 Athens
 
#3

AW: HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

  Alt 12. Mai 2020, 01:56
Zitat:
Wenn du von App B den Namen des Fensters FB kennst
Ich hoffe du meinst den Namen der Klasse und nicht die Caption, welche eventuell Statuswerte enthalten oder eine Übersetzung.

Unter dem Punkt Interprozesskommunikation (IPC) gibt es noch unzählige weitere Möglichkeiten.
Man kann sich sogar ein unsichtbares MessageOnlyWindow (ähnlich dem Application.Handle) selbst basteln und via GetWindowLong(GWL_USERDATA) direkt einen Handle/TCPPort/Sonstwas oder eben dort geziehlt WM_COPYDATA hinsenden/abfragen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.115 Beiträge
 
Delphi 12 Athens
 
#4

AW: HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

  Alt 12. Mai 2020, 06:56
Vielen Dank für die vielen Antworten.
Ich werde leider erste heute Abend dazu kommen mich damit zu beschäftigen.

Die Anwendung um die es geht ist eine MDI Anwendung. Da hatte ich massive Probleme das Handle zu bekommen, bzw. die Nachrichtien sind nie angekommen. Deshalb habe ich eine normale Form die zwar instantiiert jedoch nicht angezeigt wird und die Nachrichten per eigenen Event bereitstellt. Am liebsten wäre mir allerdings ein DataModul. Gibt es dafür auch eine Lösung oder muss es immer eine Form sein?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.676 Beiträge
 
Delphi 12 Athens
 
#5

AW: HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

  Alt 12. Mai 2020, 08:28
muss es immer eine Form sein?
Es kann jede beliebige Klasse sein. Man muss sie nur passend aufbereiten. Hier ein Basisgerüst:

Delphi-Quellcode:
type
  TMessageListener = class
  private
    FWindowHandle: HWND;
    procedure WndProc(var Msg: TMessage);
  public
    constructor Create;
    destructor Destroy; override;
  end;

constructor TMessageListener.Create;
begin
  inherited;
  FWindowHandle := AllocateHWnd(WndProc);
end;

destructor TMessageListener.Destroy;
begin
  if FWindowHandle <> 0 then
  begin
    DeallocateHWnd(FWindowHandle);
    FWindowHandle := 0;
  end;
  inherited;
end;

procedure TMessageListener.WndProc(var Msg: TMessage);
begin
  Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.115 Beiträge
 
Delphi 12 Athens
 
#6

AW: HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

  Alt 12. Mai 2020, 18:44
Hallo Uwe,

deinen Vorschlag mit der eigenen Klasse würde ich gerne umsetzen.

Ich habe folgenden Zustand: die gleichen source werden über zwei unterschiedliche .dpr Dateien kompiliert. Somit habe ich eine Eingang.exe und eine Ausgang.exe Die Anwendung selbst ist eine MDI-Anwendung. Ich könnte also eine zwei Klassen haben z.B.: TMessageListernerE und eine TMessageListernerA anlegen und über die .dpr entsprechend einbinden. Mit findWindow kann ich vermutlich nur sichtbare Formklassen finden. Gibt es eine Möglichkeit wie findWindow um die zwei Klassen TMessageListernerE und TMessageListernerA die auch keine Forms sind zu finden? Dann könnte ich gleich direkt adressieren und brauchte auch kein Broadcast um das handle an Eingang zu Ausgang und umgekehrt zu übertragen.

Alternativ könnten ich wenn findWindow auch unsichtbare Forms finden könnte, auch zwei Forms Eingang und Ausgang verwenden und in der jeweiligen Projektdatei entsprechend einbinden.

Zum nächsten, möchte die Nachricht versenden und NICHT warten bis die Anwendung antwortet. Sollte ich dafür besser PostMessage anstelle von SendMessage verwenden?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.676 Beiträge
 
Delphi 12 Athens
 
#7

AW: HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

  Alt 12. Mai 2020, 21:34
Ich habe folgenden Zustand: die gleichen source werden über zwei unterschiedliche .dpr Dateien kompiliert. Somit habe ich eine Eingang.exe und eine Ausgang.exe
Einen ähnlichen Fall habe ich gerade vor ein paar Wochen realisiert. Ich stelle die (anonymisierten) Units später hier bereit.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (12. Mai 2020 um 22:10 Uhr)
  Mit Zitat antworten Zitat
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
772 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: HWND_BROADCAST, ist relativ langsam, blockiert das System usw.

  Alt 12. Mai 2020, 08:02
Zitat:
Wenn du von App B den Namen des Fensters FB kennst
Ich hoffe du meinst den Namen der Klasse und nicht die Caption, welche eventuell Statuswerte enthalten oder eine Übersetzung.
Mir "völlig egal"* - wenn du willst auch gleich Klassenname und Windowstitel/Caption - Hauptsache ist: Der Wert muss systemweit eindeutig sein. Wenn Kostas ein unsichtbares Fenster nutzt, dann ändert Kostas wohl kaum was an der Caption.

* Ich nehme auch einen eindeutigen Klassennamen
Michael Gasser
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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