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!).
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