Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Eigene Anwendung bei Mehrfachstart beenden (https://www.delphipraxis.net/166958-eigene-anwendung-bei-mehrfachstart-beenden.html)

MiKaEr 7. Mär 2012 14:38

Eigene Anwendung bei Mehrfachstart beenden
 
ich versuche gerade meine eigene anwendung zum test bei einem 2. start zu beenden. dazu suche ich das handle meiner anwendung BEVOR es gestartet wird.
wurde das fenster gefunden bedeutet das, dass meine anwendung bereits offen ist. also sende ich eine message mit SC_CLOSE.

Delphi-Quellcode:
begin
 hExisting := FindWindow('TMeinTestForm', nil);
 if hExisting <> 0 then
  begin
   SetForegroundWindow(hExisting);

   SendMessage(hExisting, WM_SYSCOMMAND, SC_CLOSE, 0);

   Halt(1);
  end;

 Application.Initialize;
 // ...
auf meiner form ist ein TApplicationEvent und dort steht im OnMessage-Event:

Delphi-Quellcode:
 if Msg.message = WM_SYSCOMMAND then
  if Msg.wParam = SC_CLOSE then
   showmessage('X');
sollte ich bei einem zweiten start meines programms nicht ein "X" zu sehen bekommen?

Sir Rufo 7. Mär 2012 14:41

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Um zu erkennen, ob eine Anwendung mehrfach gestartet wurde bietet sich eigentlich ein Hier im Forum suchenMutex an.

Und es ist eigentlich einfacher, die neu gestartete Programm-Instanz einfach nicht starten zu lassen, als die schon laufende zu Beenden ;)

MiKaEr 7. Mär 2012 14:42

AW: Eigene Anwendung bei Mehrfachstart beenden
 
das ist leider aber meine aufgabe die bereits laufende zu beenden, daraufhin wieder neuzustarten und mit gewissen parametern aufzuführen ;)

eine andere idee wäre über sendmessage einen integer zu senden, und den bei applicationevents on-message auszuwerten. dann bräuchte ich den neustart nicht.

aber wie komme ich bei OnMessage an genau diese "nachricht"?

generic 7. Mär 2012 14:45

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Ein Mutex ist übrigens eine doofe Idee auf einen Terminalserver.
Dann bekommt keiner mehr eine weitere Instanz auf.

DeddyH 7. Mär 2012 14:46

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Du kannst Dir doch eine WM_COPYDATA-Message schicken, wenn Du Daten übermitteln willst.

MiKaEr 7. Mär 2012 14:50

AW: Eigene Anwendung bei Mehrfachstart beenden
 
das kannte ich noch nicht, klingt aber einleuchtend.

nur leider kann man nur zahlwerte und keine zeichenketten senden =/

Sir Rufo 7. Mär 2012 14:54

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Zitat:

Zitat von generic (Beitrag 1155097)
Ein Mutex ist übrigens eine doofe Idee auf einen Terminalserver.
Dann bekommt keiner mehr eine weitere Instanz auf.

Wieso das denn nicht?

Doku lesen ;)

Zitat:

Zitat von Microsoft
On a server that is running Terminal Services, a named system mutex can have two levels of visibility. If its name begins with the prefix "Global\", the mutex is visible in all terminal server sessions. If its name begins with the prefix "Local\", the mutex is visible only in the terminal server session where it was created. In that case, a separate mutex with the same name can exist in each of the other terminal server sessions on the server. If you do not specify a prefix when you create a named mutex, it takes the prefix "Local\". Within a terminal server session, two mutexes whose names differ only by their prefixes are separate mutexes, and both are visible to all processes in the terminal server session. That is, the prefix names "Global\" and "Local\" describe the scope of the mutex name relative to terminal server sessions, not relative to processes.


DeddyH 7. Mär 2012 14:54

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Zitat:

Zitat von MiKaEr (Beitrag 1155105)
nur leider kann man nur zahlwerte und keine zeichenketten senden =/

Wieso das denn? Schau Dir die COPYDATASTRUCT-Struktur mal genau an, vor allem das letzte Feld.

Luckie 7. Mär 2012 14:55

AW: Eigene Anwendung bei Mehrfachstart beenden
 
In den Parametern von WM_COPYDATA kannst du Zeiger auf Zeichenketten übergeben. Windows sorgt bei WM_COPYDATA dafür, dass das funktioniert.

MiKaEr 7. Mär 2012 14:56

AW: Eigene Anwendung bei Mehrfachstart beenden
 
das mit dem "letzten feld", verstehe ich übrhaupt nicht.

ich sende meinen "string" nun im ascii-format:

Delphi-Quellcode:
     iNew := 0;

     for i := 0 to Length(ParamStr(2)) - 1 do
      iNew := iNew + Ord(ParamStr(2)[i]);

     SendMessage(hExisting, WM_COPYDATA, iNew, 0);
und egal was ich mache, folgendes trifft, warum auch immer, nie ein:

Delphi-Quellcode:
 if Msg.message = WM_COPYDATA then
   showmessage(inttostr(Msg.wParam));

DeddyH 7. Mär 2012 14:58

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Lesen bildet:
Zitat:

An application sends the WM_COPYDATA message to pass data to another application.

#define WM_COPYDATA 0x004A

Parameters

wParam

A handle to the window passing the data.
lParam

A pointer to a COPYDATASTRUCT structure that contains the data to be passed.

Und wie diese Struktur aussieht, habe ich eben schon verlinkt.

MiKaEr 7. Mär 2012 15:01

AW: Eigene Anwendung bei Mehrfachstart beenden
 
das habe ich bereits gelesen aber ich verstehe es einfach nicht, deswegen wandle ich meinen string doch in ein integer-konstrukt um.

