Seite 1 von 2

programm verbieten sich mermals offen zu haben

Verfasst: 15.12.2005 20:07
von sen-me
wie kann ich verhindern, das mein programm öfter als 1 mal gestartet wiurd?

ich wollte es so haben, das wenn das programm nochmal ausgeführt wird, dass es es nicht nochmal öffnet sondern das programm das schon offen ist makiert wird, also als würde man unten in taskleiste das programm angeklickt haben

Verfasst: 15.12.2005 20:11
von MVXA

Verfasst: 15.12.2005 20:30
von sen-me
thx, aber da wird dann immer das neu geöffnete fenster beibehalten, ich will aber das das fenster, das schon auf ist da bleibt, und da sneue weg geht

Verfasst: 15.12.2005 20:35
von Tafkadasom2k5
Genaue Ahnung habe ich nicht, aber eine Anregung:
Man könnte doch, eine Variable
OneInstant.s
in einen bestimmten Speicherbereich schreiben.

Bei jedem Start deines Programmes wird dieser Speicherbereich nach dieser Variablen über Pointer abgesucht (alternativ auch 3-4 verschiedene, falls der schon "besetzt" ist).
Wenn diese Variable mit dem Inhalt
"Instance already running" gefunden wird, dann öfnnet sich das ganze Fenster garnicht erst.

...Jetzt gebe ich weiter, an die
"Peek()" und "Poke()" Pro's... ;) (Oder ist mein Lösungsweg nicht möglich?)

Alternativ könntest du auch einen Reg-Eintrag machen, indem steht, das momentan dein Programm läuft...und beim Start deines Programs wird diese Variable gesetzt und beim schliessen gelöscht...
Wäre ne möglichkeit ohne direkt den Arbeitsspeicher anzusprechen...

Gr33tz
Tafkadasom2k5

Verfasst: 15.12.2005 20:39
von edel
[...]
Alternativ könntest du auch einen Reg-Eintrag machen, indem steht, das momentan dein Programm läuft...und beim Start deines Programs wird diese Variable gesetzt und beim schliessen gelöscht...
Wäre ne möglichkeit ohne direkt den Arbeitsspeicher anzusprechen...
... und nach einem Absturz kannste das Programm nie wieder
starten , oder wie ?

Verfasst: 15.12.2005 20:43
von Tafkadasom2k5
hallodri hat geschrieben:
[...]
Alternativ könntest du auch einen Reg-Eintrag machen, indem steht, das momentan dein Programm läuft...und beim Start deines Programs wird diese Variable gesetzt und beim schliessen gelöscht...
Wäre ne möglichkeit ohne direkt den Arbeitsspeicher anzusprechen...
... und nach einem Absturz kannste das Programm nie wieder
starten , oder wie ?
:bluescreen:

:iamwithstupid: stimmt auch wieder..
Also ne Sicherheit müsste man reinbauen...
OK...
2ter Versuch :mrgreen:

Du machst sozusagen 2 Variablen in die Reg...
In der ersten steht "Instance running" und in der zweiten steht "Sucessfully Closed".
Wenn nun "Instance running" gefunden wird, dann prüft er zusätzlich, ob letztesmal das Programm erfolgreich beendet wurde und startet es nach ner Userabfrage doch.

Gr33tz
Tafkadasom2k5

Verfasst: 15.12.2005 20:46
von MVXA
Und wenn man das Programm löscht, bleiben die Überreste dort liegen und
müllen die Registry zu. Danke schön!

Verfasst: 15.12.2005 20:49
von sen-me
also die 1. antwort find ich gut, da müsste man doch irgendwie machne könn das sich da sneue schließt nicht das alte

Verfasst: 15.12.2005 20:55
von MVXA

Code: Alles auswählen

ERROR_ALREADY_EXISTS = 183 
Global WM_ACTIVATEOLDINST 
WM_ACTIVATEOLDINST = RegisterWindowMessage_("WM_ACTIVATEOLDINST_PB") 
MutexName$ = "mylittletestapp" 

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)  
  Result = #PB_ProcessPureBasicEvents  
  If message = WM_ACTIVATEOLDINST
    SetForegroundWindow_(WindowID(0))
  EndIf 
  ProcedureReturn Result  
EndProcedure  

hMutex = CreateMutex_(0, 0, @MutexName$) 
If GetLastError_() = ERROR_ALREADY_EXISTS 
  SendMessage_(#HWND_BROADCAST, WM_ACTIVATEOLDINST, 0, 0) 
  Delay(100) 
  End
EndIf 


If OpenWindow(0,100,150,450,200,#PB_Window_SystemMenu,"MyLittleTestApp " + Str(Random(500))) 
  SetWindowCallback(@MyWindowCallback()) 
  Repeat 
    ev=WaitWindowEvent() 
  Until ev=#PB_EventCloseWindow 
EndIf 

CloseHandle_(hMutex) 
Das hättest du auch selbst programmieren können.

Verfasst: 15.12.2005 21:00
von AND51
Oder erstell stumpf in C:\ ene Textdatei wo du einfach 1 reinschreibst.
geht dein programm aus, löscht es die Datei oder schreibt 0 rein. Läuft dein Programm und eine zweite Instanz wird gestartet, prüft die einfach ob die Datei existiert oder eine 1 drinsteht und sagt "nene, Du, ich laufe bereits!"

Am besten Die Datei nicht in C:\ sondern im selben Ordner wie das Program speichern.