Automatisch opstarteb VB mediaspeler

Status
Niet open voor verdere reacties.

bonnowagt

Gebruiker
Lid geworden
7 dec 2006
Berichten
445
Hallo,

Ik heb een mediaspeler ontworpen in vb2010. Ik heb deze ook als standaardprogramma gekoppeld een mijn audio/video bestanden.
Voorbeeld: Ik klik in verkenner op een mp 3 bes5tand en dan start mij VB speler automatisch op met desbetreffende muziekbestand die dan ook keurig op mijn playlist komt te staan.

Ik doe dit middels
Code:
 Dim Pad As String = My.Application.CommandLineArgs(0)
                  If Pad.EndsWith(".mp3") Or Pad.EndsWith(".mp4") Or Pad.EndsWith(".wav") Or Pad.EndsWith(".flac") Then
                  ListBox1.Items.Add(Pad)
                  end if

Nu mijn vraag:
Het werkt prima zolang ik maar 1 muziekbestand selecteer. Selecteer ik bijvoorbeeld drie bestanden dan wordt het programma drie keer opgestart en dus niet 1 keer met de drie bestanden op de playlist.

Ik heb het geprobeerd als volgt
Code:
Dim Pad As String = My.Application.CommandLineArgs(0)
                 For index As Integer = 0 To My.Application.CommandLineArgs.Count - 1 Step 1
                 If Pad.EndsWith(".mp3") Or Pad.EndsWith(".mp4") Or Pad.EndsWith(".wav") Or Pad.EndsWith(".flac") Then
                 ListBox1.Items.Add(Pad)
                 'End If
            Next

Maar dit werkt dus precies hetzelfde. Wie heeft een oplossing

Vriendelijke groet


maar werkt niet wie heeft een idee
 
Hoi,

Je had hem bijna goed, alleen moet ook het pad binnen de loop, nu veranderd het pad helemaal niet:
[CPP] For index As Integer = 0 To My.Application.CommandLineArgs.Count - 1 Step 1
Dim Pad As String = My.Application.CommandLineArgs(index)
If Pad.EndsWith(".mp3") Or Pad.EndsWith(".mp4") Or Pad.EndsWith(".wav") Or Pad.EndsWith(".flac") Then
ListBox1.Items.Add(Pad)
End If
Next[/CPP]

Dan zou het moeten werken.

MartinJM
 
Hallo,

Bedankt voor je reactie maar dit doet precies hetzelfde. Als ik drie mp3 bestandjes selecteer start het programma drie keer op wel alle drie met een andere bestand precies dezelfde werking als ik al had

Vr gr.
 
Ik denk dat ik de oplossing heb. Als je bij het opstarten nou eens kijkt of het proces al actief was. Als die niet actief is, maakt hij het. Als die al wel actief is - dus als je twee bestanden wilt openen -, wordt het bestand toegevoegd aan de afspeellijst. De afspeellijst moet dan wel een tekstbestand worden. Ik hoop dat je het snapt. Je kan hier zijn hoe je tekst uit een bestand leest: http://www.vbvoorbeelden.be/Tekst-Lezen-uit-een-Bestand.html en hier hoe je tekst in een bestand toevoegt: http://www.vbvoorbeelden.be/Tekst-Schrijven-naar-een-Bestand.html.

Pim
 
Hallo,

Ja klopt het programma heb ik al dusdanig dat hij maar 1 keer kan opstarten en het bestand wordt slechts 1 keer aan de lijst toegevoegd. Dus niet bijvoorbeeld drie bestanden als ik die selecteer. Ik heb het nog niet geprobeerd met tekst bestanden maar daar heb ik ook niets aan. Het moeten audio of videobestanden zijn dus bijvoorbeeld drie mp3 bestanden.

Bij de loadfunctie wordt verwezen naar een public sub dus als volgt

Code:
CheckForExistingInstance()

public sub
  Public Sub CheckForExistingInstance()
        'Get number of processes of you program
        If Process.GetProcessesByName _
          (Process.GetCurrentProcess.ProcessName).Length > 1 Then
            System.Diagnostics.Process.GetCurrentProcess().Kill()
        End If
    End Sub
 
Laatst bewerkt door een moderator:
Ik snap je nu niet, maar met dat tekstbestand bedoel ik dat je steeds de paden daarop kan zetten en dat je media speler ze stuk voor stuk afspeelt aan de hand van die lijst.

Pim
 
Ik denk dat we elkaar niet begrijpen
Dit is het stukje code:
Code:
 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        CheckForExistingInstance()
        Cursor = Cursors.AppStarting
        Try
            Dim Pad As String = My.Application.CommandLineArgs(0)
            Dim Pad2 As String = (Path.GetFileNameWithoutExtension(My.Application.CommandLineArgs(0)))
            If Pad.EndsWith(".mp4") Or Pad.EndsWith(".mp3") Or Pad.EndsWith(".wav") Or Pad.EndsWith(".flac") _
                 Or Pad.EndsWith(".jpg") Or Pad.EndsWith(".png") Or Pad.EndsWith(".gif") _
                  Or Pad.EndsWith(".mpeg") Or Pad.EndsWith(".avi") Or Pad.EndsWith(".mkv") Then
                ListBox2.Items.Add(Pad2)
                ListBox1.Items.Add(Pad)
            End If
            ListBox2.SelectedIndex = 0
            ListBox1.SelectedIndex = ListBox2.SelectedIndex
        Catch ex As Exception
