Перетаскивание динамически созданного ярлыка


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

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

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

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

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


Обновление / Решение:

Используя упомянутый выше код 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 код (не показан здесь), и мне все еще нужно создать этот временный файл с целевым именем. Если кто-нибудь знает А... ЭМ, короткий путь, добро пожаловать! Возможно, портировав код, на которыйJohn Knoeller дал ссылку (спасибо!).

2 5

2 ответа:

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

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

Перетащите ссылку