none
Arrastrar icono a WPF RRS feed

  • Pregunta

  • Saludos a todos.

    Bueno mi idea es esta arrastrar un icono del escritorio hacia mi ventana (wpf)  obtener sus "datos" (por ejemplo su ruta e imagen de icono basicamente) y almacenarlo en una variable. Bueno a fin de cuentas crear accesos directos dentro de mi aplicacion al arrastrar desde el escritorio los iconos.

    Soy nuevo en la programacion asi que escribir de manera que pueda entender por favor (si es codigo con comentarios paso a paso xD ), lo agradeceria bastante.

    Por ahora tengo esto:

    public MainWindow()
            {
                InitializeComponent();
                // Añadir using System.Windows.Controls;
                richTextBox1.AddHandler(RichTextBox.DragOverEvent, new DragEventHandler(RichTextBox_DragOver), true);
                richTextBox1.AddHandler(RichTextBox.DropEvent, new DragEventHandler(RichTextBox_Drop), true);
                 
            }

            private void RichTextBox_DragOver(object sender, DragEventArgs e)
            {
                if (e.Data.GetDataPresent(DataFormats.FileDrop))
                {
                    e.Effects = DragDropEffects.All;
                }
                else
                {
                    e.Effects = DragDropEffects.None;
                }
                e.Handled = false;
            }

            private void RichTextBox_Drop(object sender, DragEventArgs e)
            {
                if (e.Data.GetDataPresent(DataFormats.FileDrop))
                {
                    string[] rutaDelDocumento = (string[])e.Data.GetData(DataFormats.FileDrop);

                    // por defecto, abre como texto enriquecido (RTF).
                    var formatoDeDatos = DataFormats.Rtf;

                    // si mayus es presionado, abre como texto sin formato.
                    if (e.KeyStates == DragDropKeyStates.ShiftKey)
                    {
                        formatoDeDatos = DataFormats.Text;
                    }

                    System.Windows.Documents.TextRange rango;
                    System.IO.FileStream archivostream;
                    if (System.IO.File.Exists(rutaDelDocumento[0]))
                    {
                        try
                        {
                            // abre el documento en el RichTextBox.
                            rango = new System.Windows.Documents.TextRange(richTextBox1.Document.ContentStart, richTextBox1.Document.ContentEnd); // de principio a fin
                            archivostream = new System.IO.FileStream(rutaDelDocumento[0], System.IO.FileMode.OpenOrCreate);     //modo de abrir
                            rango.Load(archivostream, formatoDeDatos);
                            archivostream.Close();
                        }
                        catch (System.Exception)
                        {
                            MessageBox.Show("El archivo no puedo ser abierto. Asegúrate de que se trata de un archivo de texto.");
                        }
                    }
                }
            }

    Pero solo funciona con archivos de texto y cuando trato de arrastrar por ejemplo un acceso directo de paint me sale así:

    L?F?)@%SystemRoot%system32shell32.dll,-22566%windir%system32mspaint.exew    ?-1SPS?XF?L8C???&?m?>1SPSU(L?y?9K????-???#???%windir%.exe%windir%system32mspaint.exe

    lunes, 27 de julio de 2020 2:57

Respuestas

  • Al fin lo logré agregando la referencia COM  windows script host object model; pongo el codigo por si alguien quiere sacarle aprovecho (no olvidar añadir: "using IWshRuntimeLibrary;")

                  string linkPathName = @"C:/Users/nombredeusuario/Desktop/leor.lnk"; // cambie esto al acceso directo

                if (System.IO.File.Exists(linkPathName))
                {
                
                    WshShell shell = new WshShell(); //Create a new WshShell Interface
                    IWshShortcut link = (IWshShortcut)shell.CreateShortcut(linkPathName); //Link the interface to our shortcut

                    MessageBox.Show(link.TargetPath); //Show the target in a MessageBox using IWshShortcut
                    MessageBox.Show(link.Description);
                    MessageBox.Show(link.FullName);
                    MessageBox.Show(link.IconLocation);
                    MessageBox.Show(link.Hotkey);
                    MessageBox.Show(link.Arguments);

    Al ir escribiendo link. ... aparecen las demas ¿propiedades? del icono.


    • Marcado como respuesta Joseph LM martes, 28 de julio de 2020 21:45
    • Editado Joseph LM martes, 28 de julio de 2020 21:46
    martes, 28 de julio de 2020 21:45

Todas las respuestas

  • Hola,

     

    Voy a investigar tu consulta.

     

    Saludos Cordiales

    Gabriel Castro

    lunes, 27 de julio de 2020 16:23
    Moderador
  • Hola,

     

    Voy a investigar tu consulta.

     

    Saludos Cordiales

    Gabriel Castro

    Gracias. Saludos.
    lunes, 27 de julio de 2020 16:50
  • Hola Joseph LM,

    Te adjunto la documentación oficial y un vídeo en que se muestra paso a paso como hacerlo. Quedo pendiente de cualquier actualización. Gracias por levantar tu consulta en los foros de msdn.

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.  

    lunes, 27 de julio de 2020 20:42
    Moderador
  • Muchas gracias por tu interés, logré obtener la ruta de cualquier icono (ejem:paint). Pero quiero obtener las propiedades del icono como el destino al que apunta el icono, su comentario (de preferencia) y su imagen de icono. Es importante ya que si el usuario elimina el icono del escritorio me generaría un error al  no encontrarse por ejemplo el acceso directo a "texto.txt".

    Seguiré investigando. Me parece que este link puede ayudar: https://docs.microsoft.com/es-es/dotnet/api/system.drawing.icon.tobitmap?view=dotnet-plat-ext-3.1#System_Drawing_Icon_ToBitmap

    Aquí encontre, al parecer, lo que quiero, pero se me hace un poco dificl entender como usarlo: https://social.msdn.microsoft.com/Forums/es-ES/ea13e034-e482-4189-8463-9282590d7ab9/cdigo-para-accesos-directos?forum=vcses
    • Editado Joseph LM martes, 28 de julio de 2020 1:25
    martes, 28 de julio de 2020 1:18
  • Al fin lo logré agregando la referencia COM  windows script host object model; pongo el codigo por si alguien quiere sacarle aprovecho (no olvidar añadir: "using IWshRuntimeLibrary;")

                  string linkPathName = @"C:/Users/nombredeusuario/Desktop/leor.lnk"; // cambie esto al acceso directo

                if (System.IO.File.Exists(linkPathName))
                {
                
                    WshShell shell = new WshShell(); //Create a new WshShell Interface
                    IWshShortcut link = (IWshShortcut)shell.CreateShortcut(linkPathName); //Link the interface to our shortcut

                    MessageBox.Show(link.TargetPath); //Show the target in a MessageBox using IWshShortcut
                    MessageBox.Show(link.Description);
                    MessageBox.Show(link.FullName);
                    MessageBox.Show(link.IconLocation);
                    MessageBox.Show(link.Hotkey);
                    MessageBox.Show(link.Arguments);

    Al ir escribiendo link. ... aparecen las demas ¿propiedades? del icono.


    • Marcado como respuesta Joseph LM martes, 28 de julio de 2020 21:45
    • Editado Joseph LM martes, 28 de julio de 2020 21:46
    martes, 28 de julio de 2020 21:45