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 Benutzer definierte Messages Handling (https://www.delphipraxis.net/134144-benutzer-definierte-messages-handling.html)

Tarry 16. Mai 2009 15:41


Benutzer definierte Messages Handling
 
Hi,
Ich moechte, dass wenn jemand mein Program zum zweiten mal oeffnet (Eine Instanz schon laeuft) sich die erste Instanz aus dem System Tray wiederherstellt.

Ich versuche dies mit der Hilfe von Windows Messages durchzusetzen, aber es funktioniert einfach nicht.
Entweder wird meine Message nicht gesendet oder nicht empfangen. Der Code wird nicht ausgefuert.

Ich bin mit meinem Latein am Ende...
Hier sind die betroffenen Code Schnipsel.

Beim Starten des Programms (Senden der Message):
Delphi-Quellcode:
uses
  [..]
  Messages
  [..]

const tAlreadyRunning = 'The program is already running !';
      AppName = 'Alarm Clock by Tarry91';
      [b]UM_RISEANDSHINE = WM_USER + 100;[/b]

var mHandle: THandle;   // Mutexhandle
 
begin
  mHandle := CreateMutex(nil,True,AppName);
  If GetLastError = ERROR_ALREADY_EXISTS
    Then begin
         // application.MessageBox(tAlreadyRunning, AppName, mb_ok+MB_ICONINFORMATION);
         [b]SendMessage(FindWindow(nil,pchar(AppName)),UM_RISEANDSHINE,0,0);[/b]
         end
    Else Begin
          Application.Initialize;              
          Application.Title:= 'Alarm Clock by Tarry91';
          Application.CreateForm(TMainForm, MainForm);
          Application.Run;
         End;
  If mHandle <> 0 Then CloseHandle(mHandle);
end.
In dem Hauptprogramm (Deklaration und Handling der Message):

Delphi-Quellcode:
[...]
const UM_RISEANDSHINE = WM_USER + 100;
[...]
procedure RiseAndShine(var Msg: TMessage); message UM_RISEANDSHINE;
Delphi-Quellcode:
procedure TMainForm.RiseAndShine(var Msg: TMessage);
begin
  ShowMessage('Test');
  MainForm.Show;
  Msg.Result := 1;
end;
Ich hoffe ihr koennt heraufinden, warum die Message nie ankommt :)

Danke schonmal,
Thomas

omata 16. Mai 2009 17:36

Re: Benutzer definierte Messages Handling
 
Delphi-Quellcode:
SendMessage(FindWindow(nil, pchar('MainForm')), UM_RISEANDSHINE, 0, 0);
FindWindow sucht nicht nach der Application sondern nach der Fenstercaption.

Tarry 16. Mai 2009 17:44

Re: Benutzer definierte Messages Handling
 
Zitat:

Zitat von omata
Delphi-Quellcode:
SendMessage(FindWindow(nil, pchar('Form1')), UM_RISEANDSHINE, 0, 0);
FindWindow sucht nicht nach der Application sondern nach der Fenstercaption.

Hi,
Aber meine Fenstercaption ist die gleiche, wie der Application name ("Alarm Clock by Tarry91"). :gruebel:
Gibt es eine Moeglichkeit zu checken ob FindWindow, das Fenster gefunden hat ?

Danke,
Thomas

omata 16. Mai 2009 17:45

Re: Benutzer definierte Messages Handling
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, der Rückgabewert von FindWindow muss <> 0 sein.

Tarry 16. Mai 2009 17:59

Re: Benutzer definierte Messages Handling
 
Zitat:

Zitat von omata
Ja, der Rückgabewert von FindWindow muss <> 0 sein.

Danke,
der Rueckgabewert ist <> 0 (2229586 um genau zu sein).
Kann es sein das die Message gesendet wird, aber nicht ankommt ?

Wie kann ich das testen ?

Gruss,
Thomas

omata 16. Mai 2009 18:00

Re: Benutzer definierte Messages Handling
 
Das Beispiel, das ich oben angehängt habe, funktioniert bei mir.

himitsu 16. Mai 2009 18:11

Re: Benutzer definierte Messages Handling
 
Programmübergreifende Messages sollte man auch nicht einfach so definieren.
Dafür gibt es MSDN-Library durchsuchenRegisterWindowMessage

ein Beispiel ist z.B. in dem dort angehängten Code zu finden,

oder in der DP
Hier im Forum suchenRegisterWindowMessage
OK, ich weiß daß die Suche da nix findet (das Wort ist zu lang), aber [google]RegisterWindowMessage site:delphipraxis.net[/google]

omata 16. Mai 2009 18:13

Re: Benutzer definierte Messages Handling
 
Liste der Anhänge anzeigen (Anzahl: 1)
Neues Beispiel

Tarry 16. Mai 2009 18:22

Re: Benutzer definierte Messages Handling
 
Zitat:

Zitat von omata
Neues Beispiel

