Hier habe ich etwas für meinen PBOR, damit er erkennt, ob er schon an ist. Falls ja, wird ein String an das schon laufende Programm gesendet.
Code: Alles auswählen
#Win_Main = 0
#Win_OneInstance = 1
#ProgramName.s = "PB-Test"
Global FBOR_Msg_RunOnce.l, FBOR_OneInstance_Mutex.l
Global OneInstance_AlreadyRunning.l, Parameter.s, NewParameter.l
#FBOR_Msg_Request = 0
#FBOR_Msg_Reply = 1
FBOR_Msg_RunOnce = RegisterWindowMessage_(#ProgramName + "_Msg_RunOnce")
FBOR_OneInstance_Mutex = CreateMutex_(0, 0, #ProgramName + "_OneInstance_Mutex")
If GetLastError_() = #ERROR_ALREADY_EXISTS
OneInstance_AlreadyRunning = #True
Else
OneInstance_AlreadyRunning = #False
EndIf
Procedure OneInstance_IsRunning()
ProcedureReturn OneInstance_AlreadyRunning
EndProcedure
Procedure OneInstance_End()
ReleaseMutex_(FBOR_OneInstance_Mutex)
EndProcedure
Procedure OneInstance_Close()
CloseHandle_(FBOR_OneInstance_Mutex)
EndProcedure
Procedure OneInstance_SendParameter(Text.s)
Protected EventID.l, CopyData.COPYDATASTRUCT
If OpenWindow(#Win_OneInstance, 0, 0, 0, 0, #PB_Window_Invisible, #ProgramName)
PostMessage_(#HWND_BROADCAST, FBOR_Msg_RunOnce, #FBOR_Msg_Request, WindowID(#Win_OneInstance))
SetTimer_(WindowID(#Win_OneInstance), 0, 5000, 0)
Repeat
EventID = WaitWindowEvent()
If EventID = #WM_TIMER
Break
ElseIf EventID = FBOR_Msg_RunOnce And EventwParam() = #FBOR_Msg_Reply
CopyData\cbData = Len(Text)
CopyData\lpData = @Text
SendMessage_(EventlParam(), #WM_COPYDATA, WindowID(#Win_OneInstance), @CopyData)
Break
EndIf
ForEver
CloseWindow(#Win_OneInstance)
EndIf
EndProcedure
Procedure OneInstance_Callback(hWindow.l, Message.l, wParam.l, lParam.l)
Protected *CopyData.COPYDATASTRUCT
Result = #PB_ProcessPureBasicEvents
Select Message
Case #WM_COPYDATA
*CopyData = lParam
Parameter = PeekS(*CopyData\lpData, *CopyData\cbData)
If Parameter <> ""
NewParameter = #True
EndIf
Result = #True
Case FBOR_Msg_RunOnce
If wParam = #FBOR_Msg_Request
PostMessage_(lParam, FBOR_Msg_RunOnce, #FBOR_Msg_Reply, WindowID(#Win_Main))
EndIf
EndSelect
ProcedureReturn Result
EndProcedure
If OneInstance_IsRunning()
OneInstance_SendParameter("Zufallszahl: " + Str(Random(1000)))
OneInstance_Close()
End
EndIf
NewParameter = #False
If OpenWindow(#Win_Main, 0, 0, 200, 10, #PB_Window_Invisible, "OneInstance")
SetWindowCallback(@OneInstance_Callback())
MessageRequester("Hauptprogramm", "Es wurde ein unsichtbares Fenster erstellt." + #LFCR$ + "Startet sie das Programm nun erneut.")
Repeat
WindowEvent()
If NewParameter
MessageRequester("Hauptprogramm", "Programm wurde erneut gestartet." + #LFCR$ + "Gesendeter String: '" + Parameter "'" + #LFCR$ + "Programm wird jetzt beendet.")
NewParameter = #False
End
EndIf
Delay(10)
ForEver
EndIf
OneInstance_End()