' /**
' Original en plantillas
' ---------------------------------------------
' [- (A) Contenido -]
' ---------------------------------------------
' [- Versión -] = 23.10.22.1116
' [- Class Name -] = LanzarLinkWScriptShellCommnad
' [- Descripción -] = Command que lanza una URL en el navegador
' ---------------
' [- Observaciones -] = La idea inicial es que lance las URL de música de You Tube
'
' ATENCION
' [Obsolete("Esta clase ha sido un experimento. Usar la clase [LanzarLinkProcessStartCommand] en su lugar")]
'
' -----------------------------------------------------------------------
' El origen de este código estuvo en que de repente, al actualizar
' A Vb.Net.7.0, la instrucción:
' [System.Diagnostics.Process.Start(dirección, Nothing)]
' no funcionaba como antes. estuve mirando en Internet y
' encontré y adapte este código que funciona con ["WScript.Shell]
' pero después solucione el problema de Process.Start
' por lo que esta clase se queda en mi colección como algo que funciona
' pero que no voy a emplear de momento.
' Usar la clase [LanzarLinkProcessStartCommand] en su lugar
'
' -----------------------------------------------------------------------
' NOTA IMPORTANTE
' Requiere la referencia
' Windows Script Host Object Model
'
'
' ---------------
#Region "Código de ejemplo"
' ---------------
' [- Código de ejemplo -] =
' ----------
' ' ----------------------------------------------------------------------------
'
' '' En la declaración de la ventana
' ' xmlns:localCommand="clr-namespace:Wpfetcetcetc.Util.Command"
'
' '
' '
' '
'
'
' '
'
' '
' ' ----------------------------------------------------------------------------
' '
' ' Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
' '
' ' Dim localDireccion As String = "https://www.youtube.com/watch?v=a7UFm6ErMPU"
' ' Using objCommandUrl As New Util.Command.LanzarLinkWScriptShellCommnad
' ' objCommandUrl.Execute(localDireccion)
' ' End Using
' '
' ' End Sub
' ' ----------------------------------------------------------------------------
'
#End Region
'
'
' ---------------------------------------------
' [- (B) Información básica -]
' ---------------------------------------------
' [- Module Name -] = LanzarLinkWScriptShellCommnad.vb
' [- Propietario -] = AGUILA10\Admin
' [- Lenguaje -] = es-ES (Español - España)
' [- Type -] = Visual Basic Source file
' [- Size -] = 5,18 KB
' ---------------
' [- Fecha de creación -] = 2017/02/15 T 16:11:17 Z
' [- Última modificación -] = 2023/10/22 T 19:31:00 Z
' ---------------
' [- Creada inicialmente en -] = SolucionWpfVentanasAyuda
' ---------------
' [- NET Framework Release -] = Release: 4.6.1 o posterior
' [- NET Framework Versión -] = Versión: 4.0.30319.42000
' ---------------
' [- Generador Nombre -] = WpfDocumentadorClases2017
' [- Generador Versión -] = 17.02.10.1912
' ---------------------------------------------
' [- (D) Revisiones -]
' ---------------------------------------------
' [- Historial de revisiones -] =
' - 2017/02/16 - Creación.
' - 2023/10/17 - Refactorizado porque no funcionaba con NET 7.0
' ---------------------------------------------
' [- /Eof -]
' */
Namespace Util.Command
'''
''' Command que lanza una URL en el navegador por defecto del sistema
'''
Public Class LanzarLinkWScriptShellCommnad
Inherits DelegateCommand
Implements IDisposable
'-------------------------------------------------------
' 'Forma de usarse
'
' En la declaración de la ventana
' xmlns:localCommand="clr-namespace:Wpfetcetcetc.Util.Command"
'
' '
' '
' '
'
'
' '
'
' '
'
'----------------------------------------------------------------------------
'
'Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
'
' Dim localDireccion As String = "https://www.youtube.com/watch?v=a7UFm6ErMPU"
' Using objCommandUrl As New Util.Command.LanzarLinkWScriptShellCommnad
' objCommandUrl.Execute(localDireccion)
' End Using
'
'End Sub
'----------------------------------------------------------------------------
'
'''
''' Constructor
'''
Public Sub New()
MyBase.New()
'-------------------------------
' Los parámetros de [Command]
' El [Delegado] (la Acción) que llamara al método [cmdExecute]
Dim localExcuteAction As Action(Of Object) = New Action(Of Object)(AddressOf Me.CmdExecute)
' El [Delegado] que llamara al método [cmdCanExecute]
Dim localCanExecuteAction As Predicate(Of Object) = Function(param) CmdCanExecute(param)
' [Opcional][Informativo] El nombre de este command (El nombre de esta clase)
Dim localNombreCommand As String = System.Reflection.MethodBase.GetCurrentMethod.DeclaringType.Name
' [Opcional][Informativo] Descripción de lo que hace este command.
Dim localDescripcion As String = "Pone en marcha la Uri recibida a través del parámetro, la idea es que sea una canción, o un video."
' ¿¿ Se disparan los eventos [ExecuteStart] y [ExecuteCompleted] ??
Dim localDispararEventos As Boolean = False
'----------------------------------
' A modo de ejemplo
' [Opcional] Juego de teclas que activan el comando (P.e: Ctrl + D)
'Dim localGesture As KeyGesture = New KeyGesture(Key.Escape, ModifierKeys.Control, "Cerrar la ventana [Esc]")
'-------------------------------
' Cargar valores en la clase base
'-------------------------------
' Obligatorias
MyBase._executeAction = localExcuteAction
MyBase._canExecuteAction = localCanExecuteAction
' Opcionales
MyBase.ComandoNombre = localNombreCommand
MyBase.ComandoDescripcion = localDescripcion
'MyBase.KeyGesture = localGesture
MyBase.DispararEventosExecuterStartCompleted = localDispararEventos
End Sub
'''
''' Esta función cierra abre el navegador con la dirección que se recibe por parámetro
'''
Private Sub CmdExecute(ByVal parameter As Object)
'---------------------------------
' Se manejan en la clase base
' Me.EstaEjecutandose = True
'Call OnExecuteStart(parameter) ' Disparar el evento (personalizado) previo
'
'---------------------------------
' El proceso (la tarea) que realiza este command
If parameter IsNot Nothing Then
Dim localDireccion As System.String = TryCast(parameter, String)
If localDireccion IsNot Nothing Then
If String.IsNullOrWhiteSpace(localDireccion) = False Then
' ----------------------------------------------------
' 2023/10/15 Refactorizado
' https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.start)
' No funciona con net7.0
' System.Diagnostics.Process.Start(dirección, Nothing)
' He visto que funciona instanciando WScript.Shell, pero no se porque
' ----------------------------------------------------
If Me.CanExecute(localDireccion) = True Then
Dim localUrl As New System.Uri(localDireccion)
'----------------------------------------------
' NOTA IMPORTANTE
' [IWshShell_Class] y [IWshShortcut_Class]
' Requieren la referencia
' Windows Script Host Object Model
'----------------------------------------------
Dim oShell As IWshRuntimeLibrary.IWshShell_Class = Nothing
Dim oShortcut As IWshRuntimeLibrary.IWshShortcut_Class = Nothing
Try
oShell = CType(CreateObject("WScript.Shell"), IWshRuntimeLibrary.IWshShell_Class)
'oShell.Run("http://joaquin.medina.name")
'oShell.Run(localDireccion)
'Dim localUrl As New Uri(localDireccion)
oShell.Run(localUrl.AbsoluteUri)
Catch ex As system.Exception
' No hacer nada
' No funciona y no se lanza el recurso
'------
' Variable para el evento [ExecuteCompleted]
Finally
If oShell IsNot Nothing Then
oShell = Nothing
End If
If oShortcut IsNot Nothing Then
oShortcut = Nothing
End If
End Try
End If
End If
End If
End If
'---------------------------------
' Se manejan en la clase base
' Call OnExecuteCompleted(parameter, localEx)' Disparar el evento (personalizado) Final
' Me.EstaEjecutandose = False
'
End Sub
#Region "Refactorizado"
''''
'''' Siempre devuelve (True) [Si se puede ejecutar]
''''
'Private ReadOnly Property cmdCanExecute(ByVal parameter As Object) As Boolean
' Get
' If parameter IsNot Nothing Then
' Dim target As System.String = TryCast(parameter, String)
' If target IsNot Nothing Then
' Dim url As New Uri(target)
' Return url.IsWellFormedOriginalString
' End If
' End If
' Return False
' End Get
'End Property
'-------------------------------------
' Refactorizado 2023/10/17 - Movido a la clase base
' '''
' ''' Variable local que contiene el valor que devuelve la ejecución de la función [CanExecute]
' ''' Se usa para saber si hay que disparar el evento [CanExecuteChanged] o no
' ''' tiene el valor True, porque soy optimista y supongo que siempre se puede ejecutar
' '''
' Private campoCanExecuteAnterior As Boolean = True
' /Eof
'-------------------------------------
#End Region
'''
''' ¿ Se puede ejecutar el proceso execute? S/N
'''
'''
''' [True], el proceso se puede ejecutar. [False], pues no.
'''
Private Function CmdCanExecute(ByVal parameter As Object) As Boolean
'----------------------
' A) El resultado.
Dim localResultadoCanExecute As Boolean = False
'----------------------
' B) El control de si se puede ejecutar o no
'------------------------
' Normalmente la condición básica para poder realizar la tarea
' es que existan los datos de entrada
' si existe otra condición puede cambiarse en la clase derivada
'------------------------
If parameter IsNot Nothing Then
Dim target As System.String = TryCast(parameter, String)
If target IsNot Nothing Then
Dim url As New System.Uri(target)
localResultadoCanExecute = url.IsWellFormedOriginalString
End If
End If
''----------------------
''C) Mirar si se dispara el evento o no
' Se hace en la clase base
'If Boolean.Equals(campoCanExecuteAnterior, localResultadoCanExecute) = False Then
' campoCanExecuteAnterior = localResultadoCanExecute
' MyBase.OnCanExecuteChanged()
'End If
'----------------------
'D) Devolver el resultado
Return localResultadoCanExecute
End Function
#Region "IDisposable Support. [Para clases derivadas] Implementación de .NET Version: [2015/03/22]"
Private _disposedValue As Boolean ' Para detectar llamadas redundantes
' IDisposable
Protected Overrides Sub Dispose(disposing As Boolean)
If Not Me._disposedValue Then
Me._disposedValue = True
If disposing Then
'------------------------------------------------------------------------------------------
' 1) Desechar objetos SI administrados.
' Un objeto administrado es cualquier objeto de .NET
' es un objeto de .NET que maneja el motor de ejecución de NET
'------------------------------------------------------------------------------------------
'If Not (objeto Is Nothing) Then
' objeto = Nothing
'End If
End If
'------------------------------------------------------------------------------------------
' 2) Liberar objetos NO administrados.
' Son recursos que NO administra el motor en tiempo de ejecución,
' como identificadores de ventanas (HWND),
' conexiones a bases de datos, un objeto creado directamente
' llamando al API de Windows, etc. el Word o Excel
'------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------
' 3) Establecer campos grandes como Null.
'------------------------------------------------------------------------------------------
'------------------------------------------------------------------------------------------
' 4) La clase base (si existe)
'------------------------------------------------------------------------------------------
MyBase.Dispose(True)
End If
End Sub
#End Region
End Class
End Namespace