c# - 用户将文件拖到我的 winforms 可执行文件上。我要创建一些事件监听器吗?
问题描述
我正在阅读来自此链接的 Stack Overflow 文章:Open File Associated Application,我遇到了另一个问题,即我的 Windows 窗体应用程序打开了,但我看不到内容。我应该在我的应用程序中做些什么来确保它能够处理从 Windows 资源管理器打开文件?用户会将文件拖到我的 winforms exe 上。
在 WinForms 应用程序中,您需要从Environment.GetCommandLineArgs
方法中获取命令行参数。但是,调用此方法与控制台应用程序有一个重要区别:数组中的第一个元素包含正在执行的程序的文件名。如果文件名不可用,则第一个元素等于 String..::.Empty。其余元素包含在命令行中输入的任何附加标记。我找到了这段代码来存储参数,但我不知道在我的应用程序中实际实现什么事件。在 MSDN 线程上找到以下内容。
[STAThread]
static void Main()
{
string[] args = Environment.GetCommandLineArgs();
if (args.Length > 1)
{
string filePath = args[1]; //First arg is the running process
if (File.Exists(filePath))
{
string name = Path.GetFileNameWithoutExtension(filePath);
File.Copy(filePath, name + ".dat");
//todo - delete input
}
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
解决方案
用户会将文件拖到我的 winforms exe 上。
您需要在目标控件中执行拖放操作。假设它是Form1
.
首先,启用AllowDrop
属性:
Form1.AllowDrop = true;
处理DragEnter
事件以验证操作:
private void Form1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
var file = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
if (File.Exists(file))
{
e.Effect = DragDropEffects.Move;
return;
}
//If you need to allow certain type of files:
//if (Path.GetExtension(file).Equals(".srcExt", StringComparison.OrdinalIgnoreCase))
//{
// e.Effect = DragDropEffects.Move;
// return;
//}
}
e.Effect = DragDropEffects.None;
}
然后,处理DragDrop
事件:
private void Form1_DragDrop(object sender, DragEventArgs e)
{
if (e.Effect == DragDropEffects.Move)
{
//according to your snippet:
var srcFile = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
//Another check is good, just in case:
if (File.Exists(srcFile))
{
var destDir = @"The destination Directory";
var destFile = string.Concat(
Path.Combine(
destDir,
Path.GetFileNameWithoutExtension(srcFile)
),
".dat"
);
File.Move(srcFile, destFile);
}
}
}
至于这Main
部分,我相信@Jimi 在他的评论中已经完美地涵盖了这一点,所以让我们从他那里偷一些来完成这篇文章:
[STAThread]
static void Main(string[] args)
{
if(args.Length > 0 && File.Exists(args[0]))
{
var srcFile = args[0];
var destDir = @"The destination Directory";
var destFile = string.Concat(
Path.Combine(
destDir,
Path.GetFileNameWithoutExtension(srcFile)
),
".dat"
);
File.Move(srcFile, destFile);
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
祝你好运。
推荐阅读
- java - 将我的 android 应用中的用户链接到亚马逊应用商店中的搜索查询
- java - Spark:如何删除数据集中具有不同值的行
- performance - Google Lighthouse 如何计算预加载的潜在节省
- bash - 如何在詹金斯管道中转义双引号
- coq - 隐式参数传播
- ansible - Ansible playbook 获取 mysql 版本,否则设置默认值
- github - github支持是否引用目标文件中的书签?
- angular - NGRX createSelector 对象在使用过滤器创建特殊选择器时获得中间线(更新至 NGRX 2021)
- amazon-web-services - 如何从一个 aws 帐户导出 iam 配置并导入到其他 aws 帐户
- c++ - 使用 system() 调用需要用户输入的可执行应用程序时出现问题