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

ツリー一括表示

Nomalアイコン Windowsエクスプローラへのドロップ先フォルダの取得 /よっし〜 (22/03/07(Mon) 09:29) #35010
Nomalアイコン Re[1]: Windowsエクスプローラへのドロップ先フォルダの取得 /魔界の仮面弁士 (22/03/07(Mon) 15:41) #35012
  └Nomalアイコン Re[2]: Windowsエクスプローラへのドロップ先フォルダの取得 /よっし〜 (22/03/07(Mon) 16:11) #35014 解決み!
    └Nomalアイコン Re[3]: Windowsエクスプローラへのドロップ先フォルダの取得 /魔界の仮面弁士 (22/03/08(Tue) 12:50) #35015 解決み!
      └Nomalアイコン Re[4]: Windowsエクスプローラへのドロップ先フォルダの取得 /よっし〜 (22/03/08(Tue) 13:59) #35016 解決み!


親記事 / ▼[ 35012 ]
■35010 / 親階層)  Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ よっし〜 一般人(5回)-(2022/03/07(Mon) 09:29:38)
  • アイコン環境/言語:[VB2013] 
    分類:[.NET] 

    いつもお世話になっております。

    現在DOBON様の「エクスプローラへファイルをDrag&Dropする」(https://dobon.net/vb/dotnet/control/droptoexplore.html)を参考に
    アプリケーションを作成しております。
    同「エクスプローラへファイルをDrag&Dropする」のコメントにも記載があるのですが、コントロールからWindowsエクスプローラへ
    ドラッグ&ドロップした際にドロップされたフォルダ名を取得する事は可能でしょうか?
    現在は処理として、Windowsエクスプローラに「架空のファイル」をドロップし、そのフォルダ名を取得して処理を行いたいと思って
    います。

    以上、宜しくご教示のほどお願いいたします。
違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 35010 ] / ▼[ 35014 ]
■35012 / 1階層)  Re[1]: Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ 魔界の仮面弁士 大御所(1418回)-(2022/03/07(Mon) 15:41:43)
  • アイコンNo35010に返信(よっし〜さんの記事)
    > 現在は処理として、Windowsエクスプローラに「架空のファイル」をドロップし、そのフォルダ名を取得して処理を行いたいと思って
    > います。

    自作アプリに対してドラッグ&ドロップするなら簡単ですが、
    対 Explorer に対してパスを得ようとすると、難しいと思います。


    まず大前提として、"FileDrop" 形式のドラッグ & ドロップを
    受け付けるアプリケーションというのは、
    Windows Explorer だけではありませんよね。

    もしも Explorer 以外にはドロップできないようにしたいのであれば、
    専用のシェルエクステンションを自作し、ドラッグするデータ形式を
    FileDrop ではなく独自形式にしてやり取りするなどの手間がかかると思います。
    https://docs.microsoft.com/ja-jp/windows/win32/shell/reg-shell-exts

    一方、Explorer 以外にもドロップ可能であるという点は許容した上で、
    相手が Explorer の時だけドロップ先のフォルダーを得ようとするとなると…
    ドロップ直後のマウスカーソル位置から、配下のウィンドウを辿って
    調べるといった手順が必要になるかと予想します。( Codeer.Friendly など )
    実際に可能であるかどうかは未検証ですが。


    Public Class Form1
      Private dragStart As System.Drawing.Point? = Nothing

      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Label1.Text = "ドラッグしてください"
      End Sub

      Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs) Handles Label1.MouseDown
        dragStart = If(e.Button.HasFlag(MouseButtons.Left), e.Location, Nothing)
      End Sub
      Private Sub Label1_MouseUp(sender As Object, e As MouseEventArgs) Handles Label1.MouseUp
        dragStart = Nothing
      End Sub
      Private Sub Label1_MouseMove(sender As Object, e As MouseEventArgs) Handles Label1.MouseMove
        If dragStart.HasValue Then
          Dim moveRect As New Rectangle(
            dragStart.Value.X - SystemInformation.DragSize.Width \ 2,
            dragStart.Value.Y - SystemInformation.DragSize.Height \ 2,
            SystemInformation.DragSize.Width,
            SystemInformation.DragSize.Height)
          If moveRect.Contains(e.Location) Then
            Return 'まだドラッグを開始していない
          End If

          Dim dragData As New DataObject(DataFormats.FileDrop, New String() {"C:\NUL"})
          Dim de As DragDropEffects = Label1.DoDragDrop(dragData, DragDropEffects.Copy)
          If de = DragDropEffects.None Then
            Return 'ドラッグがキャンセルされた
          End If

          'ドロップ先のマウス座標は得られたが、
          'ここから対象フォルダーを調査できるか…?
          Dim pos = Cursor.Position


        End If
      End Sub

    End Class


    以下、思い付きでつらつらと。(試していません)

    (案1) AccessibleObjectFromPoint API を使って、
     IAccessible インターフェイスからドロップ先を調査できないか?

    (案2) System.Windows.Automation.AutomationElement.FromPoint メソッドで
     UIAutomation からドロップ先を調査できないか?

    (案3) WindowFromPoint API から得たドロップ先の HWND と、
     ShellWindows オブジェクトを列挙したオブジェクト階層から
     FolderItem プロパティと突き合わせて、Path プロパティを拾えないか?
