我正在做一个Drag Drop到外部应用程序,如下所示:
string[] files = new string[/* */]; // get files DataObject o = new DataObject(DataFormats.FileDrop,files); DoDragDrop(o,DragDropEffects.Copy | DragDropEffects.Move);
一些应用程序将采取文件并继续处理它们,我的应用程序是免费的,但一些应用程序将使我的应用程序冻结,直到它处理所有文件…有什么办法可以解决这个问题吗?我试图在一个线程中做到这一点但是效果不是很好 – 它根本不起作用…所以,任何建议如何使这个代码不挂我的应用程序?
解决方法
.NET Control.DoDragDrop只是一个叫做Win32 api的wapper ..(等待它)..
DoDragDrop
所以它有同样的局限性. DoDragDrop只能从调用OleInitialize的线程调用,这使得线程成为STA(单线程单元)类型线程.
因为它只能由STA线程使用,并且API设计是同步的,所以您可以使用目标应用程序处理丢弃通知.这只是OLE拖放设计的一部分,无法更改. (OLE拖放实际上是在Windows 3x天内设计的,在Windows应用程序中甚至存在线程之前).
所以,你可以让这个工作在另一个线程IFF上,该线程是一个STA线程.您可能还必须使用interop来调用非托管的DoDragDrop函数.