ich bekomme es ja scheinbar gesendet, aber ich kann es nicht empfangen.

Luckie 7. Mär 2012 15:03

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Klick doch einfach mal auf die Links die dir gegeben werden. Dann siehst du, dass du einen Record füllen musst und als Parameter an WM_COPYDATA übergeben musst.

Zitat:

Zitat von MiKaEr (Beitrag 1155115)
das habe ich bereits gelesen aber ich verstehe es einfach nicht, deswegen wandle ich meinen string doch in ein integer-konstrukt um.

Und du meinst, Windows weiß, dass du es nicht verstehst und ändert für dein Programm die Implementation von WM_COPYDATA? :roll:

DeddyH 7. Mär 2012 15:04

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Hier im Forum suchenWM_COPYDATA Da wird doch wohl mindestens ein Beispiel zu finden sein.

MiKaEr 7. Mär 2012 15:06

AW: Eigene Anwendung bei Mehrfachstart beenden
 
auf seite zwei steht doch was ich abgeändert habe:

Zitat:

Zitat von MiKaEr (Beitrag 1155110)
das mit dem "letzten feld", verstehe ich übrhaupt nicht.

ich sende meinen "string" nun im ascii-format:

Delphi-Quellcode:
     iNew := 0;

     for i := 0 to Length(ParamStr(2)) - 1 do
      iNew := iNew + Ord(ParamStr(2)[i]);

     SendMessage(hExisting, WM_COPYDATA, iNew, 0);
und egal was ich mache, folgendes trifft, warum auch immer, nie ein:

Delphi-Quellcode:
 if Msg.message = WM_COPYDATA then
   showmessage(inttostr(Msg.wParam));


DeddyH 7. Mär 2012 15:08

AW: Eigene Anwendung bei Mehrfachstart beenden
 
:wall: WM_COPYDATA erwartet als 2. Parameter zwingend einen Zeiger auf die nun schon mehrfach angesprochene Struktur (ein Record). Wenn Du etwas anderes reinpackst, darfst Du Dich nicht wundern, dass es nicht funktioniert.

Sir Rufo 7. Mär 2012 15:09

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Zitat:

Zitat von MiKaEr (Beitrag 1155115)
das habe ich bereits gelesen aber ich verstehe es einfach nicht, deswegen wandle ich meinen string doch in ein integer-konstrukt um.

ich bekomme es ja scheinbar gesendet, aber ich kann es nicht empfangen.

Ja, aber was sendest du denn da?

Vereinfachen wir das mal mit dem Wort
Code:
SUB (keine ASCII-Werte, sondern A=1, Z=26)

S = 19
U = 21
B = 2

19 + 21 + 2 = 42
Du sendest also den Wert 42 an das Programm ;)

Luckie 7. Mär 2012 15:09

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Noch mal. WM_COPYDATA erwartet dort einen Zeiger auf eine Struktur und nichts anderes. Und wenn du nicht das übergibst, was Windows erwartet, dann funktioniert es eben nicht.

MiKaEr 7. Mär 2012 15:19

AW: Eigene Anwendung bei Mehrfachstart beenden
 
eigentlich war das alles nur als übung gedacht und somit um "weiterzukommen".

stattdessen muss man sich in diesem forum von den, so nennen sie sich wahrscheinlich selbst, "großen" anhören

Zitat:

Lesen bildet
oder
Zitat:

:wall:
unter einem forum mit "netten leuten" die auch für scheinbar "dumme anfänger" nette antworten haben, stelle ich mir was anderes vor!

DeddyH 7. Mär 2012 15:20

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Nun hatte ich gerade eine Demo erstellt, aber wenn jemand lieber brüllt anstatt ein Minimum an Eigeninitiative zu zeigen, spare ich mir das Posten. Gute Nacht.

MiKaEr 7. Mär 2012 15:22

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Zitat:

aber wenn jemand lieber brüllt anstatt ein Minimum an Eigeninitiative zu zeigen,
ich habe niemals gesagt, dass ich keine eigeninitiative zeige. und dass ich das problem mittlerweile nicht selbst bereits gelöst habe, habe ich auch nicht gesagt.

demzufolge, um aufzuräumen: das problem ist aus der welt und gelöst!

Bummi 7. Mär 2012 15:25

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Du hast völlig recht ... die Helfer hier im Forum solltem jedem, der nicht bereit ist 100.000 * erklärte Sachen nachzulesen, zum 100001 mal hinschreiben.

MiKaEr 7. Mär 2012 15:30

AW: Eigene Anwendung bei Mehrfachstart beenden
 
ironie scheint man wohl zu abonnieren, wenn man sich hier im forum registriert.

Sir Rufo 7. Mär 2012 19:24

AW: Eigene Anwendung bei Mehrfachstart beenden
 
Zitat:

Zitat von MiKaEr (Beitrag 1155095)
das ist leider aber meine aufgabe die bereits laufende zu beenden, daraufhin wieder neuzustarten und mit gewissen parametern aufzuführen ;)

Zitat:

Zitat von MiKaEr (Beitrag 1155128)
eigentlich war das alles nur als übung gedacht und somit um "weiterzukommen".

Was war das denn nun, eine (Haus-)Aufgabe oder eine (Finger-)Übung?

MiKaEr 7. Mär 2012 19:37

AW: Eigene Anwendung bei Mehrfachstart beenden
 
eine hausaufgabe war es nicht.

ich versuche mich einfach mit der delphi-sprache vertraut zu machen, da ich ursprünglich eine komplett andere gelernt hatte.

ich nannte es "aufgabe", da ich es mir zum ziel gesetzt hatte, diese umsetzen zu können.


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