Herausfinden, ob mein Programm schon gestartet wurde

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Herausfinden, ob mein Programm schon gestartet wurde

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Das funktioniert ja aber nur, wenn das Programm ein Fenster mit einem sich nicht ändernden Fenstertitel geöffnet hat.
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Herausfinden, ob mein Programm schon gestartet wurde

Beitrag 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."
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Jilocasin
Beiträge: 665
Registriert: 13.05.2006 16:04
Kontaktdaten:

Beitrag von Jilocasin »

Darf ich mal ganz bescheiden fragen woher diese lustigen Ziffernkombinationen wie hier 7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA kommen? :oops:
Ist das einfach was zum ausdenken oder hat das nen speziellen Zusammenhang?
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Friedhelm
Beiträge: 43
Registriert: 29.08.2004 08:50

Beitrag von Friedhelm »

Jilocasin hat geschrieben:Darf ich mal ganz bescheiden fragen woher diese lustigen Ziffernkombinationen wie hier 7CH2DA07-6695-4FFE-A2A6-5F7055F1A8FA kommen? :oops:
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
mfg
Friedhelm
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Antworten