2009-12-20 3 views
5

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

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

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

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

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


Update/Решение:

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

ответ

4

Raymond Chen сделал целую статью по этой самой теме в своем блоге проверить dragging a virtual file

+0

Интересная статья. Он упоминает интерфейс IDataObject, после самостоятельного поиска по нему я нашел способ перетащить ярлык из временного файла, который я должен создать в любом случае. – RedGlyph

1

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

Drag and Drop link

+0

Спасибо, но это не было бы обрабатывать падение часть и создать ярлык оттуда? Я ищу другую часть. Кажется, что тип 'IWshShortcut' не воспринимается проводником Explorer, поэтому я не могу даже сохранить свой ярлык под временным именем и передать его методу' DoDragDrop() ', но, может быть, я что-то упустил? – RedGlyph

Смежные вопросы