【发布时间】:2019-12-01 01:01:13
【问题描述】:
是否可以将 Windows 桌面图标拖到表单列表视图上。似乎不允许将桌面图标拖动到桌面以外的任何地方。将图标拖到 listView 上时,不会触发 listView 的拖放或鼠标事件。
我正在尝试从快捷方式本身确定适当链接文件的路径。我想我可以从桌面的 .lnk 文件中获取链接文件信息并使用它,但似乎我能做到这一点的唯一方法是让用户进行复制/粘贴而不是拖放。
编辑: 需要明确的是 - 在启用“AllowDrop = true”的控件上拖动 Windows 快捷方式时,不会触发相关的拖放事件。我已经知道如何从链接文件中获取我需要的数据了。
以管理员身份运行: 下面的答案被认为是正确的,因为正如发帖人在他的 cmets 中所说并在其他地方提到的那样,如果运行“以管理员身份”,拖放将无法在 这种 场景中工作。
【问题讨论】:
-
启用
AllowDrop和ListView_DragEnter,if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;。然后处理ListView_DragDrop中的文件放置。 Shell 链接属性中引用了图标的路径。如果可以是可执行文件中包含的文件或图标索引。可执行文件可以是与目标文件不同的文件。比如打开文件的程序或者shell32.dll中的图标等。 -
获得链接后(
string link = e.Data.GetData(DataFormats.FileDrop).First();,您可以获得更多信息,例如so -
@TaW 该问题中显示的方法很可能不起作用。也许这个问题:How to use Shell32 within a C# application?,提到了问题。此外,图标可以从关联程序(打开文件的程序)派生,因此您必须使用
AssocQueryString来获取关联应用程序的可执行文件并从那里获取图标。它也可以是指向ItemIdList的指针。 -
他们在这里工作得很好。另外:我认为他不关心图标。他只想将链接放到列表视图上,然后查看链接后面的程序或文件或文件夹。您的提示和链接的帖子在这里工作得很好(w10、64bit、VS2017)..
-
@TaW 是的,我匆匆回答了这个问题,
icon卡住了。可能只需要文件名——哪个帖子?使用ShellLinkObject的那个或使用Type.GetTypeFromProgID("Shell.Application");的那个(我实际上直接使用Shell 接口,而不是Shell32引用,这会带来Microsoft Shell Controls and Automation。有很多帖子说明前者不起作用Windows 8+)。
标签: c# winforms drag-and-drop