Я делаю перетаскивание во внешнее приложение следующим образом:
string[] files = new string[/* */];
// get files
DataObject o = new DataObject(DataFormats.FileDrop, files);
DoDragDrop(o, DragDropEffects.Copy | DragDropEffects.Move);
и некоторые приложения возьмут файлы и перейдут к их обработке, и мое приложение может делать это бесплатно, но некоторые приложения заставят мое приложение зависать, пока оно не обработает все файлы ... есть ли способ обойти это? Я пытался сделать это в потоке, но это не сработало - это вообще не сработало ... итак, какие-либо предложения, как сделать так, чтобы этот код не зависал в моем приложении?
Ответ 1 · рейтинг 3 · John Knoeller
.NET Control.DoDragDrop - это просто оболочка вокруг Win32 api под названием .. (подождите) .. DoDragDrop
Так что у него те же ограничения. DoDragDrop может быть вызван только из потока, который вызвал OleInitialize, что делает поток потоком типа STA (однопоточная квартира).
Поскольку он может использоваться только потоком STA, а разработка API является синхронной, вы зависите от обработки уведомлений об отбрасывании конечными приложениями. Это всего лишь часть дизайна OLE Drag and Drop, и его нельзя изменить. (OLE Drag and drop был фактически разработан в Windows 3x дней, до того, как потоки даже существовали в приложениях Windows).
Итак, вы могли бы возможно выполнить эту работу в другом потоке IFF, этот поток является потоком STA. Вам также, вероятно, придется использовать взаимодействие для вызова неуправляемой функции DoDragDrop.