Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi message kommt im Fenster nicht an (https://www.delphipraxis.net/145777-message-kommt-im-fenster-nicht.html)

R2009 8. Jan 2010 06:46


message kommt im Fenster nicht an
 
Hi,

In memo1 stehen die Handles aller Fenster der Applikation. Ich versuche an all diese Fenster eine Message zu schicken.
Nur kommt sie da nie an.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin   //cardinal(memo1.lines.Strings[i])
  for i:=0 to 1 do SendMessage(cardinal(memo1.lines.Strings[i]),SET_LNG_CMD,0,0);
end;
Hab ich mit dieser Funktion ermittelt:
Delphi-Quellcode:
function EnumWinx(hWnd: THandle; ProcID: PCardinal): Boolean; stdcall;
var
  WinProcId: cardinal;
  Text: AnsiString;
begin
  Result := True;
  if IsWindowVisible(hWnd) then
  begin
    GetWindowThreadProcessID(hWnd, WinProcId);
    if ProcID^ = WinProcId then
    begin
      form1.memo1.lines.add(inttostr(hwnd));
    end;
  end;
end;
Abgefangen werden die messages, in der jeweiligen Form mit:
Delphi-Quellcode:
const
  SET_LNG_CMD = WM_USER+2;
.....

procedure TForm1.GetMessages(var msg: TMsg; var handled: boolean);
begin
  if msg.message = SET_LNG_CMD then
  begin
    ......
    handled:=true;
  end;
end;
Was mach ich falsch? Warum kommt die Message nicht an?


Grüsse
Rainer

Alaitoc 8. Jan 2010 07:26

Re: message kommt im Fenster nicht an
 
Also ich bin mir nicht sicher...aber das var handled könnte Probleme machen.
Versuchs erstmal ohne?

Delphi-Quellcode:
const
  SET_LNG_CMD = WM_USER+2;

procedure GetMessages( var Msg: TMessage ); message SET_LNG_CMD;

procedure TForm1.GetMessages( var Msg: TMessage );
begin
  if msg.message = SET_LNG_CMD then
  begin
    ShowMessage('Blubb');
  end;
end;
Sonst überprüf vll mal die Handle-Eigenschaft der Forms und schau ob die Handles übereinstimmen mit deiner Liste?

MfG Alaitoc

R2009 8. Jan 2010 08:11

Re: message kommt im Fenster nicht an
 
Hi,

Hab die Handles verglichen, sind die gleichen.
Das Problem ist, dass die Message überhaupt nicht ankommt, also TForm1.GetMessages garnicht aufgerufen wird.
Allerdings kommt meine Message aus der gleichen Form...Vielleicht ist das das Problem.

Grüsse
Rainer

R2009 8. Jan 2010 08:16

Re: message kommt im Fenster nicht an
 
Hi,

geht auch aus einer anderen Form nicht:

Grüsse
rainer

Uwe Raabe 8. Jan 2010 08:22

Re: message kommt im Fenster nicht an
 
Dein Problem ist die Umwandlung von Integer in Strings und zurück. In die eine Richtung benutzt du korrekt IntToStr(hwnd), aber in die andere machst du einfach einen TypeCast [i]cardinal(memo1.lines.Strings). Das geht so nicht (Stichwort: TypeConversion vs. TypeCast)!

Versuch mal das: [i]StrToInt(memo1.lines.Strings)

R2009 8. Jan 2010 08:24

Re: message kommt im Fenster nicht an
 
Hi,
ich habe das ganze protokolliert:

Delphi-Quellcode:
procedure TForm1.GetMessages(var msg: TMsg; var handled: boolean);
var a:string;
begin
  memo3.Lines.Add(inttostr(msg.message));
  if msg.message = SET_LNG_CMD then
  begin
    a:='';
    // was ausgführt werden soll
    //handled:=true;
  end;
end;
Es kommt alles an nur meine eigenen Messages nicht. Kann es sein, das ganze findet ja innerhalb ein und derselben Applikation statt, dass die Message bereits von der application an sich abgefangen wird und erst garnicht beim Fenster ankommt.
Ich bin ziemlich ratlos.

Grüsse
Rainer

R2009 8. Jan 2010 08:29

Re: message kommt im Fenster nicht an
 
Hi Uwe,
hatte ich alles auch schon probiert. Funktioniert nicht.

[delphi]
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;text:ansistring;
begin
for i:=0 to memo1.lines.count-1 do
begin
SendMessage(strtoint(memo1.lines.Strings[i]),SET_LNG_CMD,1,0);
end;
end;

Ist da sonst noch irgendetwas falsch?

Grüsse
rainer

Alaitoc 8. Jan 2010 08:37

Re: message kommt im Fenster nicht an
 
Hast du auch mal versucht das ohne das Flag handled zu implementieren?
Also testweise? ( Wie oben in meinem Post )
Ich konnte nämlich irgendwie keinen Anwendungsfall finden, wo das so gemacht wird...

MfG Alaitoc

R2009 8. Jan 2010 08:47

Re: message kommt im Fenster nicht an
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
hab ich alles probiert. Ich häng mal meinen Quelltext an. das Ganze ist mit D7 prof erstellt.

Grüsse
rainer

Alaitoc 8. Jan 2010 08:49

Re: message kommt im Fenster nicht an
 
Nah dann hast du dir aber scheinbar meinen Code nicht genau angeschaut ;)

