C# 将Windows桌面快捷方式拖放到listView

C# 将Windows桌面快捷方式拖放到listView,c#,winforms,drag-and-drop,C#,Winforms,Drag And Drop,是否可以将Windows桌面图标拖到窗体列表视图上。将桌面图标拖动到桌面以外的任何位置似乎都是不允许的。在listView上拖动图标时,不会触发listView的拖放或鼠标事件 我试图从快捷方式本身确定正确链接文件的路径。我想我可以从桌面的.lnk文件中获取链接文件信息并使用它,但似乎我唯一能做到这一点的方法是让用户进行复制/粘贴,而不是拖放 编辑: 要清楚-在启用“AllowDrop=true”的控件上拖动Windows快捷方式时,不会触发关联的拖放事件。我已经知道如何从链接文件中获取所需的数

是否可以将Windows桌面图标拖到窗体列表视图上。将桌面图标拖动到桌面以外的任何位置似乎都是不允许的。在listView上拖动图标时,不会触发listView的拖放或鼠标事件

我试图从快捷方式本身确定正确链接文件的路径。我想我可以从桌面的.lnk文件中获取链接文件信息并使用它,但似乎我唯一能做到这一点的方法是让用户进行复制/粘贴,而不是拖放

编辑: 要清楚-在启用“AllowDrop=true”的控件上拖动Windows快捷方式时,不会触发关联的拖放事件。我已经知道如何从链接文件中获取所需的数据

以管理员身份运行:
下面的答案被认为是正确的,因为正如海报在其评论和其他地方所述,如果以“管理员”身份运行,则拖放在场景中不起作用。

OP以管理员模式运行Visual Studio,因此正在运行的程序也以管理员模式运行。根据这一点,由于桌面和应用程序以不同的权限级别运行,您应该不能在桌面和应用程序之间拖放

我不知道为什么OP能够从我认为是正常的Windows文件资源管理器中放入文件,因为从技术上讲,它应该会遇到同样的问题


为简单起见,我只使用了一个空表单,属性
AllowDrop
等于
true
,事件
DragDrop
链接到方法
DnDExample\u DragDrop
DragOver
链接到方法
DnDExample\u DragOver
。我还通过在项目上单击鼠标右键,单击“添加引用”,转到“COM”选项卡,在其中找到引用,然后导入它,将
Windows脚本宿主对象模型导入到项目中

关于设置已经够了


一个简单的方法是使用DragOver并在列表中删除事件。为了简单起见,我只使用了一个表单

在“拖到”对话框中,您希望检查要拖到要拖放的区域的文件的文件类型。如果所有文件都是正确的类型,即快捷方式类型,则您希望允许拖放

在下降时,你可以处理你想要发生的事情的逻辑。对于我的示例,我只是打印出快捷方式文件路径及其目标

using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using IWshRuntimeLibrary;

namespace DragAndDropShortcut
{
    public partial class DnDExample : Form
    {
        private readonly WshShell shell = new WshShell();
        public DnDExample()
        {
            InitializeComponent();
        }

        private void DnDExample_DragOver(object sender, DragEventArgs e)
        {
            // This checks that each file being dragged over is a .lnk file.
            // If it is not, it will show the invalid cursor thanks to some
            // e.Effect being set to none by default.
            bool dropEnabled = true;
            if (e.Data.GetDataPresent(DataFormats.FileDrop, true))
            {
                if (e.Data.GetDataPresent(DataFormats.FileDrop, true) &&
                    e.Data.GetData(DataFormats.FileDrop, true) is string[] filePaths &&
                    filePaths.Any(filePath => Path.GetExtension(filePath)?.ToLowerInvariant() != ".lnk"))
                {
                    dropEnabled = false;
                }
            }
            else
            {
                dropEnabled = false;
            }

            if (dropEnabled)
            {
                // Set the effect to copy so we can drop the item
                e.Effect = DragDropEffects.Copy;
            }
        }

        private void DnDExample_DragDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop) &&
                e.Data.GetData(DataFormats.FileDrop, true) is string[] filePaths)
            {
                // Print out the path and target of each shortcut file dropped on
                foreach (string filePath in filePaths)
                {
                    IWshShortcut link = (IWshShortcut)shell.CreateShortcut(filePath); //Link the interface to our shortcut
                    Console.WriteLine(filePath);
                    Console.WriteLine(link.TargetPath); //Show the target in a MessageBox using IWshShortcut
                    Console.WriteLine();
                }
            }
        }
    }
}

启用
AllowDrop
,并在
ListView\u DragEnter
中启用
if(e.Data.GetDataPresent(DataFormats.FileDrop))e.Effect=DragDropEffects.Copy。然后在
ListView\u DragDrop
中处理文件放置。图标的路径在Shell链接属性中引用。If可以是包含在可执行文件中的文件或图标索引。可执行文件可以是与目标文件不同的文件。例如,它可能是在获得链接(
string link=e.Data.GetData(dataforms.FileDrop).First()后打开文件的程序或shell32.dll中的图标等)
您可以获得更多信息,如@TaW。该问题中显示的方法很可能不起作用。可能是这个问题:,问题已经提到。此外,图标可以从相关程序(打开文件的程序)派生而来,因此您必须使用
AssocQueryString
来获取相关应用程序的可执行文件并从中获取图标。它也可以是指向
itemiList
的指针。它们在这里工作得很好。另外:我认为他不在乎图标。他只想在列表视图上放置一个链接,并查看链接后面的程序或文件或文件夹。您的hints和链接的帖子在这里工作得很好(w10,64位,VS2017)@TaW是的,我匆匆忙忙地回答了这个问题,
图标
被卡住了。可能只需要文件名——哪篇帖子?是播放
ShellLinkObject的帖子
还是使用
Type.GetTypeFromProgID(“Shell.Application”);
(实际上,我直接使用Shell界面,而不是
Shell32
参考,这会带来
Microsoft Shell控件和自动化
。有很多帖子说前者在Windows 8+上不起作用。)。我创建了一个项目并复制/粘贴了您的代码。运行时,在窗体上拖动Windows快捷方式时,甚至不会触发事件。该事件是在将文件拖动到窗体上时触发的。@David这很奇怪。虽然我想这不会影响它,但您正在运行的Windows版本是什么?@David同样,当事件是用普通的文件,它是显示无效光标还是允许您删除它?从下载解决方案。我尝试了两个Win10版本,结果都是一样的。@David奇怪的是,在下载并运行后,没有更改任何内容,对我来说,工作正常,这使我调试有点困难。很抱歉。快速例如,如果打开“文件资源管理器”,导航到“桌面”文件夹,然后在窗口上拖动其中一个快捷方式,它是否按预期工作?