2009-12-20 12 views
5

J'ai une application C# qui crée des raccourcis pour lancer d'autres programmes avec des arguments spécifiques et des répertoires initiaux. Je voudrais que l'utilisateur soit capable de faire glisser un raccourci du formulaire Windows et le laisser tomber n'importe où pertinent comme le bureau, le menu de démarrage, et ainsi de suite mais je ne sais pas vraiment comment manipuler cela, pourrait-on me signaler dans le bonne direction?Glisser-déposer d'un raccourci créé dynamiquement

J'ai vu quelques échantillons en utilisant PInvoke et IShellLink comme this one, ou lire les réponses sur le SO comme here, qui aident déjà créer des raccourcis et de les enregistrer dans un fichier .lnk. Je suppose que je dois remettre des données dans un appel DoDragDrop() lorsque l'utilisateur initie une opération glisser, par exemple en traitant un signal MouseDown. C'est aussi loin que j'ai eu, je suppose que j'ai besoin de savoir exactement quel type la cible s'attend à accepter la baisse, et comment sérialiser le raccourci, mais n'a pas pu trouver d'informations sur cette partie.

Peut-être une autre option serait d'obtenir l'emplacement de la baisse, et gérer cela à partir de mon application, mais là encore, je suis un peu paumé comment faire cela.

La version du framework est actuellement 3.5, et je ne considère que les plateformes Windows.

Merci d'avance pour votre aide!


Mise à jour/Solution:

Utilisation du ShellLink code mentionné ci-dessus pour créer un fichier de raccourci temporaire, je simplement utilisé DataObject pour le glisser-déposer, comme dans l'exemple suivant:

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); 
} 

Assez compliqué si vous considérez le code PInvoke (non montré ici), et j'ai encore besoin de créer ce fichier temporaire avec le nom de la cible. Si quelqu'un connaît un ... raccourci, c'est bon! Peut-être en portant le code pour lequel John Knoeller a donné un lien (merci!).

Répondre

4

Raymond Chen a fait tout un article sur ce même sujet sur son blog consulter dragging a virtual file

+0

Article intéressant. Il mentionne l'interface IDataObject, après avoir cherché un peu moi-même, j'ai trouvé un moyen de faire glisser et déposer le raccourci à partir d'un fichier temporaire, que je dois créer quand même. – RedGlyph

1

J'ai répondu à une question en quelque sorte similaire à ceci sur un fil précédent. Cela pourrait être un point de départ pour vous.

Drag and Drop link

+0

Merci, mais ce ne serait pas à gérer la partie de goutte et de créer un raccourci à partir de là? Je cherche l'autre partie. Le type 'IWshShortcut' n'est pas accepté par l'Explorateur, semble-t-il, donc je ne peux même pas enregistrer mon raccourci sous un nom temporaire et le passer à la méthode' DoDragDrop() ', mais peut-être qu'il me manque quelque chose? – RedGlyph