Принудительное удаление как ярлык объекта при перетаскивании из приложения .NET в Windows Explorer - PullRequest
1 голос
/ 14 февраля 2011

Я пишу .NET-приложение, которое представляет вид дерева / списка объектов так же, как Windows Explorer. Это текстовые элементы, которые пользователь может рассматривать как файлы, и я хочу, чтобы пользователь мог создавать для них ярлыки, аналогичные тому, как они будут создавать ярлыки для любого файла. За исключением этого случая ярлык был бы для моего приложения с определенной командной строкой, а не для файлового объекта. Поэтому мне нужно поддерживать перетаскивание в Internet Explorer таким образом, чтобы значок перетаскивания выглядел как значок Alt-drag (создать ярлык), а операция перетаскивания создает ярлык для моего приложения с настраиваемой командной строкой.

Мой вопрос: какую информацию мне нужно предоставить Windows в начале операции перетаскивания, чтобы проводник Windows отображал правильный значок и всегда создавал ярлык в событии перетаскивания?

1 Ответ

2 голосов
/ 19 февраля 2011

Самый простой способ сделать это - 1) создать ярлык и 2) перетащить его. Я не делаю много управляемого кода вообще, поэтому я не могу сказать, есть ли какая-либо встроенная поддержка для объекта IShellLink. Если нет, то кто-то, вероятно, уже сделал работу и создал оболочку. Таким образом, вы можете создать объект ShellLink и заполнить его указанием пути к вашему приложению, параметрами и т. Д. И сохранить его где-нибудь (возможно, во временной папке). Тогда вы бы инициировали операцию перетаскивания примерно так:

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
    {
        // left mouse button clicked; begin drag
        // create data object with FileDrop format (list of files to be dropped)
        DataObject data = new DataObject();
        System.Collections.Specialized.StringCollection paths = new System.Collections.Specialized.StringCollection();
        paths.Add(@"<temp_path>\My New Shortcut.lnk");
        data.SetFileDropList(paths);
        // begin the drag, indicating it is a copy operation
        DragDropEffects effect = DoDragDrop(data, DragDropEffects.Copy);
    }
}

Затем, когда пользователь удалит его (например, на своем рабочем столе), он скопирует файл ярлыка из временной папки.

...