diff --git a/GBM/Classes/XML Serialize Classes/Game.vb b/GBM/Classes/XML Serialize Classes/Game.vb index 8c474ba..9ecadc8 100644 --- a/GBM/Classes/XML Serialize Classes/Game.vb +++ b/GBM/Classes/XML Serialize Classes/Game.vb @@ -1,6 +1,7 @@ Public Class Game Private sGameName As String Private sProcessName As String + Private sParameter As String Private sPath As String Private bAbsolutePath As Boolean Private bFolderSave As Boolean @@ -26,6 +27,15 @@ End Get End Property + Property Parameter As String + Set(value As String) + sParameter = value + End Set + Get + Return sParameter + End Get + End Property + Property Path As String Set(value As String) sPath = value diff --git a/GBM/Classes/clsGame.vb b/GBM/Classes/clsGame.vb index 43ce188..a01573b 100644 --- a/GBM/Classes/clsGame.vb +++ b/GBM/Classes/clsGame.vb @@ -2,6 +2,7 @@ Private sGameID As String = Guid.NewGuid.ToString Private sGameName As String = String.Empty Private sProcessName As String = String.Empty + Private sParameter As String = String.Empty Private sPath As String = String.Empty Private bAbsolutePath As Boolean = False Private bFolderSave As Boolean = False @@ -74,6 +75,15 @@ End Get End Property + Property Parameter As String + Set(value As String) + sParameter = value + End Set + Get + Return sParameter + End Get + End Property + Property Path As String Set(value As String) sPath = mgrPath.ReverseSpecialPaths(value) @@ -263,6 +273,9 @@ If ProcessName <> oGame.ProcessName Then Return False End If + If Parameter <> oGame.Parameter Then + Return False + End If If Path <> oGame.Path Then Return False End If diff --git a/GBM/Forms/frmGameManager.Designer.vb b/GBM/Forms/frmGameManager.Designer.vb index 8ed79ed..9f8379b 100644 --- a/GBM/Forms/frmGameManager.Designer.vb +++ b/GBM/Forms/frmGameManager.Designer.vb @@ -96,6 +96,8 @@ Partial Class frmGameManager Me.cmsDeleteBackup = New System.Windows.Forms.ContextMenuStrip(Me.components) Me.cmsDeleteOne = New System.Windows.Forms.ToolStripMenuItem() Me.cmsDeleteAll = New System.Windows.Forms.ToolStripMenuItem() + Me.lblParameter = New System.Windows.Forms.Label() + Me.txtParameter = New System.Windows.Forms.TextBox() Me.grpConfig.SuspendLayout() CType(Me.nudLimit, System.ComponentModel.ISupportInitialize).BeginInit() Me.grpExtra.SuspendLayout() @@ -152,6 +154,8 @@ Partial Class frmGameManager 'grpConfig ' Me.grpConfig.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.grpConfig.Controls.Add(Me.txtParameter) + Me.grpConfig.Controls.Add(Me.lblParameter) Me.grpConfig.Controls.Add(Me.chkCleanFolder) Me.grpConfig.Controls.Add(Me.lblLimit) Me.grpConfig.Controls.Add(Me.nudLimit) @@ -247,7 +251,7 @@ Partial Class frmGameManager ' 'btnProcessBrowse ' - Me.btnProcessBrowse.Location = New System.Drawing.Point(489, 45) + Me.btnProcessBrowse.Location = New System.Drawing.Point(225, 44) Me.btnProcessBrowse.Name = "btnProcessBrowse" Me.btnProcessBrowse.Size = New System.Drawing.Size(30, 20) Me.btnProcessBrowse.TabIndex = 5 @@ -330,7 +334,7 @@ Partial Class frmGameManager ' Me.txtProcess.Location = New System.Drawing.Point(69, 45) Me.txtProcess.Name = "txtProcess" - Me.txtProcess.Size = New System.Drawing.Size(414, 20) + Me.txtProcess.Size = New System.Drawing.Size(150, 20) Me.txtProcess.TabIndex = 4 ' 'txtName @@ -819,6 +823,22 @@ Partial Class frmGameManager Me.cmsDeleteAll.Size = New System.Drawing.Size(114, 22) Me.cmsDeleteAll.Text = "&All Files" ' + 'lblParameter + ' + Me.lblParameter.AutoSize = True + Me.lblParameter.Location = New System.Drawing.Point(269, 48) + Me.lblParameter.Name = "lblParameter" + Me.lblParameter.Size = New System.Drawing.Size(58, 13) + Me.lblParameter.TabIndex = 15 + Me.lblParameter.Text = "Parameter:" + ' + 'txtParameter + ' + Me.txtParameter.Location = New System.Drawing.Point(333, 45) + Me.txtParameter.Name = "txtParameter" + Me.txtParameter.Size = New System.Drawing.Size(150, 20) + Me.txtParameter.TabIndex = 16 + ' 'frmGameManager ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) @@ -941,4 +961,6 @@ Partial Class frmGameManager Friend WithEvents cmsDeleteOne As ToolStripMenuItem Friend WithEvents cmsDeleteAll As ToolStripMenuItem Friend WithEvents chkCleanFolder As CheckBox + Friend WithEvents txtParameter As TextBox + Friend WithEvents lblParameter As Label End Class diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 125bfc4..39d6b3c 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -737,6 +737,7 @@ Public Class frmGameManager txtID.Text = oApp.ID txtName.Text = oApp.Name txtProcess.Text = oApp.TrueProcess + txtParameter.Text = oApp.Parameter txtSavePath.Text = oApp.Path txtFileType.Text = oApp.FileType txtExclude.Text = oApp.ExcludeList @@ -1126,6 +1127,7 @@ Public Class frmGameManager Else oApp.ProcessName = txtProcess.Text End If + oApp.Parameter = txtParameter.Text oApp.Path = txtSavePath.Text 'Only do a simple root check here in case the user doesn't really understand creating a proper configuration oApp.AbsolutePath = Path.IsPathRooted(txtSavePath.Text) @@ -1489,6 +1491,7 @@ Public Class frmGameManager btnProcessBrowse.Text = frmGameManager_btnProcessBrowse lblSavePath.Text = frmGameManager_lblSavePath lblProcess.Text = frmGameManager_lblProcess + lblParameter.Text = frmGameManager_lblParameter lblName.Text = frmGameManager_lblName chkTimeStamp.Text = frmGameManager_chkTimeStamp chkFolderSave.Text = frmGameManager_chkFolderSave diff --git a/GBM/Forms/frmMain.Designer.vb b/GBM/Forms/frmMain.Designer.vb index cb9ff57..8ba204b 100644 --- a/GBM/Forms/frmMain.Designer.vb +++ b/GBM/Forms/frmMain.Designer.vb @@ -434,6 +434,9 @@ Partial Class frmMain ' 'lblGameTitle ' + Me.lblGameTitle.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.lblGameTitle.AutoEllipsis = True Me.lblGameTitle.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.lblGameTitle.Location = New System.Drawing.Point(66, 36) Me.lblGameTitle.Name = "lblGameTitle" @@ -443,6 +446,8 @@ Partial Class frmMain ' 'lblLastAction ' + Me.lblLastAction.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lblLastAction.AutoEllipsis = True Me.lblLastAction.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.lblLastAction.Location = New System.Drawing.Point(12, 165) @@ -483,6 +488,8 @@ Partial Class frmMain ' 'lblStatus1 ' + Me.lblStatus1.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lblStatus1.AutoEllipsis = True Me.lblStatus1.Location = New System.Drawing.Point(66, 58) Me.lblStatus1.Name = "lblStatus1" @@ -491,6 +498,8 @@ Partial Class frmMain ' 'lblStatus2 ' + Me.lblStatus2.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lblStatus2.AutoEllipsis = True Me.lblStatus2.Location = New System.Drawing.Point(66, 74) Me.lblStatus2.Name = "lblStatus2" @@ -499,6 +508,8 @@ Partial Class frmMain ' 'lblStatus3 ' + Me.lblStatus3.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lblStatus3.AutoEllipsis = True Me.lblStatus3.Location = New System.Drawing.Point(66, 90) Me.lblStatus3.Name = "lblStatus3" diff --git a/GBM/Forms/frmMain.vb b/GBM/Forms/frmMain.vb index f7aad26..eae16ba 100644 --- a/GBM/Forms/frmMain.vb +++ b/GBM/Forms/frmMain.vb @@ -532,7 +532,7 @@ Public Class frmMain Private Sub ResetGameInfo(Optional ByVal bKeepInfo As Boolean = False) If bKeepInfo And Not oProcess.GameInfo Is Nothing Then - lblGameTitle.Text = mgrCommon.FormatString(frmMain_LastGame, oProcess.GameInfo.CroppedName) + lblGameTitle.Text = mgrCommon.FormatString(frmMain_LastGame, oProcess.GameInfo.Name) pbIcon.Image = oPriorImage lblStatus1.Text = sPriorPath lblStatus2.Text = sPriorCompany @@ -597,7 +597,7 @@ Public Class frmMain Else bAllowIcon = True bAllowDetails = True - lblGameTitle.Text = oProcess.GameInfo.CroppedName + lblGameTitle.Text = oProcess.GameInfo.Name Try Dim ic As Icon = System.Drawing.Icon.ExtractAssociatedIcon(oProcess.FoundProcess.MainModule.FileName) @@ -1448,6 +1448,17 @@ Public Class frmMain End Function + Private Function CheckForParametersDuplicate() As Boolean + For Each o As clsGame In oProcess.DuplicateList + If o.Parameter <> String.Empty And oProcess.FullCommand.Contains(o.Parameter) Then + oProcess.GameInfo = o + oProcess.Duplicate = False + Return True + End If + Next + Return False + End Function + Private Sub CheckForSavedDuplicate() For Each o As clsGame In oProcess.DuplicateList If o.ProcessPath.ToLower = oProcess.GameInfo.ProcessPath.ToLower Then @@ -1699,20 +1710,20 @@ Public Class frmMain End If If bContinue = True Then - CheckForSavedDuplicate() + If Not CheckForParametersDuplicate() Then CheckForSavedDuplicate() If oProcess.Duplicate Then - UpdateLog(frmMain_MultipleGamesDetected, oSettings.ShowDetectionToolTips) - UpdateStatus(frmMain_MultipleGamesDetected) - SetGameInfo(True) + UpdateLog(frmMain_MultipleGamesDetected, oSettings.ShowDetectionToolTips) + UpdateStatus(frmMain_MultipleGamesDetected) + SetGameInfo(True) + Else + UpdateLog(mgrCommon.FormatString(frmMain_GameDetected, oProcess.GameInfo.Name), oSettings.ShowDetectionToolTips) + UpdateStatus(mgrCommon.FormatString(frmMain_GameDetected, oProcess.GameInfo.CroppedName)) + SetGameInfo() + End If + oProcess.StartTime = Now + bwMonitor.RunWorkerAsync() Else - UpdateLog(mgrCommon.FormatString(frmMain_GameDetected, oProcess.GameInfo.Name), oSettings.ShowDetectionToolTips) - UpdateStatus(mgrCommon.FormatString(frmMain_GameDetected, oProcess.GameInfo.CroppedName)) - SetGameInfo() - End If - oProcess.StartTime = Now - bwMonitor.RunWorkerAsync() - Else - StopScan() + StopScan() End If End If End Sub @@ -1831,7 +1842,7 @@ Public Class frmMain End Sub 'This event handler lets the user clear focus from the log by clicking anywhere on the form. - 'Due to txtLog being the only focusable control in most cases, it's impossible for it to lose focus unless force a focus change. + 'Due to txtLog being the only focusable control in most cases, it's impossible for it to lose focus unless a change is forced. Private Sub ClearLogFocus(sender As Object, e As EventArgs) Handles MyBase.Click, lblGameTitle.Click, lblStatus1.Click, lblStatus2.Click, lblStatus3.Click, pbTime.Click, lblTimeSpent.Click, lblLastActionTitle.Click, lblLastAction.Click, gMonMainMenu.Click, gMonStatusStrip.Click 'Move focus to first label diff --git a/GBM/Game Backup Monitor.vbproj b/GBM/Game Backup Monitor.vbproj index 0f8aa1c..33d3fb3 100644 --- a/GBM/Game Backup Monitor.vbproj +++ b/GBM/Game Backup Monitor.vbproj @@ -106,6 +106,7 @@ + diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index 5421043..7e36f73 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -31,6 +31,7 @@ Public Class mgrMonitorList oGame.MonitorOnly = CBool(dr("MonitorOnly")) oGame.BackupLimit = CInt(dr("BackupLimit")) oGame.CleanFolder = CBool(dr("CleanFolder")) + If Not IsDBNull(dr("Parameter")) Then oGame.Parameter = CStr(dr("Parameter")) Return oGame End Function @@ -56,6 +57,7 @@ Public Class mgrMonitorList hshParams.Add("MonitorOnly", oGame.MonitorOnly) hshParams.Add("BackupLimit", oGame.BackupLimit) hshParams.Add("CleanFolder", oGame.CleanFolder) + hshParams.Add("Parameter", oGame.Parameter) Return hshParams End Function @@ -96,7 +98,7 @@ Public Class mgrMonitorList Dim hshParams As Hashtable sSQL = "INSERT INTO monitorlist VALUES (@ID, @Name, @Process, @Path, @AbsolutePath, @FolderSave, @FileType, @TimeStamp, " - sSQL &= "@ExcludeList, @ProcessPath, @Icon, @Hours, @Version, @Company, @Enabled, @MonitorOnly, @BackupLimit, @CleanFolder)" + sSQL &= "@ExcludeList, @ProcessPath, @Icon, @Hours, @Version, @Company, @Enabled, @MonitorOnly, @BackupLimit, @CleanFolder, @Parameter)" 'Parameters hshParams = SetCoreParameters(oGame) @@ -112,7 +114,7 @@ Public Class mgrMonitorList sSQL = "UPDATE monitorlist SET Name=@Name, Process=@Process, Path=@Path, AbsolutePath=@AbsolutePath, FolderSave=@FolderSave, " sSQL &= "FileType=@FileType, TimeStamp=@TimeStamp, ExcludeList=@ExcludeList, ProcessPath=@ProcessPath, Icon=@Icon, " - sSQL &= "Hours=@Hours, Version=@Version, Company=@Company, Enabled=@Enabled, MonitorOnly=@MonitorOnly, BackupLimit=@BackupLimit, CleanFolder=@CleanFolder WHERE MonitorID=@ID" + sSQL &= "Hours=@Hours, Version=@Version, Company=@Company, Enabled=@Enabled, MonitorOnly=@MonitorOnly, BackupLimit=@BackupLimit, CleanFolder=@CleanFolder, Parameter=@Parameter WHERE MonitorID=@ID" 'Parameters hshParams = SetCoreParameters(oGame) @@ -317,11 +319,11 @@ Public Class mgrMonitorList sVersion = "(SELECT Version FROM monitorlist WHERE MonitorID=@ID)" End If - sSQL = "INSERT OR REPLACE INTO monitorlist (MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder) " + sSQL = "INSERT OR REPLACE INTO monitorlist (MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter) " sSQL &= "VALUES (@ID, @Name, @Process, @Path, @AbsolutePath, @FolderSave, @FileType, " sSQL &= sTimeStamp & ", @ExcludeList, " & sGamePath & ", " sSQL &= sIcon & ", @Hours, " & sVersion & ", " - sSQL &= sCompany & ", " & sMonitorGame & ", @MonitorOnly, " & sBackupLimit & ",@CleanFolder);" + sSQL &= sCompany & ", " & sMonitorGame & ", @MonitorOnly, " & sBackupLimit & ", @CleanFolder, @Parameter);" For Each oGame As clsGame In hshGames.Values hshParams = New Hashtable @@ -338,6 +340,7 @@ Public Class mgrMonitorList hshParams.Add("Hours", oGame.Hours) hshParams.Add("MonitorOnly", oGame.MonitorOnly) hshParams.Add("CleanFolder", oGame.CleanFolder) + hshParams.Add("Parameter", oGame.Parameter) 'Optional Parameters If (eSyncFields And clsGame.eOptionalSyncFields.Company) = clsGame.eOptionalSyncFields.Company Then @@ -474,9 +477,9 @@ Public Class mgrMonitorList Select Case eFilterType Case frmFilter.eFilterType.NoFilter - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist ORDER BY Name Asc" + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist ORDER BY Name Asc" Case frmFilter.eFilterType.FieldAnd, frmFilter.eFilterType.FieldOr - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist" + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist" If hshStringFilters.Count > 0 Then sSQL &= " WHERE (" @@ -498,7 +501,7 @@ Public Class mgrMonitorList End If sSQL &= " ORDER BY Name Asc" Case frmFilter.eFilterType.AnyTag - sSQL = "SELECT DISTINCT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist " + sSQL = "SELECT DISTINCT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist " sSQL &= "NATURAL JOIN gametags WHERE gametags.TagID IN (" For Each oTag As clsTag In oTagFilters @@ -510,7 +513,7 @@ Public Class mgrMonitorList sSQL = sSQL.TrimEnd(",") sSQL &= ") ORDER BY Name Asc" Case frmFilter.eFilterType.AllTags - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist WHERE MonitorID IN " + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist WHERE MonitorID IN " For Each oTag As clsTag In oTagFilters sSQL &= "(SELECT MonitorID FROM gametags WHERE monitorlist.MonitorID = gametags.MonitorID And TagID = @TagID" & iCounter & ")" @@ -523,7 +526,7 @@ Public Class mgrMonitorList sSQL &= " ORDER BY Name Asc" Case frmFilter.eFilterType.NoTags - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder FROM monitorlist WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags) ORDER BY Name Asc" + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags) ORDER BY Name Asc" End Select Return sSQL @@ -577,6 +580,7 @@ Public Class mgrMonitorList oGame.FolderSave = CBool(dr("FolderSave")) If Not IsDBNull(dr("FileType")) Then oGame.FileType = CStr(dr("FileType")) If Not IsDBNull(dr("ExcludeList")) Then oGame.ExcludeList = CStr(dr("ExcludeList")) + If Not IsDBNull(dr("Parameter")) Then oGame.Parameter = CStr(dr("Parameter")) oGame.Tags = mgrGameTags.GetTagsByGameForExport(sID) oList.Add(oGame) Next diff --git a/GBM/Managers/mgrProcesses.vb b/GBM/Managers/mgrProcesses.vb index 729b015..dc4e119 100644 --- a/GBM/Managers/mgrProcesses.vb +++ b/GBM/Managers/mgrProcesses.vb @@ -1,6 +1,5 @@ -Imports System.Diagnostics -Imports System.IO -Imports System.Threading +Imports System.IO +Imports System.Management Public Class mgrProcesses @@ -11,6 +10,7 @@ Public Class mgrProcesses Private oDuplicateGames As New ArrayList Private bDuplicates As Boolean Private bVerified As Boolean = False + Private sFullCommand As String = String.Empty Property FoundProcess As Process Get @@ -72,6 +72,15 @@ Public Class mgrProcesses End Set End Property + Property FullCommand As String + Get + Return sFullCommand + End Get + Set(value As String) + sFullCommand = value + End Set + End Property + Private Sub VerifyDuplicate(oGame As clsGame, hshScanList As Hashtable) Dim sProcess As String bDuplicates = True @@ -85,6 +94,30 @@ Public Class mgrProcesses Next End Sub + 'This function will only work correctly on Windows + Private Sub GetWindowsCommand(ByVal prs As Process) + FullCommand = String.Empty + Try + Using searcher As New ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + prs.Id.ToString) + For Each o As ManagementObject In searcher.Get() + FullCommand &= o("CommandLine") & " " + Next + End Using + Catch ex As Exception + 'Do Nothing + End Try + End Sub + + 'This function will only work correctly on Unix + Private Sub GetUnixCommand(ByVal prs As Process) + FullCommand = String.Empty + Try + FullCommand = File.ReadAllText("/proc/" & prs.Id.ToString() & "/cmdline").Replace(vbNullChar, " ") + Catch ex As Exception + 'Do Nothing + End Try + End Sub + 'This function will only work correctly on Unix Private Function GetUnixProcessArguments(ByVal prs As Process) As String() Dim sArguments As String @@ -153,6 +186,12 @@ Public Class mgrProcesses prsFoundProcess = prsCurrent oGame = DirectCast(hshScanList.Item(sProcessCheck), clsGame).ShallowCopy + If mgrCommon.IsUnix Then + GetUnixCommand(prsCurrent) + Else + GetWindowsCommand(prsCurrent) + End If + If oGame.Duplicate = True Then VerifyDuplicate(oGame, hshScanList) Else @@ -160,6 +199,10 @@ Public Class mgrProcesses oDuplicateGames.Clear() End If + If oGame.Parameter <> String.Empty And Not oGame.Duplicate And Not FullCommand.Contains(oGame.Parameter) Then + Return False + End If + If Not oGame.AbsolutePath Or oGame.Duplicate Then Try If Not bWineProcess Then diff --git a/GBM/Managers/mgrSQLite.vb b/GBM/Managers/mgrSQLite.vb index cb7d4c2..a9aa722 100644 --- a/GBM/Managers/mgrSQLite.vb +++ b/GBM/Managers/mgrSQLite.vb @@ -83,7 +83,7 @@ Public Class mgrSQLite sSql &= "CREATE TABLE monitorlist (MonitorID TEXT NOT NULL UNIQUE, Name TEXT NOT NULL, Process TEXT NOT NULL, Path TEXT, " & "AbsolutePath BOOLEAN NOT NULL, FolderSave BOOLEAN NOT NULL, FileType TEXT, TimeStamp BOOLEAN NOT NULL, ExcludeList TEXT NOT NULL, " & "ProcessPath TEXT, Icon TEXT, Hours REAL, Version TEXT, Company TEXT, Enabled BOOLEAN NOT NULL, MonitorOnly BOOLEAN NOT NULL, " & - "BackupLimit INTEGER NOT NULL, CleanFolder BOOLEAN NOT NULL, PRIMARY KEY(Name, Process));" + "BackupLimit INTEGER NOT NULL, CleanFolder BOOLEAN NOT NULL, Parameter TEXT, PRIMARY KEY(Name, Process));" 'Add Tables (Tags) sSql &= "CREATE TABLE tags (TagID TEXT NOT NULL UNIQUE, Name TEXT NOT NULL PRIMARY KEY); " @@ -120,7 +120,7 @@ Public Class mgrSQLite sSql = "CREATE TABLE monitorlist (MonitorID TEXT NOT NULL UNIQUE, Name TEXT NOT NULL, Process TEXT NOT NULL, Path TEXT, " & "AbsolutePath BOOLEAN NOT NULL, FolderSave BOOLEAN NOT NULL, FileType TEXT, TimeStamp BOOLEAN NOT NULL, ExcludeList TEXT NOT NULL, " & "ProcessPath TEXT, Icon TEXT, Hours REAL, Version TEXT, Company TEXT, Enabled BOOLEAN NOT NULL, MonitorOnly BOOLEAN NOT NULL, " & - "BackupLimit INTEGER NOT NULL, CleanFolder BOOLEAN NOT NULL, PRIMARY KEY(Name, Process));" + "BackupLimit INTEGER NOT NULL, CleanFolder BOOLEAN NOT NULL, Parameter TEXT, PRIMARY KEY(Name, Process));" 'Add Tables (Remote Manifest) sSql &= "CREATE TABLE manifest (ManifestID TEXT NOT NULL PRIMARY KEY, Name TEXT NOT NULL, FileName TEXT NOT NULL, RestorePath TEXT NOT NULL, " & @@ -650,6 +650,10 @@ Public Class mgrSQLite 'Add Table (SavedPath) sSQL = "CREATE TABLE savedpath (PathName TEXT NOT NULL PRIMARY KEY, Path TEXT NOT NULL);" + + 'Add new field(s) + sSQL &= "ALTER TABLE monitorlist ADD COLUMN Parameter TEXT;" + sSQL &= "PRAGMA user_version=102" RunParamQuery(sSQL, New Hashtable) @@ -658,7 +662,10 @@ Public Class mgrSQLite 'Backup DB before starting BackupDB("v101") - sSQL = "PRAGMA user_version=102" + 'Add new field(s) + sSQL = "ALTER TABLE monitorlist ADD COLUMN Parameter TEXT;" + + sSQL &= "PRAGMA user_version=102" RunParamQuery(sSQL, New Hashtable) End If diff --git a/GBM/Managers/mgrXML.vb b/GBM/Managers/mgrXML.vb index b9c29ec..a25c35d 100644 --- a/GBM/Managers/mgrXML.vb +++ b/GBM/Managers/mgrXML.vb @@ -28,6 +28,7 @@ Public Class mgrXML oGame.FolderSave = g.FolderSave oGame.FileType = g.FileType oGame.ExcludeList = g.ExcludeList + oGame.Parameter = g.Parameter For Each t As Tag In g.Tags oGame.ImportTags.Add(t) Next diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index 046eedc..763550d 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -1842,6 +1842,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Parameter:. + ''' + Friend ReadOnly Property frmGameManager_lblParameter() As String + Get + Return ResourceManager.GetString("frmGameManager_lblParameter", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Process:. ''' diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index 8976911..d0c50eb 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -1783,4 +1783,7 @@ [PARAM] TB + + Parameter: + \ No newline at end of file