c# 如何在 DragDrop 事件中检测和处理 .URL 文件类型
c# How to detect and process a .URL file type on DragDrop event
我做了很多研究,但到目前为止还没有结果...
我找到的唯一与我的情况有些相似的链接甚至都不起作用:
- Simple drag and drop example
- How can I tell a shortcut from a file in a C# drag and drop operation?
- Drag and Drop Files with C#
- drag and drop file into textbox
- e.Data.GetDataPresent not working in WinForms drag-and-drop handler?
基本上,首先,我希望代码能够识别该文件是“.url" 扩展名,或者更确切地说,一种互联网快捷方式,最常被 Google Chrome 以及 Mozilla Firefox 使用,而且很可能是我没有广泛测试的所有其他网络浏览器。
如果您不知道我指的是什么类型的快捷方式,我指的是下图中的快捷方式。
下面是我在文本框的 DragDrop 事件处理程序中使用的当前代码,它似乎不起作用:
string file = (string)(e.Data.GetData(DataFormats.FileDrop, false));
if (Path.GetExtension(file) == ".url")
{
//Do Stuff Here
}
显然,代码甚至无法获取快捷方式的假定文件名。这个快捷方式是已经从浏览器拖放到桌面的那种。因此,在这种情况下,该快捷方式是被拖放以供代码处理的快捷方式。
(不确定这是否会有所不同,但我尝试将“DataFormats.FileDrop”替换为“DataFormats.Serialization”以及“DataFormats.Html”,没有正效应。)
此外,由于某些奇怪的原因,程序在上面代码块的第一行立即中断。 (它也恰好是我的 DragDrop 事件中的第一行)
我的问题是:如何更正或修改代码(在任何程度上,即使完全更改代码),使其能够识别[的互联网快捷方式文件=49=].url 扩展名,然后继续将其视为普通文件。
还有,为什么第一行之后的代码已经设置了断点(如完全跳过 if 语句)?
如果不是太多,如何只让下面一行:
e.Effect = DragDropEffects.Link;
在 DragEnter 事件处理程序中,当文件仅为 Internet 快捷方式类型“.url”时有效,或者这是不可能的?
我知道Notepad++可以打开和读取内容,甚至可以编辑互联网快捷方式文件。虽然如果我能获得识别快捷方式的代码,我想我将能够像普通文件一样从中读取它。
如果可能的话,我更希望有工作代码的答案。很抱歉这个问题很长,因为我想尽可能准确地回答我的问题。
更新: 解释了为什么您的代码行为异常。
你可以使用下面的代码,我已经测试过了;项目的行为与您描述的一样。
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);
{
if (Path.GetExtension(file[0]) == ".url")
{
//Do Stuff Here
//
}
}
}
private void textBox1_DragEnter(object sender, DragEventArgs e)
{
string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);
if (Path.GetExtension(file[0]) == ".url")
{
e.Effect = DragDropEffects.Link;
//Do Stuff Here
}
}
第二个问题旁注:可能抛出异常,使用try catch验证。
首先,DataFormats.FileDrop
returns一个字符串数组而不是一个简单的字符串(因为可以同时拖动多个文件):
string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop));
if (files != null && files.Length > 0 && Path.GetExtension(files[0]) == ".url")
{
//Do Stuff Here
}
以及效果:拖动时会影响光标图标。您应该将其设置为 DragEnter/Over 并检查 DragDrop。如果您将其设置为 None,则无法删除该项目。
private void textBox1_DragEnter(object sender, DragEventArgs e)
{
string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop));
if (files == null || files.Length == 0)
e.Effect = DragDropEffects.None;
else
e.Effect = Path.GetExtension(files[0]) == ".url"
? DragDropEffects.Link
: DragDropEffects.Copy;
}
我做了很多研究,但到目前为止还没有结果...
我找到的唯一与我的情况有些相似的链接甚至都不起作用:
- Simple drag and drop example
- How can I tell a shortcut from a file in a C# drag and drop operation?
- Drag and Drop Files with C#
- drag and drop file into textbox
- e.Data.GetDataPresent not working in WinForms drag-and-drop handler?
基本上,首先,我希望代码能够识别该文件是“.url" 扩展名,或者更确切地说,一种互联网快捷方式,最常被 Google Chrome 以及 Mozilla Firefox 使用,而且很可能是我没有广泛测试的所有其他网络浏览器。
如果您不知道我指的是什么类型的快捷方式,我指的是下图中的快捷方式。
下面是我在文本框的 DragDrop 事件处理程序中使用的当前代码,它似乎不起作用:
string file = (string)(e.Data.GetData(DataFormats.FileDrop, false));
if (Path.GetExtension(file) == ".url")
{
//Do Stuff Here
}
显然,代码甚至无法获取快捷方式的假定文件名。这个快捷方式是已经从浏览器拖放到桌面的那种。因此,在这种情况下,该快捷方式是被拖放以供代码处理的快捷方式。
(不确定这是否会有所不同,但我尝试将“DataFormats.FileDrop”替换为“DataFormats.Serialization”以及“DataFormats.Html”,没有正效应。)
此外,由于某些奇怪的原因,程序在上面代码块的第一行立即中断。 (它也恰好是我的 DragDrop 事件中的第一行)
我的问题是:如何更正或修改代码(在任何程度上,即使完全更改代码),使其能够识别[的互联网快捷方式文件=49=].url 扩展名,然后继续将其视为普通文件。
还有,为什么第一行之后的代码已经设置了断点(如完全跳过 if 语句)?
如果不是太多,如何只让下面一行:
e.Effect = DragDropEffects.Link;
在 DragEnter 事件处理程序中,当文件仅为 Internet 快捷方式类型“.url”时有效,或者这是不可能的?
我知道Notepad++可以打开和读取内容,甚至可以编辑互联网快捷方式文件。虽然如果我能获得识别快捷方式的代码,我想我将能够像普通文件一样从中读取它。
如果可能的话,我更希望有工作代码的答案。很抱歉这个问题很长,因为我想尽可能准确地回答我的问题。
更新:
你可以使用下面的代码,我已经测试过了;项目的行为与您描述的一样。
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);
{
if (Path.GetExtension(file[0]) == ".url")
{
//Do Stuff Here
//
}
}
}
private void textBox1_DragEnter(object sender, DragEventArgs e)
{
string[] file = (string[])e.Data.GetData(DataFormats.FileDrop);
if (Path.GetExtension(file[0]) == ".url")
{
e.Effect = DragDropEffects.Link;
//Do Stuff Here
}
}
第二个问题旁注:可能抛出异常,使用try catch验证。
首先,DataFormats.FileDrop
returns一个字符串数组而不是一个简单的字符串(因为可以同时拖动多个文件):
string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop));
if (files != null && files.Length > 0 && Path.GetExtension(files[0]) == ".url")
{
//Do Stuff Here
}
以及效果:拖动时会影响光标图标。您应该将其设置为 DragEnter/Over 并检查 DragDrop。如果您将其设置为 None,则无法删除该项目。
private void textBox1_DragEnter(object sender, DragEventArgs e)
{
string[] files = (string[])(e.Data.GetData(DataFormats.FileDrop));
if (files == null || files.Length == 0)
e.Effect = DragDropEffects.None;
else
e.Effect = Path.GetExtension(files[0]) == ".url"
? DragDropEffects.Link
: DragDropEffects.Copy;
}