DoDragDrop有时会冻结WinForms应用程序

arg*_*rgh 7 c# drag-and-drop freeze winforms

我正在做一个Drag Drop到外部应用程序,如下所示:

string[] files = new string[/* */];

// get files

DataObject o = new DataObject(DataFormats.FileDrop, files);
DoDragDrop(o, DragDropEffects.Copy | DragDropEffects.Move);
Run Code Online (Sandbox Code Playgroud)

一些应用程序将采取文件并继续处理它们,我的应用程序是免费的,但一些应用程序将使我的应用程序冻结,直到它处理所有文件...有什么办法可以解决这个问题吗?我试过在一个线程中做到这一点但是效果不是很好 - 它根本不起作用...所以,任何建议如何使这个代码不挂我的应用程序?

Joh*_*ler 5

.NET Control.DoDragDrop 只是一个围绕 Win32 api 的 wapper,称为..(等等).. DoDragDrop

所以它也有同样的局限性。DoDragDrop 只能从调用过 的线程中调用OleInitialize,这使得该线程成为 STA(单线程单元)类型线程。

由于它只能由 STA 线程使用,并且 API 设计是同步的,因此您将受到目标应用程序对删除通知的处理的影响。这只是 OLE 拖放设计的一部分,无法更改。(OLE 拖放实际上是在 Windows 3x 时代设计的,甚至在 Windows 应用程序中存在线程之前)。

因此,您也许可以在另一个线程上执行此操作,前提是该线程是 STA 线程。您可能还必须使用互操作来调用非托管DoDragDrop函数。