Introducción:
Este ejemplo que te muestro en esta "artículo" es la versión para .NET del
que acabo de publicar hace un rato para Visual Basic 6:
Ejecutar un
acceso directo desde
VB6 con ShellExecute.
Pero en este caso no se usa la función del API ShellExecute,
ya que en punto NET tenemos la clase Process que nos sirve
para lo mismo.
Además, en este código que te muestro tampoco incluyo cómo adaptar los
controles al nuevo tamaño del formulario (al redimensionarlos), ya que
usando la propiedad Anchor de los controles se puede hacer
muy fácilmente.
Y en el caso de aceptar ficheros con Drag & Drop, pues... ya sabes que la
forma de hacerlo en .NET es totalmente distinta a como se hacía en Visual
Basic 6.0.
En este caso, debes asignar un valor verdadero a la propiedad
AllowDrop del formulario y de la caja de textos.
Ah, y en el caso de que cierres esta aplicación y el programa que has
iniciado con ella sigue funcionando, no "bloqueará" el ejecutable y podrás
moverlo, eliminarlo o lo que quieras.
Esto te lo digo por si has leído el artículo de Visual Basic 6.0 y se te
quede en la "mente" la advertencia que hice allí.
Lo que no varía es que los accesos directos son ficheros que tienen la
extensión .lnk.
El ejemplo para ejecutar accesos directos y más...
Ya puestos a probar, me he dicho, vamos a hacer las cosas "bien", o al
menos como a mi me gustaría que fuera esa "utilidad" o ejemplo para ejecutar
cualquier acceso directo.
Y lo que he hecho es agregarle funcionalidad al formulario para que haga
lo siguiente:
- Acepte ficheros con Drag & Drop
- Adapte los controles al cambiar el tamaño del formulario
- Y, por supuesto, que ejecute lo que indiquemos
El aspecto del formulario en ejecución es como el mostrado en la figura 1:
Figura 1. La aplicación en funcionamiento
Y como puedes adivinar solo tiene dos controles: un botón (btnEjecutar)
y una caja de textos (Text1).
Te lo digo más que nada por si quieres crear el ejemplo por ti mismo, ya que
aquí abajo solo te muestro el código, pero no hay ningún ZIP con el proyecto
completo.
Para que la caja de textos se adapte al ancho del formulario, debes
asignar la propiedad Anchor para que "se ancle" a la
izquierda, arriba y a la derecha.
Para que el botón se mantenga a la derecha, debes asignar a la propiedad
Anchor los valores para que se "fije" arriba y a la
derecha... si no sabes cómo hacer esto, échale un vistazo a la entrega 3 del
curso de VB .NET en la que, entre otras cosas, explico
cómo "anclar" los
controles usando la propiedad Anchor.
Un detalle, aunque no es "crucial" para lo que vamos a ver, pero al menos
te servirá de información:
Los accesos directos en realidad son ficheros con la extensión .lnk
que contiene información del programa que queremos ejecutar, y la clase
Process maneja perfectamente.
Nota:
Aclarar, que este código vale para cualquier versión de
Visual Basic o de C#, (para .NET), y el que esté en la sección "VS2005" es
simplemente porque el código de ejemplo lo he hecho con esa versión.
El código
Y una vez hechas estas aclaraciones, veamos el código para que esto
funcione.
Lo primero que debes asegurarte es de tener las importación al espacio de
nombres System.Diagnostics que es donde está declarada la
clase
Process. En
Visual Basic esa importación estará "pre asignada", pero en C# debes hacerlo
de forma explícita ya que no se añade automáticamente esa importación:
using System.Diagnostics;
Ahora veamos el código del botón que ejecutará lo que haya en la caja de
textos Text1.
A ver si adivinas cual es el código para Visual Basic y cuál es para C#, je,
je.
Private Sub btnEjecutar_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles btnEjecutar.Click
' Ejecutar un acceso directo
Process.Start(Text1.Text, "")
End Sub
private void btnEjecutar_Click(object eventSender, EventArgs eventArgs)
{
// Ejecutar un acceso directo
Process.Start(Text1.Text, "");
}
A continuación veamos el código que permite aceptar ficheros con Drag &
Drop, para que esto funcione, la propiedad AllowDrop del
formulario y del textBox debe tener el valor True.
Como sabrás, para aceptar ficheros con Drag & Drop, en el evento
DragEnter
debes asignar un valor a la propiedad Effect con idea de
que el icono del ratón cambie y de paso acepte lo que se suelte.
Después en el evento DragDrop es dónde realmente se hace lo
que tengamos que hacer.
Nuevamente te "pongo como tarea" que adivines cual es el código de VB y el
de C#.
private void Form1_DragDrop(object sender, DragEventArgs e)
{
if(e.Data.GetDataPresent("FileDrop"))
{
Text1.Text = ((String[])e.Data.GetData("FileDrop", true))[0];
}
}
private void Form1_DragEnter(object sender, DragEventArgs e)
{
// Drag & Drop, comprobar con DataFormats
if(e.Data.GetDataPresent(DataFormats.FileDrop))
{
e.Effect = DragDropEffects.Copy;
}
}
Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) _
Handles Me.DragDrop, Text1.DragDrop
If e.Data.GetDataPresent("FileDrop") Then
Text1.Text = CType(e.Data.GetData("FileDrop", True), String())(0)
End If
End Sub
Private Sub Form1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) _
Handles Me.DragEnter, Text1.DragEnter
' Drag & Drop, comprobar con DataFormats
If e.Data.GetDataPresent(DataFormats.FileDrop) Then
e.Effect = DragDropEffects.Copy
End If
End Sub
Y esto es todo... espero que te sea de utilidad.
Nos vemos.
Guillermo
Espacios de nombres usados en el código de este artículo:
System.Windows.Forms
System.Diagnostics