pero aun me queda por resolver como capturar el archivo que intento abrir es decir ya no se abre otra ves pero no puedo obtener el nuevo archivo que intento abrir en mi aplicacion
Pensé que ya sabrías como. Puedes usar cualquier tipo de intercomunicación entre procesos (IPC) como por ejemplo MMF (
memory mapped file) para compartir un bloque de memoria entre tus procesos y escribir los argumentos recibidos en el stream, o iguálmente lo puedes hacer con una
named pipe, o con un
socket si me apuras. Tambien puedes usar la clase
EventWaitHandle para crear un 'semáforo' global entre tus procesos, aunque ello implicaría la necesidad de adaptar tu código para volverlo asíncrono (ya que la idea sería detener la ejecución de un thread y enviar una señal de reanudación al iniciar la próxima instancia de tu aplicación con los nuevos argumentos). En fin, formas de hacerlo hay muchas. Yo lo que considero más simple para este escenario en concreto sería declarar una clase que implemente la interfaz
INotifyPropertyChanged, y listo.
Te muestro un ejemplo completo mediante la implementación de
INotifyPropertyChanged:
CommandLineNotifier.vb
Imports System.Collections.ObjectModel
Imports System.ComponentModel
Imports System.Runtime.CompilerServices
Public Class CommandLineNotifier : Implements INotifyPropertyChanged
Public Property Arguments As ReadOnlyCollection(Of String)
Get
Return Me.argumentsB
End Get
Set(ByVal value As ReadOnlyCollection(Of String))
If (value.Any()) AndAlso Not (value.Equals(Me.argumentsB)) Then
Me.argumentsB = value
Me.NotifyPropertyChanged()
End If
End Set
End Property
Private argumentsB As ReadOnlyCollection(Of String)
Private Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
Public Shared Event ArgumentsReceived As EventHandler(Of ReadOnlyCollection(Of String))
Public Sub New(ByVal notifyCurrentArguments As Boolean)
If (notifyCurrentArguments) Then
Me.Arguments = New ReadOnlyCollection(Of String)(Environment.GetCommandLineArgs().Skip(1).ToArray())
End If
End Sub
Private Sub NotifyPropertyChanged(<CallerMemberName> Optional ByVal propertyName As String = Nothing)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
Private Sub CommandLineNotifier_PropertyChanged(sender As Object, e As PropertyChangedEventArgs) _
Handles Me.PropertyChanged
Select Case (e.PropertyName)
Case NameOf(Arguments)
If (CommandLineNotifier.ArgumentsReceivedEvent IsNot Nothing) Then
RaiseEvent ArgumentsReceived(Me, Me.argumentsB)
End If
Case Else
Throw New NotImplementedException()
End Select
End Sub
End Class
ApplicationEvents.vb (la clase donde se controlan los eventos de la aplicación)
Imports Microsoft.VisualBasic.ApplicationServices
Namespace My
Partial Friend Class MyApplication
Public Shared CommandLineNotifier As CommandLineNotifier
Public Sub MyApplication_StartupNextInstance(sender As Object, e As StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
If (e.CommandLine.Any) Then
My.MyApplication.CommandLineNotifier.Arguments = e.CommandLine
End If
End Sub
End Class
End Namespace
Form1.vb
Imports System.Collections.ObjectModel
Public Class Form1
Public Sub New()
MyClass.InitializeComponent()
AddHandler CommandLineNotifier.ArgumentsReceived, AddressOf Me.CommandLineNotifier_ArgumentsReceived
My.MyApplication.CommandLineNotifier = New CommandLineNotifier(notifyCurrentArguments:=True)
End Sub
Public Sub CommandLineNotifier_ArgumentsReceived(sender As Object, e As ReadOnlyCollection(Of String))
' En este ejemplo añado los nuevos argumentos recibidos, a un ListBox.
Me.ListBox1.Items.AddRange(DirectCast(sender, CommandLineNotifier).Arguments.ToArray())
End Sub
End Class
Saludos.