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 Warum funktionieren meine Messages nicht? (https://www.delphipraxis.net/117155-warum-funktionieren-meine-messages-nicht.html)

Masteric 12. Jul 2008 23:50


Warum funktionieren meine Messages nicht?
 
Hi,

also ich habe das mit dem Hooken hinbekommen, so jetzt möchte ich die Daten die der Hook abfaängt an meine Anwendung über Messages senden, es kommt nur, wie wahrscheinlich erwartet, nichts an.

Ich habe dann um es überhaupt zu testen noch eine 2. Anwendung programmiert.

Die Erste, die die Daten erstmal nur Empfangen und in einem Edit anzeigen soll, sieht so aus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const WM_mymessage=WM_User+2;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
  private
    procedure WndProc(var msg : TMessage); override;
      { Private-Deklarationen }
  public
       { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WndProc(var msg : TMessage);
begin
  if msg.Msg = WM_mymessage then
  begin
    Edit1.Text:=inttostr(msg.WParam);
  end else begin
    inherited WndProc(msg);
  end;
end;

end.
Die Zweite, die ich zum testen benutze sieht so aus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
const WM_mymessage=WM_User+2;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
postmessage(HWND_BROADCAST,WM_mymessage,5,5);
end;

end.
Da ich das Fensterhandle der Anwendung nicht immer rausfinden will, broadcaste ich sie einfach an alle. Eigentlich sollte doch jetzt im Edit 1 eine Message ankommen, wenn das Empfangsprogramm läuft und das 2. gestartet wird, oder?

Gruß Materic

Flips 13. Jul 2008 00:18

Re: Warum funktionieren meine Messages nicht?
 
Hi,

also ich bin nich so der Fachmann für Messages, aber ich glaube nicht, dass sie für den Datenverkehr bzw. den Austausch größerer Datenmengen konzipiert wurden ;-)
Da eignen sich eher Hier im Forum suchenMemory Mapped Files (Hier im Forum suchenMMF).
Oder du suchst mal nach Hier im Forum suchenWM_SETTEXT.

1234588 13. Jul 2008 02:14

Re: Warum funktionieren meine Messages nicht?
 
mit HWND_BROADCAST sendest du die message eben nicht an alle fenster. folgendes hab ich hier dazu gefunden:
http://www.delphipraxis.net/internal...ct.php?t=87443

Zitat:

also ich bin nich so der Fachmann für Messages, aber ich glaube nicht, dass sie für den Datenverkehr bzw. den Austausch größerer Datenmengen konzipiert wurden
das ist richtig. aber einen 4 byte großen integer sehe ich nicht als riesen datenmenge an :P

Luckie 13. Jul 2008 10:36

Re: Warum funktionieren meine Messages nicht?
 
Zitat:

Zitat von 1234588
mit HWND_BROADCAST sendest du die message eben nicht an alle fenster.

Natürlich wird eine Nachtricht mit dem Adressaten HWND_BROADCAST an alle Toplevel Fenster geschickt. Nur leider macht ihm hier die VCL einen Strich durch die Rechnung mit dem unsichtbaren Anwendungsfenster, welches bei einer VCL-Anwendung das Hauptfenster ist.

Masteric 13. Jul 2008 10:44

Re: Warum funktionieren meine Messages nicht?
 
ist den der Empfang der Messages richtig? Weil selbst wenn ich genau an das Handle des Fensters sende, kommt nichts an....

Luckie 13. Jul 2008 10:46

Re: Warum funktionieren meine Messages nicht?
 
Das Empfangen dürfte passen, aber stimmt auch das Handle?

Masteric 13. Jul 2008 10:48

Re: Warum funktionieren meine Messages nicht?
 
ich habe via Winspy das handle des Form1 rausgesucht, ist das falsch? Weil ya das Hauptfenster unsichtbar ist?

EDIT: Okay muss mich korrigieren, jetzt geht es mit dem richtigen Handle, nur wie mache ich das, wenn ich das nicht weis.....

_frank_ 13. Jul 2008 10:56

Re: Warum funktionieren meine Messages nicht?
 
wie "unsichtbar" ist es? per hide oder minimiert?

evtl. ist ja TApplication.OnMessage was für dich, hat mir schon öfters bei solchen Sachen geholfen...

das handle kann du z.B. mittels Hier im Forum suchenFindWindow oder Hier im Forum suchenEnumWindows herausfinden.

//edit irgendwie war nur der halbe Text sichtbar...hier beim editieren steht alles :gruebel:

HTH Frank

Luckie 13. Jul 2008 10:57

Re: Warum funktionieren meine Messages nicht?
 
Such dein Fenster mit MSDN-Library durchsuchenFindWindow.

extrem 13. Jul 2008 11:09

Re: Warum funktionieren meine Messages nicht?
 
Zitat:

Zitat von Masteric
EDIT: Okay muss mich korrigieren, jetzt geht es mit dem richtigen Handle, nur wie mache ich das, wenn ich das nicht weis.....

In Beitrag #3 wurde dir ein Link genannt, wo es mit HWND_BROADCAST funktioniert. Mit FindWindow bei sowas zu machen wäre mir viel zu primitiv.
Wenn du mit HWND_BROADCAST arbeiten möchtest dann benutze RegisterWindowMessage(), außerdem wäre es notwendig, wenn du die Nachricht mit der Komponente TApplicationEvents im Ereignis onMessage abfängst.

Masteric 13. Jul 2008 13:54

Re: Warum funktionieren meine Messages nicht?
 
danke für den letzten Tipp, ich habe es jetzt mit findwindow() realisiert. :wall: Da hätte ich auch selber draf kommen können :wall:

naja trotzdem danke für alle Tipps. :-D

Luckie 13. Jul 2008 15:42

Re: Warum funktionieren meine Messages nicht?
 
Zitat:

Zitat von extrem
Mit FindWindow bei sowas zu machen wäre mir viel zu primitiv.
Wenn du mit HWND_BROADCAST arbeiten möchtest dann benutze RegisterWindowMessage(),

Es ist dir zu primitiv die Funktion dafür zu verwenden, die dafür gedacht ist? Stattdessen findest du es besser, wenn man die Nachricht mehr oder weniger wahllos an alle Fenster verschickt, in der Hoffnung, das richtige wird schon dabei sei?

extrem 13. Jul 2008 20:24

Re: Warum funktionieren meine Messages nicht?
 
Das ist deine Interpretation...

Damit wollte ich nur darauf hinweisen, dass FindWindow unter Umständen unzuverlässig sein kann, falls auch noch ein anderes Fenster mit der selben Beschriftung gerade offen ist. In der Beziehung habe ich schon schlechte Erfahrungen gemacht.

Zitat:

Zitat von Luckie
Stattdessen findest du es besser, wenn man die Nachricht mehr oder weniger wahllos an alle Fenster verschickt, in der Hoffnung, das richtige wird schon dabei sei?

Da muss ich wohl eher mit FindWindow hoffen, dass das richtige Fenster gefunden wurde. In der Beziehung, ist die Kombination von HWND_BROADCAST und RegisterWindowMessage() wohl eher zuverlässiger.

Er möchte das ja für seinen Hook benutzen, da habe ich immer beim Laden der DLL das Handle des Fensters meiner Anwendung als Parameter mit übergeben. An nur dieses Fensterhandle habe ich die Nachrichten gesendet, es geht also auch ohne FindWindow.

Luckie 14. Jul 2008 09:23

Re: Warum funktionieren meine Messages nicht?
 
Ok, der Argumentation kann ich folgen. ;)

Apollonius 14. Jul 2008 09:58

Re: Warum funktionieren meine Messages nicht?
 
Zitat:

Zitat von extrem
Er möchte das ja für seinen Hook benutzen, da habe ich immer beim Laden der DLL das Handle des Fensters meiner Anwendung als Parameter mit übergeben. An nur dieses Fensterhandle habe ich die Nachrichten gesendet, es geht also auch ohne FindWindow.

Wie funktioniert das bei globalen Hooks? Das Fenster-Handle ist ja dann nicht in allen DLL-Instanzen verfügbar.

RavenIV 14. Jul 2008 10:41

Re: Warum funktionieren meine Messages nicht?
 
Mir ist ja nicht ganz klar, was gemacht werden soll.
Trotzdem werfe ich mal "NamedPipes" in den Raum.
Da kann man Daten MB-weise drüber "verschicken".
Und der Overhead ist nicht so gross wie bei Messages.


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