違反を報告
[ 親 35010 / □ Tree ] 返信 削除キー/

▲[ 35012 ] / ▼[ 35015 ]
■35014 / 2階層)  Re[2]: Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ よっし〜 一般人(7回)-(2022/03/07(Mon) 16:11:16)
  • アイコン魔界の仮面弁士様、早々のご教示、有り難うございます。

    > まず大前提として、"FileDrop" 形式のドラッグ & ドロップを受け付けるアプリケーションというのは、
    > Windows Explorer だけではありませんよね。
    そうなんですよね・・・周りにファイルをドロップ出来るアプリって沢山あると思います。
    例えばエクセルファイルを起動済みExcelにドロップするとそのファイルが開かれます。
    私の案の「ドロップ先のフォルダ名を知る」と言う話しは、この場合、全然違うものになってしまいますね。
    (ドロップ先フォルダってありませんものね)
    ユーザが必ずWindowsエクスプローラにドロップするかは分かりませんし、魔界の仮面弁士様のおっしゃっている通りですね。

    サンプルや腹案も投稿して頂いたのに申し訳ございませんが、もっと根本的な所から出直してきます。

    本当に有り難うございました。(大変勉強になりました)



解決み!
違反を報告
[ 親 35010 / □ Tree ] 返信 削除キー/

▲[ 35014 ] / ▼[ 35016 ]
■35015 / 3階層)  Re[3]: Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ 魔界の仮面弁士 大御所(1419回)-(2022/03/08(Tue) 12:50:18)
  • アイコン2022/03/08(Tue) 13:09:19 編集(投稿者)

    No35014に返信(よっし〜さんの記事)
    > (ドロップ先フォルダってありませんものね)
    > ユーザが必ずWindowsエクスプローラにドロップするかは分かりませんし、

    仮に Explorer だとしても、ドロップ先は様々ですね。

    TreeView のフォルダーノードにドロップされることもあるでしょう。
    ドロップ先は物理フォルダーではなく、論理フォルダーかも知れません。

    タイトルバーにドロップされることもあれば、
    ListView の余白領域にドロップされることもあります。

    ListView 上の exeファイルやショートカットファイル上に
    ドロップされることもあれば、サブフォルダーにドロップされることも。

    そこまで追跡するとなると、ドロップ先の追跡は現実的では無いように思えます。


    >> Windowsエクスプローラに「架空のファイル」をドロップし、
    >> そのフォルダ名を取得して処理を行いたい

    操作を逆にしては駄目なのでしょうか。

    エクスプローラーから、ファイルまたはフォルダーを
    自アプリにドロップしてもらう形にすれば、
    そのフォルダー名を取得することも容易になりそうですが。
解決み!
違反を報告
[ 親 35010 / □ Tree ] 返信 削除キー/

▲[ 35015 ] / 返信無し
■35016 / 4階層)  Re[4]: Windowsエクスプローラへのドロップ先フォルダの取得
□投稿者/ よっし〜 一般人(8回)-(2022/03/08(Tue) 13:59:37)
  • アイコンNo35015に返信(魔界の仮面弁士さんの記事)
    > 操作を逆にしては駄目なのでしょうか。

    現在「ファイル管理アプリ(もどき)」を作成しております。
    Windowsエクスプローラからファイルをドロップしてもらって、ファイルとPDFファイルを作成し内部に保存します。
    処理したファイルはFlowLayoutPanelで表示し、それをWindowsエクスプローラにドラッグするとドラッグ先に
    ファイルを戻すのですが、この時ドラッグされた元ファイルなのか、作成したPDFファイルなのか選択したいので、
    一旦ドラッグ先のフォルダ名を取得後、ユーザに選択してもらって、後でゴリゴリとファイルコピーで
    処理したいと考えております。

    今も根本の方法(操作方法)を試行錯誤しながら行っており、一旦設定画面でファイル種類を設定し、その設定
    に従ってファイルを戻す処理にしようかと考えております。

    お忙しい中、どうも有り難うございました。


解決み!
違反を報告
[ 親 35010 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -