gpt4 book ai didi

c# - 拖入另一个进程

转载 作者:太空狗 更新时间:2023-10-29 17:58:44 27 4
gpt4 key购买 nike

我正在尝试将一个项目拖出到资源管理器中。
该项目应该导致文件下载,所以我使用了我在网上找到的一个示例,使用 CustomDataObject 下载文件,当他实际需要流时调用一个事件,然后我的应用程序负责繁重的工作并执行下载。
它在类似的剪贴板操作中一直运行良好。

实际的文件下载也会导致我的应用程序中的一些 UI 发生变化。主要是在表单上更改的“工作”图标,以及在出现错误时弹出的气球。

在剪贴板操作中,我只是在需要时使用了 InvokeRequiredBeginInvoke,以确保这些 UI 更改发生在主线程上。在拖动操作中,UI 线程正在等待 DoDragDrop 的返回,而 CustomDataObject 引发的事件正在另一个线程上调用。当我尝试调用 BeginInvokeInvoke 时,UI 线程仍在等待,我无法完成放置。

是否有关于如何在访问源应用程序的 UI 时允许跨应用程序拖放的示例或推荐的最佳实践?

更新

here是原始的 CodeProject 文章,其中包含我为自己使用而修改的 DataObjectEx。我只是更改了 GetFileContents 方法来调用一个虚拟方法,该方法返回一个包含文件数据的 Stream,从类继承,并覆盖该虚拟方法以从网。当我想在获取文件的同时更改 UI 中的内容时,问题就出现了。正如我之前所说 - 主 UI 线程仍然“卡在”DoDragDrop 方法调用中,因此我无法按时调用它来执行工作线程在下载前后所需的 UI 更改文件。

最佳答案

如果这是一个标准的 WinForms 应用程序,那么您真正需要在您的应用程序中做的就是在您的表单中为 DragEnter 和 DragDrop 添加事件处理程序。

在 DragEnter 内部,您需要检查对象的类型以确保它是一个文件名:

private void MyForm_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
{
string[] files = e.Data.GetData(DataFormats.FileDrop) as string[];
if (files != null)
{
// Do additional checks here if needed, like check extensions
e.Effect = DragDropEffects.Copy;
return;
}
}

e.Effect = DragDropEffects.None;
}

然后在您的 DragDrop 处理程序中,我将简单地存储文件名,然后激活一个计时器。这允许 DragDrop 立即返回,以便其他应用程序(在您的示例中为 Windows 资源管理器)不会在您对文件进行任何处理时挂起,这可能需要一些时间。在 DragDrop 完成之前,拖动源不会返回

private void MyForm_DragDrop(object sender, DragEventArgs e)
{
string[] files = e.Data.GetData(DataFormats.FileDrop) as string[];
if (files != null)
{
_filesToProcess.Text = files[0]; // Assuming this is declared at the Form level

// Schedule a timer to fire in a few miliseconds as a simple asynchronous method
_DragDropTimer.Interval = 50;
_DragDropTimer.Enabled = true;
_DragDropTimer.Start();
Activate(); // Activates the form and gives it focus
}
}

关于c# - 拖入另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2036452/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com