Seite 1 von 2
Herausfinden, ob mein Programm schon gestartet wurde
Verfasst: 29.10.2006 19:00
von RSBasic
Hi ihr, ich habe nach einem Code gesucht, um herauszufinden, ob mein Programm schon gestartet wurde. Dabei fiel mir auf, dass die so aufwendig sind. Ich meine auch nicht, dass die über 10 Zeilen haben, aber immerhin. Ich habe für normale User einen Beispiel geschrieben, was sehr einfach zu verstehen ist.
Hier ist mein Code:
Code: Alles auswählen
handle=FindWindow_(0,"Programmtitel")
If IsWindow_(handle)=1
End
EndIf
Verfasst: 30.10.2006 11:18
von bluejoke
Das funktioniert ja aber nur, wenn das Programm ein Fenster mit einem sich nicht ändernden Fenstertitel geöffnet hat.
Verfasst: 30.10.2006 11:32
von Thorsten1867
Benutze einen MutexString. Hier ein Beispiel aus meinem Programm. Du solltest aber einen eigenen String verwenden (am besten eine GUID):
Code: Alles auswählen
If AppRunning("{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
MessageRequester(" EasySetup", "An other copy of EasySetup is running.", #MB_OK|#MB_ICONERROR)
End
EndIf
Mutex.l = CreateMutex_(0,0, "{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
.....
CloseHandle_(Mutex)
PS: AppRunning() ist eine Library aus PBOSL
Verfasst: 30.10.2006 12:06
von ts-soft
Thorsten1867 hat geschrieben:Benutze einen MutexString. Hier ein Beispiel aus meinem Programm. Du solltest aber einen eigenen String verwenden (am besten eine GUID):
Code: Alles auswählen
If AppRunning("{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
MessageRequester(" EasySetup", "An other copy of EasySetup is running.", #MB_OK|#MB_ICONERROR)
End
EndIf
Mutex.l = CreateMutex_(0,0, "{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
.....
CloseHandle_(Mutex)
PS: AppRunning() ist eine Library aus PBOSL
Die Lib AppRunning ist unnötig wenn Du es so machst:
Code: Alles auswählen
Mutex.l = CreateMutex_(0,0, "{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
If GetLastError_() = #ERROR_ALREADY_EXISTS
MessageRequester(" EasySetup", "An other copy of EasySetup is running.", #MB_OK|#MB_ICONERROR)
ReleaseMutex_(Mutex)
CloseHandle_(Mutex)
End
EndIf
; ....
; ....
CloseHandle_(Mutex)
Gruß
Thomas
Verfasst: 30.10.2006 12:24
von Shardik
Ein Beispiel von Character aus dem englischen Forum:
http://www.purebasic.fr/english/viewtopic.php?t=23351
Code: Alles auswählen
MutexID=CreateMutex_(0,1,"My Program")
MutexError=GetLastError_()
If MutexID=0 Or MutexError<>0
ReleaseMutex_(MutexID)
CloseHandle_(MutexID)
End
EndIf
If OpenWindow(0,300,300,200,100,"My Program")
While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf
;- Mutex Close
CloseHandle_(MutexID)
End
Und eine Erklärung, warum die FindWindow()-Methode nicht verwendet werden sollte, weil sie unzuverlässig ist:
http://www.developerfusion.co.uk/show/1716/5
Re: Herausfinden, ob mein Programm schon gestartet wurde
Verfasst: 30.10.2006 12:56
von Kaeru Gaman
RSBasic hat geschrieben:Dabei fiel mir auf, dass die so aufwendig sind.
Ich habe für normale User einen Beispiel geschrieben, was sehr einfach zu verstehen ist.
aus den postings der kollegen kannst du ersehen, warum es so aufwendig sein muss.
und der "normale User" wird eher dankbar sein für so beispiele wie von ts und Character,
denn wenn er deinen code benutzt, und scheitert, wird er den fehler nicht ausmerzen können.
"Das System hat keinen Fehler, es
ist der Fehler."
Verfasst: 30.10.2006 15:39
von Jilocasin
Darf ich mal ganz bescheiden fragen woher diese lustigen Ziffernkombinationen wie hier
7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA kommen?
Ist das einfach was zum ausdenken oder hat das nen speziellen Zusammenhang?
Verfasst: 30.10.2006 20:31
von Thorsten1867
ts-soft hat geschrieben:Die Lib AppRunning ist unnötig wenn Du es so machst:
Code: Alles auswählen
Mutex.l = CreateMutex_(0,0, "{7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA}")
If GetLastError_() = #ERROR_ALREADY_EXISTS
MessageRequester(" EasySetup", "An other copy of EasySetup is running.", #MB_OK|#MB_ICONERROR)
ReleaseMutex_(Mutex)
CloseHandle_(Mutex)
End
EndIf
; ....
CloseHandle_(Mutex)
Gruß
Thomas
Danke! Soetwas habe ich schon fast vermutet.
Verfasst: 30.10.2006 20:42
von Friedhelm
Jilocasin hat geschrieben:Darf ich mal ganz bescheiden fragen woher diese lustigen Ziffernkombinationen wie hier
7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA kommen?
Ist das einfach was zum ausdenken oder hat das nen speziellen Zusammenhang?
Schau hier
http://de.wikipedia.org/wiki/GUID
http://www.purebasic.fr/german/viewtopi ... light=guid
Verfasst: 31.10.2006 10:29
von Thorsten1867
Der Vollständigkeit halber (Abfrage der Prozessliste):
Code: Alles auswählen
Structure PROCESSENTRY33
dwSize.l
cntUsage.l
th32ProcessID.l
th32DefaultHeapID.l
th32ModuleID.l
cntThreads.l
th32ParentProcessID.l
pcPriClassBase.l
dwFlags.l
szExeFile.b[#MAX_PATH]
EndStructure
Procedure SearchProcess(Name.s)
result.b = #False
If OpenLibrary(0, "Kernel32.dll")
CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot")
ProcessFirst = GetFunction(0, "Process32First")
ProcessNext = GetFunction(0, "Process32Next")
If CreateToolhelpSnapshot And ProcessFirst And ProcessNext
Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33)
Snapshot = CallFunctionFast(CreateToolhelpSnapshot, $2, 0)
If Snapshot
ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process)
While ProcessFound
PN$ = UCase(PeekS(@Process\szExeFile))
If UCase(Name) = GetFilePart(PN$) : result = #True : EndIf
ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process)
Wend
EndIf
CloseHandle_(Snapshot)
EndIf
CloseLibrary(0)
EndIf
ProcedureReturn result
EndProcedure
If SearchProcess("EasySetup.exe")
Debug "Programm läuft"
Else
Debug "Nicht gefunden"
EndIf