![]() |
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 |
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:
Grüsse
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; Rainer PS: ich bin jetzt völlig daneben. Weiss garnichts mehr. |
Re: message kommt im Fenster nicht an
Hi Alaitoc,
hab kapiert was du meinst aber das funktioniert überhaupt nicht.
Delphi-Quellcode:
Compiler meckert: unterschiedliche Parameterliste.
Application.OnMessage:=GetMessages;
Grüsse rainer |
Re: message kommt im Fenster nicht an
Delphi-Quellcode:
Also so zeigt er keinen Fehler an, also mit Message und ohne das Handled-Flag bei mir :)
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. MfG Alaitoc |
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 |
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:
Wenn du das hier versuchst wirst du merken, dass die message nicht ankommt.
procedure TForm1.GetMessages(var msg: TMsg);
begin if msg.message = SET_LNG_CMD then begin ShowMessage('hallo'); end; end; Dein Programm reagiert nur auf den click event. das hat bei mir auch funktioniert. Grüsse Rainer |
Re: message kommt im Fenster nicht an
Delphi-Quellcode:
Jetzt aber...also:
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. 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 |
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 |
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 |
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:
Vielen Dank noch mal an Alaitoc!
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. Grüsse Rainer |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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