Ich werde daraus nicht schlau :(
Ich kann einfach keinen Unterschied zwischen deiner und meiner Version finden :gruebel:
Koennte es daran liegen, dass ich die Komponente CoolTrayIcon benutze ?

Gruss,
Thomas

omata 16. Mai 2009 18:24

Re: Benutzer definierte Messages Handling
 
Funktioniert das Beispiel bei dir?

Tarry 16. Mai 2009 18:26

Re: Benutzer definierte Messages Handling
 
Zitat:

Zitat von omata
Funktioniert das Beispiel bei dir?

Ja, aber ich kann es nicht zum laufen bringen in meinem eigenem Code. :(

omata 16. Mai 2009 18:30

Re: Benutzer definierte Messages Handling
 
Schau dir mal die Deklaration der Konstanten an, die habe ich etwas anders gelöst.

Tarry 16. Mai 2009 18:49

Re: Benutzer definierte Messages Handling
 
Zitat:

Zitat von omata
Schau dir mal die Deklaration der Konstanten an, die habe ich etwas anders gelöst.

Meinst du, dass du die Constante (UM_RISEANDSHINE) nur einmal in der .pas Datei deklariert hast ?
Das macht keinen Unterschied, ich habs grade getestet.

omata 16. Mai 2009 19:15

Re: Benutzer definierte Messages Handling
 
Vielleicht ist es ja diese Zeile...
Delphi-Quellcode:
procedure TFMain.FormCreate(Sender: TObject);
begin
  Self.Caption:=cAppName;
  :

Tarry 16. Mai 2009 19:17

Re: Benutzer definierte Messages Handling
 
Zitat:

Zitat von omata
Vielleicht ist es ja diese Zeile...
Delphi-Quellcode:
procedure TFMain.FormCreate(Sender: TObject);
begin
  Self.Caption:=cAppName;
  :

Hab ich auch schon uebernommen & funktioniert immer noch nicht :(

SirThornberry 16. Mai 2009 19:18

Re: Benutzer definierte Messages Handling
 
Problem ist folgendes:
Mit FindWindow suchst du das Fenster welches als Caption 'Alarm Clock by Tarry91' hat.
Aller wahrscheinlichkeit findet FindWindow somit dein Application-Fenster der zuerst gestarteten Instanz.
Auf die Message reagierst du allerdings nicht beim Application-Object (dazu wäre die Komponente TApplicationEvents (oder so ähnlich) geeignet) sondern in einem anderen Fenster (deiner TMainForm-Instanz) an welche die Nachricht gar nicht geschickt wird.

Tarry 16. Mai 2009 19:29

Re: Benutzer definierte Messages Handling
 
Zitat:

Zitat von SirThornberry
Problem ist folgendes:
Mit FindWindow suchst du das Fenster welches als Caption 'Alarm Clock by Tarry91' hat.
Aller wahrscheinlichkeit findet FindWindow somit dein Application-Fenster der zuerst gestarteten Instanz.
Auf die Message reagierst du allerdings nicht beim Application-Object (dazu wäre die Komponente TApplicationEvents (oder so ähnlich) geeignet) sondern in einem anderen Fenster (deiner TMainForm-Instanz) an welche die Nachricht gar nicht geschickt wird.

?
Also die Message wird an der falschen Stelle erwarted ?
Wie kann ich das aendern ? Was muss ich aendern ?

Danke,
Thomas

omata 16. Mai 2009 19:34

Re: Benutzer definierte Messages Handling
 
Testweise würde ich erstmal das Application.Title auskommentieren.

Tarry 16. Mai 2009 19:41

Re: Benutzer definierte Messages Handling
 
Zitat:

Zitat von omata
Testweise würde ich erstmal das Application.Title auskommentieren.

... macht keinen Unterschied

@SirThornberry : Nachdem ich die Komponente TApplicationEvents aufs Hauptformular gezogen habe (wo die Message verwarbeited wird). Was muss ich machen ? Muss die Komponente auf alle Formulare des Programms ? Was is mit den Komponenten Ereignissen ? Ich werde nicht wirklich schlau aus der Delphi Hilfe :gruebel:

SirThornberry 16. Mai 2009 19:55

Re: Benutzer definierte Messages Handling
 
Bei TApplicationEvents musst du im Ereignis OnMessage überprüfen ob deine Message dabei ist. Wenn dies der Fall ist weißt du das deine Nachricht an eben direkt an die Application gesendet wurde.

omata 16. Mai 2009 19:59

Re: Benutzer definierte Messages Handling
 
Da macht man sich die Mühe ein Beispiel zu realisieren...

Tarry 16. Mai 2009 20:03

Re: Benutzer definierte Messages Handling
 
Zitat:

Zitat von omata
Da macht man sich die Mühe ein Beispiel zu realisieren...

Das is ja das merkwuerdige.
Ich bin dir sehr dankbar fuer dein Beispiel. Ich werde aber einfach nicht schlau, warum der gleiche code in deinem Beispiel funktioniert, nicht aber in meinem Programm :(

@SirThornberry: Das Ereigniss OnMessage wird nicht aktiviert, wenn der Windows API Befehl SendMessage benutzt wurde. (Steht SO in der Delphi Hilfe)

Tarry 16. Mai 2009 20:27

Re: Benutzer definierte Messages Handling
 
Hi,
danke an alle von euch !
Ich habe nun eine Loesung gefunden.

Das Problem war, dass ich mehrere Formulare mir der gleichen Caption hatte.
Wenn ich das Hauptforumlar umbennant habe, funktioniert es einwandfrei.

Danke nochma,
Thomas

SirThornberry 16. Mai 2009 21:17

Re: Benutzer definierte Messages Handling
 
Das war ein Denkfehler von mir. Du hast recht. SendMessage sendet direkt an die Messageprocedure und nicht in die Queue. Letzendlich lag es aber doch daran das an das falsche Fenster gesendet wurde.


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