Waarom zou het niet meer mogen gebeuren na het openen? Dan kan het opeens op 2 manieren
Maar ik zal nog even kijken hoe het dan zou moeten. Ik hoop dat ik daar niet te lang mee bezig ben....
MartinJM
[edit]
Dit zorgt ervoor dat het alleen de eerste 5 seconden werkt. Dat is aan te passen door bovenaan de variable "Interval" aan te passen.
[/edit]
[CPP]Imports System.IO
Public Class Form1
Private ArgumentenBestandDir As String = My.Computer.FileSystem.SpecialDirectories.AllUsersApplicationData ''//De map waarin het argumenten bestand weggeschreven gaat worden
Private ArgumentenBestandName As String = "Bestand.txt" ''//De naam van het argumenten bestand
Private ArgumentenBestandFile As String = Path.Combine(ArgumentenBestandDir, ArgumentenBestandName) ''//Het bestand waar de argumenten in weggeschreven gaan worden
Private ArgumentenBestandLock As New Object ''//Hiermee gaan we zorgen dat niet alle processen tegelijk naar hetzelfde bestand gaan wegschrijven
Private ArgumentenBestandWatcher As FileSystemWatcher ''//Hiermee gaan we ervoor zorgen dat we het merken als het het argumenten bestand veranderd
Private Alarm As Timer
Private Interval As Integer = 5000 ''//Ik heb 5000 milliseconden gekozen, maar je moet zelf even kijken wat jij wil
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CheckArgumentenBestand()
''//De volgende 4 regels zullen ervoor zorgen dat het alleen werkt in de eerste 5 seconden dat het programma gestart is
Alarm = New Timer
AddHandler Alarm.Tick, AddressOf Alarm_Tick
Alarm.Interval = Interval
Alarm.Start()
End Sub
Private Sub CheckArgumentenBestand()
If Not File.Exists(ArgumentenBestandFile) Then
File.Create(ArgumentenBestandFile)
End If
CheckIfFirst()
End Sub
Private Sub CheckIfFirst()
Dim AllProcesses() As Process = Process.GetProcesses ''//Haal alle processen op
For i As Integer = 0 To AllProcesses.Count - 1 Step 1 ''//Loop door alle processen
If AllProcesses(i).ProcessName = Process.GetCurrentProcess.ProcessName And Not AllProcesses(i).Id = Process.GetCurrentProcess.Id Then ''//Kijk of er een proces is met dezelfde naam met een ander id (anders ''//ziet''// hij zichzelf
''//De volgende 3 regels zullen ervoor zorgen dat het alleen werkt in de eerste 5 seconden dat het programma gestart is
If AllProcesses(i).StartTime.AddMilliseconds(Interval) < Now Then
Continue For
End If
WriteToFile() ''//De bijgeleverde paden wegschrijven naar een bestand
End If
Next ''//Als het wel de eerste is, zal er niks gebeuren
FirstInstance() ''//De codes voor de eerste instantie aanroepen
End Sub
Private Sub FirstInstance()
''//Hier is het dus de eerste instantie
Dim CommandArgs = My.Application.CommandLineArgs ''//Ook de eerste instantie kan argumenten meekrijgen
If Not CommandArgs.Count = 0 Then ''//Als er geen meegeleverd zijn hoeven er ook geen in de listbox gezet te worden
For i As Integer = 0 To CommandArgs.Count - 1 Step 1 ''//Door de meegeleverde argumenten lopen
If Not CommandArgs(i).Count = 0 Then
ListBox1.Items.Add(CommandArgs(i)) ''//Argumenten toevoegen aan de listbox
End If
Next
End If
ArgumentenBestandWatcher = New FileSystemWatcher(ArgumentenBestandDir, ArgumentenBestandName) ''//De filewatcher instellen op de goede map met het goede filter zodat het goede bestand gecheckt wordt
AddHandler ArgumentenBestandWatcher.Changed, AddressOf ArgumentenBestandAangepast ''//Als het bestand is aangepast moet de sub "ArgumentenBestandAangepast" aangeroepen worden
AddHandler ArgumentenBestandWatcher.Created, AddressOf ArgumentenBestandAangepast ''//Ook als het bestand aangemaakt wordt
ArgumentenBestandWatcher.EnableRaisingEvents = True ''//Zorgen dat de events ook gebruikt worden
End Sub
Private Sub ArgumentenBestandAangepast()
Dim ArgumentenBestandInhoud As String = Nothing ''//Hierin gaan we de inhoud wegschrijven zodat het bestand zo kort mogelijk geopend is
SyncLock ArgumentenBestandLock
Dim Stream As New FileStream(ArgumentenBestandFile, FileMode.Open)
Dim Reader As New StreamReader(Stream)
ArgumentenBestandInhoud = Reader.ReadToEnd ''//Alles uitlezen
Reader.Close()
Stream.Close()
ArgumentenBestandWatcher.EnableRaisingEvents = False ''//Om te zorgen dat er geen infinite loop ontstaat
Stream = New FileStream(ArgumentenBestandFile, FileMode.Truncate)
Stream.Flush() ''//Het bestand legen zodat we er geen dubbele dingen in zetten
Stream.Close()
ArgumentenBestandWatcher.EnableRaisingEvents = True ''//Weer aan zetten voor aankomende argumenten
End SyncLock
Dim Argumenten() As String = ArgumentenBestandInhoud.Split(New Char() {vbNewLine, vbCrLf, vbCr, vbLf, Chr(13)}) ''//Alle verschillende argumenten in een array zetten
For i As Integer = 0 To Argumenten.Count - 1 Step 1
If Not Argumenten(i).Count = 0 Then
ListBox1.Items.Add(Argumenten(i)) ''//Argumenten toevoegen aan de listbox
End If
Next
End Sub
Private Sub WriteToFile()
Dim CommandArgs = My.Application.CommandLineArgs ''//Alle CommandLineArgs ophalen
If CommandArgs.Count = 0 Then ''//Kijken of er uberhaupt wel argumenten zijn
End ''//Als die er niet zijn, afsluiten (Ik doe dat met ''//End''// omdat dat bij multithreaden soms beter werkt)
End If
For i As Integer = 0 To CommandArgs.Count - 1 Step 1 ''//Door alle argumenten lopen
SyncLock ArgumentenBestandLock
Dim Stream As New FileStream(ArgumentenBestandFile, FileMode.Append)
Dim Writer As New StreamWriter(Stream)
Writer.WriteLine(CommandArgs(i)) ''//Het wegschrijven van alle argumenten
Writer.Close()
Stream.Close()
End SyncLock
Next
End ''//Hier is alles gedaan wat er op dit moment moest gebeuren, dus afsluiten
End Sub
''//De volgende 3 regels zullen ervoor zorgen dat het alleen werkt in de eerste 5 seconden dat het programma gestart is
Private Sub Alarm_Tick()
ArgumentenBestandWatcher.EnableRaisingEvents = False
End Sub
End Class
[/CPP]