 {
 	if (presetNoTest)
 	{
+	; selPrgChoice is batchPrgstatus
 	temp := PrgBatchIni[selPrgChoice]
-	strTemp := PrgChoicePaths[temp]
 	strTemp2 := PrgLnkInf[temp]
 	}
 	else
 	{
-	strTemp := PrgChoicePaths[selPrgChoice]
 	temp := selPrgChoice
 	strTemp2 := PrgLnkInf[temp]
 	}
+
+	strTemp := ExtractPrgPath(temp, PrgChoicePaths, 0, PrgLnkInf, IsaPrgLnk, IniFileShortctSep)
+	;ExtractPrgPath(selPrgChoice, PrgChoicePaths, PrgPth, PrgLnkInf, ByRef IsaPrgLnk, IniFileShortctSep)
+;if InStr(strTemp, "Notepad")
+
 	if (InStr(strTemp, "PrgLnch.exe") || InStr(strTemp, "BadPath"))
 	Return "PrgLnch"
     if !(strTemp := GetProcFromPath(strTemp, strTemp2))
 	Return "BadPath"
-	for process in ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2").ExecQuery("Select * from Win32_Process")
-	{
-		strTemp2 := ""
+	strTemp2 := ""
+	for process in ComObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2").ExecQuery("Select Name from Win32_Process")
+	{
 		if (strTemp = process.Name)
 		{
 		duplist .= strTemp2 . strTemp
-		Break
+			if (multiInst)
+			strTemp2 := "|" 
+			else
+			Break
 		}
 	}
 }
 
 Return duplist
 }
+
+
+ProcessActivePrgsAtStart(PrgLnchIni, PrgNo, PrgLnkInf, PrgChoicePaths, IniFileShortctSep, ByRef PrgPIDMast)
+{
+ProcNames := ["", "", "", "", "", "", "", "", "", "", "", ""]
+strTemp := ""
+multipleInstance := 0
+foundpos := 0
+retVal := 0
+
+IniRead, WarnAlreadyRunning, %PrgLnchIni%, General, WarnAlreadyRunning
+	if (WarnAlreadyRunning = 2)
+	Return retVal
+
+Loop % PrgNo
+{
+	if (PrgChoicePaths[A_Index])
+	{
+	strRetVal := ChkExistingProcess(PrgLnkInf, 0, A_Index, 0, 0, PrgChoicePaths, IniFileShortctSep, 0, 1)
+
+		if (strRetVal)
+		{
+
+		foundpos := 1
+			if (Instr(strRetVal, "|"))
+			{
+				Loop, Parse, strRetVal, |
+				{
+				foundpos += 1
+				multipleInstance := 1
+				}
+			}
+
+		ProcNames[A_Index] := (multipleInstance)? SubStr(strRetVal, 1, Instr(strRetVal, "|") - 1): strRetVal
+
+		strTemp .= "`n" . ((foundpos > 1)? (foundpos - 1 . " instances of "): ("One instance of ")) . ProcNames[A_Index] . "."
+		}
+	}
+}
+
+
+if (!WarnAlreadyRunning && foundpos)
+{
+strRetVal := % (multipleInstance)? "`nNote, if Yes, PrgLnch will only choose one of the instances.": ""
+MsgBox, 8195, Running Prgs, % "The Prgs in the list below have already started!`n" strTemp "`n`nReply:`nYes: Update Prg Batch Status (Recommended: This will not show again)`nNo: Do not update Prg Batch Status (This will show again)`nCancel: Do not update Prg Batch Status (This will not show again)`n" strRetVal
+	ifMsgBox, Yes
+	IniWrite, 1, %PrgLnchIni%, General, WarnAlreadyRunning
+	Else
+	{
+	IfMsgBox, Cancel
+	IniWrite, 2, %PrgLnchIni%, General, WarnAlreadyRunning
+
+	Return retVal
+	}
+}
+
+
+
+Loop % PrgNo
+{
+foundpos := 0
+	if (ProcNames[A_Index])
+	{
+	Process, Exist, % ProcNames[A_Index]
+
+	foundpos := ErrorLevel
+
+		if (foundpos)
+		{
+		PrgPIDMast[A_Index] := foundpos
+		retVal := 1
+		}
+	}
+}
+
+Return retVal
+}
+
 GetPrgLnchMonNum(iDevNumArray, dispMonNamesNo, monitorHandle := 0)
 {
 	iDevNumb := 0, MONITOR_DEFAULTTONULL := 0

				else
				{
				PrgResolveShortcut[selPrgChoice] := 0
				; check valid paths once more:  gets working directory of lnk, if any
				temp := WorkingDirectory(strRetVal)
				}
			}

			if(!ErrorLevel)
			{
			PrgPID := 0
			CleanupPID(PrgLnchIni, currBatchNo, PrgLnchMon, lastMonitorUsedInBatch, PrgMonToRn, PrgNo, PrgPIDMast, presetNoTest, PrgListPID%btchPrgPresetSel%, PrgStyle, dx, dy, PrgLnchHide, PrgPID, selPrgChoice, Fmode, scrWidth, scrHeight, scrWidthDef, scrHeightDef, scrFreqDef)
			Return
			}
		}