Delphi-Quellcode:
procedure GetMessages( var Msg: TMessage ); message SET_LNG_CMD; // Das Endstück fehlt
Das fehlt scheinbar bei dir bei deiner Deklaration.

MfG Alaitoc

R2009 8. Jan 2010 08:50

Re: message kommt im Fenster nicht an
 
Hi Alaitoc,

das handled gibt doch nur an die messagequeue weiter, dass das Ereigniss abgearbeitet ist und damit erledigt.
Das kann nicht das Problem sein. Soweit komm ich erst garnicht.

Grüsse
rainer

R2009 8. Jan 2010 08:57

Re: message kommt im Fenster nicht an
 
Hi Alaitoc,
da meckert der Compiler "unbekannte messagelist"
Aber wo hast du mir Code geschickt?
Es müsste doch aber eigentlich so sein dass getmessages bei jeder message durchlaufen wird oder?

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Button2: TButton;
    Memo3: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);

    procedure Button2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    private
    { Private-Deklarationen }
     procedure GetMessages(var msg: TMsg; var handled: boolean); message SET_LNG_CMD;
   s:pointer;
  public
    { Public-Deklarationen }
  end;
Grüsse
Rainer

PS: ich bin jetzt völlig daneben. Weiss garnichts mehr.

R2009 8. Jan 2010 09:03

Re: message kommt im Fenster nicht an
 
Hi Alaitoc,
hab kapiert was du meinst aber das funktioniert überhaupt nicht.
Delphi-Quellcode:
  Application.OnMessage:=GetMessages;
Compiler meckert: unterschiedliche Parameterliste.


Grüsse
rainer

Alaitoc 8. Jan 2010 09:04

Re: message kommt im Fenster nicht an
 
Delphi-Quellcode:
unit Unit1;

interface

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

const
  SET_LNG_CMD = WM_USER+2;

type
  TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
  private
    { Private-Deklarationen }
  protected
    procedure GetMessages(var msg: TMsg); message SET_LNG_CMD;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.GetMessages(var msg: TMsg);
begin
  ShowMessage('');
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  SendMessage( Self.Handle, SET_LNG_CMD, 0, 0 );
end;

end.
Also so zeigt er keinen Fehler an, also mit Message und ohne das Handled-Flag bei mir :)

MfG Alaitoc

Alaitoc 8. Jan 2010 09:07

Re: message kommt im Fenster nicht an
 
Ach du versuchst das mit dem OnMessage (Ereignis von TApplication) ?

Naja die Delphi-Hilfe sagt da eindeutig:

Hinweis: OnMessage kann nur für Botschaften in der Warteschlange verwendet werden, nicht aber für Botschaften, die direkt mit der API-Funktion SendMessage gesendet werden.


MfG Alaitoc

R2009 8. Jan 2010 09:15

Re: message kommt im Fenster nicht an
 
Hi Alaitoc,
das mit onmessage hab ich mittlerweile auch bemerkt.
leider funktioniert dein Vorschlag auch nicht.

Delphi-Quellcode:
procedure TForm1.GetMessages(var msg: TMsg);
begin
  if msg.message = SET_LNG_CMD then
  begin
    ShowMessage('hallo');
  end;
end;
Wenn du das hier versuchst wirst du merken, dass die message nicht ankommt.
Dein Programm reagiert nur auf den click event. das hat bei mir auch funktioniert.

Grüsse
Rainer