end sub

Code:
 Public Sub CheckForExistingInstance()
   'Get number of processes of you program

   If Process.GetProcessesByName _
          (Process.GetCurrentProcess.ProcessName).Length > 1 Then
            System.Diagnostics.Process.GetCurrentProcess().Kill()
        End If

Dus het volgende wil ik bereiken:

Ik ga naar verkenner, selecteer vijf mp3 bestanden. Kik op het menu op afspelen. Vervolgens wordt mijn SPELER gestart.
Het resultaat is dat er slechts 1 mp3 bestand in mijn listbox staat en die wordt afgespeeld.

Vriende groet
 
Hoi,

Wat Pim15 aangaf is goed te doen, ook al zijn er wat obstakels waar je overheen moet. Maar daarbij kunnen we dan wel helpen. Als je een voorbeeld ervan nodig hebt, moet je er even om vragen, ik heb het een keer gebruikt.

Maar er zijn ook nog andere methodes om dit te doen, waarvoor je even naar de volgende links kan kijken:
http://www.codeproject.com/Articles/19740/Send-strings-to-another-application-by-using-Windo
http://www.vbforums.com/showthread.php?682427-Sending-Text-to-another-App-using-SendMessage
http://bytes.com/topic/visual-basic-net/answers/729768-easiest-send-string-one-app-another

Succes!
MartinJM

[edit]
Je kan de path's van de mp3 bestanden naar een text-file wegschrijven....
[/edit]
 
CheckForExistingInstance lijkt niet de goede naam te zijn, er wordt niet alleen gecontroleerd op een existing instance, maar als deze bestaat wordt het huidige proces meteen gestopt. Wat Pim bedoelt te zeggen is dat je vóórdat je het huidige proces afsluit een message naar de reeds actieve instance stuurt met de meegegeven bestandsnaam en deze toevoegt aan de lijst in de actieve instance.
 
Ik begrijp je heel goed. Ik leg het eens rustig uit. Je moet zorgen dat de afspeellijst in een tekstbestand komt te staan. Dat is belangrijk voor zo meteen. Zet je bij formload neer dat die controleert of je applicatie al actief is. Als die niet actief is gaat die door en zet het pad in de afspeellijst dat een tekstbestand is. Als die wel actief is - wat gebeurt als je er twee selecteert want dan opent ie ze stuk voor stuk -, zet die het pad in dat zelfde tekstbestand en sluit die zichzelf af. Dan heb je dus bijvoorbeeld dit in dat tekstbestand:
C:/liedje1.mp3
C:/liedje2.mp3

Steeds gaat die dan controleren of het tekstbestand wordt gewijzigd. Dit kan je doen met een filewatcher. Als het bestand wordt gewijzigd, zet die die informatie in de listbox waarin ook de afspeellijst staat. Dan moet het wel kunnen. Ik hoop dat je het snapt.

Pim

[EDIT]Ik ben aan het schrijven en er komen in eens twee reacties bij. En ik bedoel precies wat ReneDirks zegt.[/EDIT]
 
Laatst bewerkt:
Hoi,

Hier is de code van mijn voorbeeld (ik heb het opnieuw geschreven omdat ik het origineel niet meer kon vinden):
[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 Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CheckArgumentenBestand()
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
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
End Class[/CPP]

Het form is vrij simpel in dit voorbeeld: Er staat alleen een listbox in :)
Het werkt wel zolang het programma aanstaat. Dus niet alleen maar bij het opstarten van het programma. Als je dat wel graag wil, zal ik kijken of ik daar misschien iets voor kan vinden.

2 plaatjes om het misschien iets duidelijker te maken (het zijn er 2, maar ze willen niet helemaal werken :confused:):
Voorbeeld1.PNG
Voorbeeld2.PNG

Succes ermee! :thumb:
MartinJM
 
Laatst bewerkt:
Hallo,

Hee bedankt voor zon snelle reactie,

Ik heb het keurig netjes gemaakt zoals omschreven, maar nog steeds hetzelfde euvel terwijl wel de bestanden als text worden weggeschreven.
Maar dit was ook niet exact de bedoeling want als het programma al eerder is opgestart dan doe ik dat middels drag and drop. Het gaat echt alleen om bestanden te kunnen selecteren en dan via OPENEN wordt de media opgestart met de bestanden in de list dat is de bedoeling.
 
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]
 
Laatst bewerkt:
Sorry dan heb ik je verkeerd begrepen. Natuurlijk mag het na het openen gebeuren, dat is geen probleem, dacht dat je bedoelde dat ik dan eerst mijn programma handmatig zou moeten openen. Heb je verkeerd begrepen.
Op zich is dit prima, maar het blijft nog wel het feit dat het niet helemaal werkt zoals ik aangaf.
Met jouw code wordt alles wel weggeschreven anar een textbestand, maar wordten textbestanden nog steeds 1 voor 1 weggeschreven dus wordt het programma bij het selecteren van meerdere bestanden net zo vaak geopend. dus bij het openen van twee bestanden word het programma ook twee geopend
 
Bij mij opent het programma maar een keer en staan gewoon de paden van alle bestanden in de listbox... Zelfs met 81 paden (waren dan wel mappen, maar dat maakt geen verschil).
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan