2009-12-20 12 views
5

Mam aplikację C#, która tworzy skróty do uruchamiania innych programów z określonymi argumentami i katalogami początkowymi. Chciałbym, aby użytkownik mógł przeciągnąć skrót z formularza Windows i upuścić go w dowolnym miejscu, tak jak na pulpicie, w menu startowym itd., Ale tak naprawdę nie wiem, jak sobie z tym poradzić, czy ktoś mógłby wskazać mi dobry kierunek?Przeciąganie i upuszczanie dynamicznie utworzonego skrótu

Widziałem kilka próbek za pomocą PInvoke i IShellLink jak this one lub czytać odpowiedzi na SO jak here, które już pomagają tworzyć skróty i zapisać je w pliku .Ink. Zakładam, że muszę przekazać dane w rozmowie DoDragDrop(), gdy użytkownik inicjuje operację przeciągania, na przykład przez obsługę sygnału MouseDown. Tak dalece jak to było, przypuszczam, że muszę dokładnie wiedzieć, jaki typ docelowy spodziewa się zaakceptować spadek i jak serializować skrót, ale nie mógł znaleźć żadnych informacji na ten temat.

Być może inną opcją byłoby uzyskanie lokalizacji kropli i zarządzanie nią z mojej aplikacji, ale znowu jestem trochę nieświadoma, jak to zrobić.

Wersja ramowa to obecnie 3,5, a ja tylko rozważam platformy Windows.

Z góry dziękuję za pomoc!


Aktualizacja/Rozwiązanie:

Używanie ShellLink code wspomniano powyżej, aby utworzyć tymczasowy plik skrótu, po prostu stosować DataObject dla przeciągnij i upuść, jak w poniższym przykładzie:

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

Dość skomplikowane, jeśli weźmiesz pod uwagę kod PInvoke (nie pokazano tutaj) i nadal muszę utworzyć ten tymczasowy plik z nazwą docelową. Jeśli ktoś zna ... ehm, skrót, to jest mile widziane! Być może przez przeniesienie kodu, dla którego John Knoeller dał link (dzięki!).

Odpowiedz

4

Raymond Chen zrobił cały artykuł na ten sam temat na swoim blogu sprawdzeniu dragging a virtual file

+0

Interesujący artykuł. Wymienia interfejs IDataObject, po samodzielnym przeszukaniu znalazłem sposób na przeciągnięcie i upuszczenie skrótu z pliku tymczasowego, który i tak muszę utworzyć. – RedGlyph

1

Odpowiedziałem na pytanie podobne do tego w poprzednim wątku. To może być dla ciebie punkt wyjścia.

Drag and Drop link

+0

Dzięki, ale nie byłoby to obsłużyć część drop i utworzyć skrót stamtąd? Szukam drugiej części. Typ "IWshShcutcut" nie jest akceptowany przez Explorer, wydaje się, więc nie mogę nawet zapisać skrótu pod nazwą tymczasową i przekazać go do metody 'DoDragDrop()', ale może czegoś brakuje? – RedGlyph

Powiązane problemy