2009-12-20 8 views
5

Ich habe eine C# -Anwendung, die Verknüpfungen erstellt, um andere Programme mit bestimmten Argumenten und ersten Verzeichnissen zu starten. Ich möchte, dass der Benutzer in der Lage ist, eine Verknüpfung aus dem Windows - Formular zu ziehen und sie an einer beliebigen Stelle wie dem Desktop, dem Startmenü usw. abzusetzen, aber ich weiß wirklich nicht, wie ich damit umgehen soll richtige Richtung?Drag & Drop einer dynamisch erstellten Verknüpfung

Ich habe ein paar Proben unter Verwendung von PInvoke und IShellLink wie this one, oder lesen Sie Antworten wie here auf SO, gesehen, die Verknüpfungen erstellen helfen bereits, und speichern sie in einer .lnk-Datei. Ich nehme an, dass ich Daten in einem DoDragDrop() Anruf übergeben muss, wenn der Benutzer eine Ziehoperation initiiert, z. B. durch Behandeln eines MouseDown-Signals. Soweit ich weiß, muss ich genau wissen, welchen Typ das Ziel erwartet, um den Sprung zu akzeptieren, und wie man die Verknüpfung serialisiert, konnte aber keine Informationen zu diesem Teil finden.

Vielleicht wäre eine andere Option, um den Ort des Abfalls zu bekommen, und das von meiner Anwendung zu verwalten, aber da bin ich wieder ein bisschen ratlos, wie man das macht.

Die Framework-Version ist derzeit 3,5, und ich denke nur an Windows-Plattformen.

Vielen Dank im Voraus für Ihre Hilfe!


Update/Lösung:

die ShellLink code oben erwähnten Verwendung einer temporären Verknüpfungsdatei zu erstellen, habe ich einfach DataObject für die Drag & Drop, wie im folgenden Beispiel verwendet:

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

Ziemlich kompliziert, wenn Sie den PInvoke-Code betrachten (hier nicht gezeigt), und ich muss diese temporäre Datei immer noch mit dem Zielnamen erstellen. Wenn jemand eine ... äh, Abkürzung kennt, ist es willkommen! Vielleicht durch die Portierung des Codes, für den John Knoeller einen Link gab (Danke!).

Antwort

4

Raymond Chen hat ein ganzer Artikel zu diesem Thema sehr auf seinem Blog dragging a virtual file Besuche

+0

Interessanter Artikel. Es erwähnt die IDataObject-Schnittstelle, nachdem ich ein wenig selbstständig gesucht habe, fand ich eine Möglichkeit, die Verknüpfung aus einer temporären Datei, die ich sowieso erstellen muss, zu ziehen und abzulegen. – RedGlyph

1

Ich beantwortete eine Frage ähnlich wie in einem früheren Thread. Dies könnte ein Ausgangspunkt für Sie sein.

Drag and Drop link

+0

Danke, aber würde das nicht sein, den Fallteil zu handhaben und eine Verknüpfung von dort erstellen? Ich suche den anderen Teil. Der 'IWshShortcut' Typ wird vom Explorer anscheinend nicht akzeptiert, so dass ich meine Verknüpfung nicht einmal unter einem temporären Namen speichern und an die' DoDragDrop() 'Methode übergeben kann, aber vielleicht fehlt mir etwas? – RedGlyph