我想知道是否有人知道是否有任何方法可以在没有阻塞的情况下从C ++ Win32应用程序中拖动OLE文件,直到拖动完成。
我目前正在使用DoDragDrop()来启动拖动操作,但在拖动操作完成之前,此函数不会返回。 这个问题是我的程序中的动画在拖动过程中停止。
我尝试从新线程启动此命令,但这不起作用,即使我在此线程中调用了OleInitialize()。
我发现与此相关的唯一事情就是异步进行数据操作(例如复制/移动文件/数据)。在我的应用程序中,拖放并不用于此类操作,因此它不是问题,主要问题是用户执行拖动时的阻塞。 编辑:为了更清楚这一点:DataObject上的IAsyncOperation不是这个问题的解决方案,因为它只会在数据被异步删除后才会发生操作。 我遇到的问题是从用户开始拖动到释放鼠标按钮的那一刻起的阻塞行为。
我想到了2种解决方案,但我希望有更简单或更好的方法来实现这一目标。
实现我自己的(非烯)拖放。这将是更多的工作要做,我实际上发现它是一个很好的功能,可以将文件从我的程序中拖动到其他程序。
创建/启动新流程并从那里开始拖动操作。由于在我的应用程序中从Windows资源管理器中拖动文件时没有问题,我认为这可能有效。 拖动应该立即开始,我不知道创建新进程是否需要花费任何明显的时间。
答案 0 :(得分:2)
如果您的IDataObject支持IAsyncOperation接口,则IDropTarget可以选择允许IDropTarget :: Drop()快速退出,然后异步执行实际传输。但是,IDropTarget不需要支持IAsyncOperation。
MSDN's documentation中描述了此行为。此外,DoDragDrop()将不会退出,直到用户释放鼠标以启动拖放,因此在用户拖动鼠标时,仍会阻止调用DoDragDrop()的线程。
答案 1 :(得分:2)
在单独的线程中运行动画。
答案 2 :(得分:1)
雷米的回答是正确的。 The Old New Thing还有一组关于实施IDataObject的博客文章。它没有进入IAsyncOperation,但它是一个开始。
答案 3 :(得分:0)
我遇到过这种情况。我会启动一个新线程并执行此操作。 CreateProcess确实需要时间,但可能不是很多。您可以提前创建线程或进程并进行同步,以便在调用DoDragDrop()之前阻塞,然后从主应用程序中解除阻塞。