2020/03/24(Tue) 14:05:12 編集(投稿者)
■No94187 (Tom さん) に返信
こんなクラスを作って
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Windows.Forms;
[ComVisible(true)]
class AsyncDataObject : DataObject, IDataObjectAsyncCapability
{
bool _InOperation = false;
bool _AsyncMode = true;
public void SetAsyncMode([MarshalAs(UnmanagedType.Bool)] bool fDoOpAsync) {
_AsyncMode = fDoOpAsync;
}
[return: MarshalAs(UnmanagedType.Bool)]
public bool GetAsyncMode() {
return _AsyncMode;
}
public void StartOperation(IBindCtx pbcReserved) {
_InOperation = true;
}
[return: MarshalAs(UnmanagedType.Bool)]
public bool InOperation() {
return _InOperation;
}
public void EndOperation(int hResult, IBindCtx pbcReserved, [MarshalAs(UnmanagedType.U4)] uint dwEffects) {
_InOperation = false;
}
}
このように使います。
using System;
using System.Windows.Forms;
static class Program
{
[STAThread]
static void Main() {
var f = new Form();
f.MouseDown += F_MouseDown;
Application.Run(f);
}
private static void F_MouseDown(object sender, MouseEventArgs e) {
var data = new AsyncDataObject();
var filePaths = new System.Collections.Specialized.StringCollection();
filePaths.Add(@"E:\work\bigdata.txt");
data.SetFileDropList(filePaths);
((Form)sender).DoDragDrop(data, DragDropEffects.All);
}
}
C++/CLI のサンプル(https://gist.github.com/egtra/7a3ca22888b970a364f1)は
ファイル実体がない場合に、保存するファイルの内容を MemoryStream に格納して渡す方法です。
この場合、DoDragDrop メソッドが終了しても転送(コピーもしくは移動)は続くので MemoryStream を破棄してはいけません。
転送が完了したら EndOperation が呼ばれるので、その時に破棄すると良いでしょう。