Перетаскивание динамически созданного ярлыка - PullRequest
5 голосов
/ 20 декабря 2009

У меня есть приложение C #, которое создает ярлыки для запуска других программ с конкретными аргументами и начальными каталогами. Мне бы хотелось, чтобы пользователь мог перетаскивать ярлык из формы Windows и перетаскивать его в любое место, например на рабочий стол, в меню «Пуск» и т. Д., Но я не знаю, как с этим справиться, кто-нибудь может указать мне на правильное направление?

Я видел несколько примеров, использующих PInvoke и IShellLink вроде этого , или читал ответы на SO, например здесь , которые уже помогают создавать ярлыки и сохранять их в файле .lnk. Я предполагаю, что должен передать данные в вызове DoDragDrop(), когда пользователь запускает операцию перетаскивания, например, обрабатывая сигнал MouseDown. Насколько я понял, я полагаю, что мне нужно точно знать, какой тип целевой объект ожидает, чтобы отбросить, и как сериализовать ярлык, но не смог найти никакой информации по этой части.

Возможно, другим вариантом было бы получить местоположение капли и управлять этим из моего приложения, но здесь я снова немного не понимаю, как это сделать.

Версия фреймворка в настоящее время 3.5, и я рассматриваю только платформы Windows.

Заранее спасибо за помощь!


Update / Решение:

Используя код ShellLink , упомянутый выше, для создания временного файла ярлыка, я просто использовал DataObject для перетаскивания, как в следующем примере:

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

Довольно сложно, если учесть код PInvoke (здесь не показан), и мне все еще нужно создать этот временный файл с целевым именем. Если кто-нибудь знает ... ярлык, это приветствуется! Возможно, путем переноса кода, на который Джон Кноеллер дал ссылку (спасибо!).

Ответы [ 2 ]

4 голосов
/ 21 декабря 2009

Раймонд Чен сделал целую статью на эту тему в своем блоге, прочитал перетаскивание виртуального файла

1 голос
/ 20 декабря 2009

Я ответил на вопрос, похожий на этот в предыдущей теме. Это может быть отправной точкой для вас.

Ссылка для перетаскивания

...