2009-12-20 10 views
5

Tengo una aplicación C# que crea accesos directos para iniciar otros programas con argumentos específicos y directorios iniciales. Me gustaría que el usuario pueda arrastrar un acceso directo desde el formulario de Windows y soltarlo en cualquier lugar relevante, como el escritorio, el menú de inicio, etc., pero realmente no sé cómo manejarlo, ¿podría alguien señalarme en el ¿dirección correcta?Arrastrar y soltar de un atajo creado dinámicamente

he visto algunas muestras usando PInvoke y IShellLink como this one, o leer las respuestas en SO como here, que ya ayudan a crear accesos directos y guardarlos en un archivo .lnk. Supongo que tengo que entregar datos en una llamada DoDragDrop() cuando el usuario inicia una operación de arrastre, por ejemplo, al manejar una señal MouseDown. Eso es lo que tengo, supongo que necesito saber exactamente qué tipo el objetivo espera aceptar la caída, y cómo serializar el atajo, pero no pude encontrar ninguna información sobre esa parte.

Quizás otra opción sería obtener la ubicación de la caída, y administrar eso desde mi aplicación, pero de nuevo estoy un poco despistado de cómo hacerlo.

La versión de framework actualmente es 3.5, y solo estoy considerando las plataformas de Windows.

Gracias de antemano por su ayuda!


actualización/Solución:

Utilizando el ShellLink code mencionado anteriormente para crear un archivo de acceso directo temporal, simplemente utiliza DataObject para el arrastrar y soltar, como en el siguiente ejemplo:

private void picShortcut_MouseDown(object sender, MouseEventArgs e) 
{ 
    ShellLink link = new ShellLink(); 

    // Creates the shortcut: 
    link.Target = txtTarget.Text; 
    link.Arguments = txtArguments.Text; 
    link.Description = txtDescription.Text; 
    link.IconPath = txtIconFile.Text; 
    link.IconIndex = (txtIconIndex.Text.Length > 0 ? 
     System.Int32.Parse(txtIconIndex.Text) : 0); 
    link.Save("tmp.lnk"); 

    // Starts the drag-and-drop operation: 
    DataObject shortcut = new DataObject(); 
    StringCollection files = new StringCollection(); 
    files.Add(Path.GetFullPath("tmp.lnk")); 
    shortcut.SetFileDropList(files); 
    picShortcut.DoDragDrop(shortcut, DragDropEffects.Copy); 
} 

Bastante complicado si considera el código de PInvoke (no se muestra aquí), y aún necesito crear este archivo temporal con el nombre de destino. Si alguien sabe un ... erm, atajo, ¡es bienvenido! Tal vez al portar el código para el cual John Knoeller dio un enlace (¡gracias!).

Respuesta

4

Raymond Chen hizo todo un artículo sobre este mismo tema en su blog echa un vistazo a dragging a virtual file

+0

Artículo interesante. Menciona la interfaz IDataObject, después de buscar un poco por mi cuenta, encontré una forma de arrastrar y soltar el atajo desde un archivo temporal, que tengo que crear de todos modos. – RedGlyph

1

Respondí una pregunta similar a esta en un hilo anterior. Este podría ser un punto de partida para ti.

Drag and Drop link

+0

Gracias, pero no tendría que ser la de manejar la parte de caída y crear un acceso directo a partir de ahí? Estoy buscando la otra parte. El tipo 'IWshShortcut' no es aceptado por el Explorer, parece, así que ni siquiera puedo guardar mi atajo con un nombre temporal y pasarlo al método' DoDragDrop() ', pero ¿me está perdiendo algo? – RedGlyph