AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Eigene Anwendung bei Mehrfachstart beenden

Ein Thema von MiKaEr · begonnen am 7. Mär 2012 · letzter Beitrag vom 7. Mär 2012
Antwort Antwort
Seite 1 von 3  1 23   
MiKaEr
(Gast)

n/a Beiträge
 
#1

Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:38
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:41
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
MiKaEr
(Gast)

n/a Beiträge
 
#3

AW: Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:42
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"?
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:45
Ein Mutex ist übrigens eine doofe Idee auf einen Terminalserver.
Dann bekommt keiner mehr eine weitere Instanz auf.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:46
Du kannst Dir doch eine WM_COPYDATA-Message schicken, wenn Du Daten übermitteln willst.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
MiKaEr
(Gast)

n/a Beiträge
 
#6

AW: Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:50
das kannte ich noch nicht, klingt aber einleuchtend.

nur leider kann man nur zahlwerte und keine zeichenketten senden =/
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:54
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 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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:54
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:55
In den Parametern von WM_COPYDATA kannst du Zeiger auf Zeichenketten übergeben. Windows sorgt bei WM_COPYDATA dafür, dass das funktioniert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MiKaEr
(Gast)

n/a Beiträge
 
#10

AW: Eigene Anwendung bei Mehrfachstart beenden

  Alt 7. Mär 2012, 14:56
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));
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 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