DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DragDrop処理中にエクスプローラーが応答しない

環境/言語:[OS : Windows 8 / 言語 : Visual Basic .NET / .NET Framework : 4]
分類:[.NET]

【解決したい問題】

初めて投稿いたします。
よろしくお願いします。

エクスプローラーから、フォーム上へのコントロールへドラッグ&ドロップを実行すると、そのエクスプローラーが固まってしまいます。

固まらず、処理中でもエクスプローラーを操作できる対処方法というのはあるのでしょうか?
※ドラッグ&ドロップ(DragDrop)での処理を終えると、対象のエクスプローラーは触れるようにはなります。

以上、よろしくお願いします。

サンプル:ListViewへファイルをドラッグ ListViewのAllowDropはTrueしています。

Private Sub ListView_DragEnter _
(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView_File.DragEnter
If e.Data.GetDataPresent(DataFormats.FileDrop) = True Then
e.Effect = DragDropEffects.Copy
End If
End Sub


Private Sub ListView_File_DragDrop _
(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles ListView_File.DragDrop
'処理実行 ファイルコピーなど
'処理内容関係なくエクスプローラーが固まる。 例:System.Threading.Thread.Sleepで待機
End SubListView
■No32751に返信(ドロップさんの記事)

DragDropでファイル名など最低限の情報を取得し
時間差でそのファイル名に対し処理をするなどどうでしょう?
shu様
早速のご返答ありがとうございます。

> 時間差でそのファイル名に対し処理をするなどどうでしょう?

とは、どういったフローになりますでしょうか?
どうもDragDropが終了しないと、エクスプローラーは操作できないように見えます。
DragDrop処理内で、別処理(非同期)で行っても変わらず状態でした。
■No32754に返信(ドロップさんの記事)
> どうもDragDropが終了しないと、エクスプローラーは操作できないように見えます。

Timer クラス、もしくは BackgroundWorker クラスを用いて、
非同期で処理してみて下さい。

DragDrop イベントは、それらのクラスに処理を「依頼」したら
ただちにイベントを抜けるようにします(Return 等で)。

実際の処理は、依頼を受けて実行された側で
非同期的に後追いで実行する形になります。
■No32754に返信(ドロップさんの記事)

Taskを使った例:

Imports System.Threading.Tasks

        Dim filename = CType(e.Data.GetData("FileNameW"), String())(0)
        Dim tsk As New task(Sub()
                                Me.BeginInvoke(
                                    Sub()
                    '--- 長い処理
                                        Threading.Thread.Sleep(10000)
                                        Label2.Text = filename
                                    End Sub)
                            End Sub)
        tsk.Start()
shu様
魔界の仮面弁士様

ご返答ありがとうございます。
おかげ様で光が見えました!

まだ、完全に実行していませんが、簡単なサンプルでは動作できました。

作成しているシステムでは、ファイルをドラッグ後、コピー処理を行っておりましてその進捗(プログレスバー)/処理を非同期で行っていました。
なので、非同期で実行している気になっていました。
shu様
魔界の仮面弁士様

ご教授頂いた手法で実装できました。
お忙しいなかありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板