Alaitoc 8. Jan 2010 09:22

Re: message kommt im Fenster nicht an
 
Delphi-Quellcode:
unit Unit1;

interface

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

const
  SET_LNG_CMD = WM_USER+3;
  SET_LNG_CMD2 = WM_USER+4;

type
  TForm1 = class(TForm)
    procedure FormClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  protected
    procedure GetMessages(var msg: TMessage); message SET_LNG_CMD;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.GetMessages(var msg: TMessage);
begin
if Msg.Msg = SET_LNG_CMD then
begin
ShowMessage('hallo');
end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
  SendMessage( Self.Handle, SET_LNG_CMD, 0, 0 );
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   SendMessage( Self.Handle, SET_LNG_CMD2 , 0, 0 );
end;

end.
Jetzt aber...also:


1. GetMessages empfängt nur die SET_LNG_CMD, bei SET_LNG_CMD2 passiert nichts. ( Kannste ja mal umändern zum Testen )
2 Nun überprüfe ich ob Msg.Msg= SET_LNG_CMD ist und es klappt ( habe TMsg durch TMessage ausgetauscht)
3. Es funktioniert auch mit TMsg jedoch muss man dann Msg.HWND abfragen.

Edit: TMsg durch TMessage ersetzt, ist sinnvoller.

MfG Alaitoc

R2009 8. Jan 2010 09:31

Re: message kommt im Fenster nicht an
 
Hi,
bin bis jetzt immer davon ausgegangen, dass in msg.message SET_LNG_CMD steht.
Man lernt eben nie aus.

Grüsse
Rainer

Vielen Dank

Alaitoc 8. Jan 2010 09:38

Re: message kommt im Fenster nicht an
 
Wäre ich eigentlich auch, aber ich benutze eigentlich immer TMessage,
wenn ich überhaupt mal Messages benutze und das war bisher eigentlich
nur damit ich realisieren konnte das ein Objekt sich selbst freigibt.

Naja solang es nun funktioniert ist ja alles in Ordnung. :)

MfG Alaitoc

R2009 8. Jan 2010 09:41

Re: message kommt im Fenster nicht an
 
Hi,
jetzt funktionierts, danke. Nochmal der komplette Quellcode. Damit sende ich eine message an alle Fenster die die entsprechende Botschaftsmethode implementiert haben.

Delphi-Quellcode:
unit Unit1;

interface

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

const
  SET_LNG_CMD = WM_USER+2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Button2: TButton;
    procedure FormClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  protected
    procedure GetMessages(var msg: Tmessage); message SET_LNG_CMD;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 } 
function EnumWinx(hWnd: THandle; ProcID: PCardinal): Boolean; stdcall;
var
  WinProcId: cardinal;
  Text: AnsiString;
begin
  Result := True;
  if IsWindowVisible(hWnd) then
  begin
    GetWindowThreadProcessID(hWnd, WinProcId);
    if ProcID^ = WinProcId then
    begin
      SetLength(Text, SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0));
      SendMessage(hWnd, WM_GETTEXT, Length(Text)+ 1, integer(Text));
      //if Text = 'Unbenannt - Editor' then//Beispiel Text des gesuchten Fensters
      //ShowWindow(hWnd, SW_MINIMIZE);//bei dir dann SW_HIDE
      form1.memo2.lines.add(inttostr(hwnd));
      form1.memo3.lines.add(text);
    end;
  end;
end;

procedure TForm1.GetMessages(var msg: Tmessage);
begin
  memo1.Lines.Add(inttostr(msg.Msg));
  if msg.msg = SET_LNG_CMD then
  begin
    ShowMessage('hallo');
  end;
end;

procedure TForm1.FormClick(Sender: TObject);
begin
//  SendMessage( Self.Handle, SET_LNG_CMD, 0, 0 );
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
  For i:=0 to memo2.lines.Count-1 do SendMessage(strtoint(memo2.lines.Strings[i]), SET_LNG_CMD, 0, 0 );
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  memo1.Clear;
  memo2.Clear;
  memo3.Clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
  ProcID: Cardinal;
  WinProcId: Cardinal;
begin
  memo1.Clear;
  memo2.Clear;
  GetWindowThreadProcessID(application.Handle, WinProcId);
  EnumWindows(@EnumWinx, integer(@WinProcId));
end;

end.
Vielen Dank noch mal an Alaitoc!

Grüsse
Rainer


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