Top / JUNK / IDataObjectAsyncCapability

プログラムからエクスプローラにファイルをドロップすると転送(コピーまたは移動)している間、待機してしまいます。
DataObject を継承して以下のインターフェイスを実装すると転送が開始したときに DoDragDrop メソッドが終了し、次の処理を行うことが出来ます。

using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;

[ComImport()]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("3D8B0590-F691-11d2-8EA9-006097DF5BD4")]
public interface IDataObjectAsyncCapability
{
    void SetAsyncMode([MarshalAs(UnmanagedType.Bool)] bool fDoOpAsync);

    [return: MarshalAs(UnmanagedType.Bool)]
    bool GetAsyncMode();

    void StartOperation(IBindCtx pbcReserved);

    [return: MarshalAs(UnmanagedType.Bool)]
    bool InOperation();

    void EndOperation(int hResult, IBindCtx pbcReserved, [MarshalAs(UnmanagedType.U4)] uint dwEffects);
}

実装例

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);
    }
}



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2020-03-27 (金) 17:15:51 (8d)