gpt4 book ai didi

c# - DoDragDrop 有时会卡住 WinForms 应用程序

转载 作者:太空狗 更新时间:2023-10-29 20:35:32 25 4
gpt4 key购买 nike

我正在像这样拖放外部应用程序:

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

// get files

DataObject o = new DataObject(DataFormats.FileDrop, files);
DoDragDrop(o, DragDropEffects.Copy | DragDropEffects.Move);

一些应用程序将获取文件并继续处理它们,我的应用程序可以自由地做这些事情,但一些应用程序会使我的应用程序卡住,直到它处理所有文件......我有什么办法可以去在那附近?我曾尝试在线程中执行此操作,但效果不佳 - 它根本不起作用......那么,关于如何使此代码不挂起我的应用程序的任何建议?

最佳答案

.NET Control.DoDragDrop 只是一个围绕 Win32 api 的包装器,称为..(等待它).. DoDragDrop

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

因为它只能由一个 STA 线程使用,并且 API 设计是同步的,所以您受制于目标应用程序对丢弃通知的处理。这只是 OLE 拖放设计的一部分,无法更改。 (OLE 拖放实际上是在 Windows 3x 时代设计的,甚至在 Windows 应用程序中还没有线程之前)。

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

关于c# - DoDragDrop 有时会卡住 WinForms 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2155541/

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