C# 将Windows桌面快捷方式拖放到listView
是否可以将Windows桌面图标拖到窗体列表视图上。将桌面图标拖动到桌面以外的任何位置似乎都是不允许的。在listView上拖动图标时,不会触发listView的拖放或鼠标事件 我试图从快捷方式本身确定正确链接文件的路径。我想我可以从桌面的.lnk文件中获取链接文件信息并使用它,但似乎我唯一能做到这一点的方法是让用户进行复制/粘贴,而不是拖放 编辑: 要清楚-在启用“AllowDrop=true”的控件上拖动Windows快捷方式时,不会触发关联的拖放事件。我已经知道如何从链接文件中获取所需的数据 以管理员身份运行:C# 将Windows桌面快捷方式拖放到listView,c#,winforms,drag-and-drop,C#,Winforms,Drag And Drop,是否可以将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奇怪的是,在下载并运行后,没有更改任何内容,对我来说,工作正常,这使我调试有点困难。很抱歉。快速例如,如果打开“文件资源管理器”,导航到“桌面”文件夹,然后在窗口上拖动其中一个快捷方式,它是否按预期工作?