MVV
|
Posted: Thu Oct 28, 2010 14:27 Post subject: Drag-n-Drop ИЗ окна, работающего в другом потоке |
|
|
Жил я себе, не тужил, пока не возникла необходимость реализовать тривиальное перетаскивание файлов из моего окна в любое другое. Но каков был шок, когда я понял, что кроме как через дебри OLE это реализовать невозможно. И что надо нагородить не один огород, чтобы реализовать такую мелочь. И началось...
Когда моё окно работает в основном потоке, и в нем же была вызвана OleInitialize, все нормально - с этой частью задачи я вроде разобрался.
Но теперь мне нужно сделать, чтобы то же самое работало, если я перетаскиваю файлы из окна, которое создано в другом потоке. Если конкретно, мой плагин создает поток, в нем - окно, в котором есть SysListView32, и из него мне надо суметь сделать перетаскивание файлов в другие окна.
Насколько я успел понять, Microsoft вплоть до Windows 7 не удосужилась сделать OLE-подсистему многопоточной, поэтому работать с COM-объектами можно только в одном-единственном потоке приложения. И, разумеется, это не мой поток, так как тотал сам по себе тоже умеет перетаскивать файлы.
Я пробовал при перетаскивании посылать окну тотала сообщение, в хуке которого (хук создается из основного потока) формировать структуру DROPFILES, создавать IDataObject и инициировать перетаскивание, вызывая [SH]DoDragDrop, но ничего не получается - оба окна (мое и тотала) на вид подвисают, потом при наведении мыши на окно тотала оно отвисает, и функция [SH]DoDragDrop говорит, что "Объект успешно передан приложению". И никакого перетаскивания не возникает и в помине... При тупом сабклассинге окна (при переопределении оконной процедуры через SetWindowLong[Ptr]) эффект тот же. При умном, наверное, был бы таким же, но попытка сабклассить по-умному (через SetWindowSubclass) вообще рушит тотал.
Поделился бы кто идейкой - было бы весьма кстати. _________________ TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel… |
|