HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
1222
UNGA複数選択されたファイルやフォルダのパスを取得する方法を教えてください7未解決


UNGA

リンク

2023/12/22(Fri) 22:10:39|NO.100909

よろしくお願いします。
エクスプローラーで、ファイルやフォルダを複数選択した際、
そのパスをまとめて取得することは可能でしょうか?



この記事に返信する


沢渡

リンク

2023/12/23(Sat) 00:07:19|NO.100910

複数のファイル名の取得方法としてドラッグ&ドロップを用いるのなら、
次のようにすれば良いのではないでしょうか。
(Unicodeでないと扱えない名前のファイルも扱えるよう、UTF-16に対応したAPIを使っています。
 このようなファイルを扱うにはhsp3utfを使うか、もしくはhsp3utfなしでも
 このようなファイルを扱えるような処理が必要)

//参考: //https://learn.microsoft.com/ja-jp/windows/win32/api/shellapi/nf-shellapi-dragacceptfiles //https://learn.microsoft.com/ja-jp/windows/win32/shell/wm-dropfiles #include "Shell32.as" DragAcceptFiles hwnd,1 //ドラッグ&ドロップを受け付ける oncmd gosub *drop,0x0233 //WM_DROPFILES stop *drop hDrop=wparam //識別子 color 255,255,255 : boxf : color 0,0,0 : pos 0,0 DragQueryFileW hDrop,0xFFFFFFFF,0,0 : num=stat //ドロップされたファイル数を取得 repeat num DragQueryFileW hDrop,cnt,0,0 : chr=stat+1 //文字数を取得(終端ヌルの分も加算) sdim s,chr*2 //UTF-16対応のAPIを使っているので、文字数×2バイトのバッファを確保 DragQueryFileW hDrop,cnt,varptr(s),chr res=cnvwtos(s) mes res loop DragFinish hDrop //最後にこれを実行しメモリを解放する return



UNGA

リンク

2023/12/23(Sat) 12:50:06|NO.100913

お返事ありがとうございます。

少し説明が足りなかったので、補足させていただくと、HSPのウインドへのD&Dを
想定しているのではなく、エクスプローラーで、SHIFTなりCTRLなりで複数のフォルダ
をハイライトしたときにアドレスをすべて取得することを考えております。

よろしくお願いいたします。



TOMATO

リンク

2023/12/23(Sat) 16:57:17|NO.100916

ロストテクノロジー


newcom pShellDispatch6, "Shell.Application" comres pShellWindows pShellDispatch6->"Windows" i = pShellWindows("Count") repeat i comres pWebBrowser2 pShellWindows->"Item" cnt strFullName = pWebBrowser2("FullName") strFullName = getpath(strFullName, 16) // lower if instr( strFullName, 0, "explorer.exe") != -1 { pShellFolderViewDual3 = pWebBrowser2("Document") comres pFolderItems pShellFolderViewDual3->"SelectedItems" j = pFolderItems("Count") repeat j comres pFolderItem pFolderItems->"Item" cnt mes pFolderItem("Path") delcom pFolderItem loop delcom pFolderItems delcom pShellFolderViewDual3 } delcom pWebBrowser2 loop delcom pShellWindows delcom pShellDispatch6



沢渡

リンク

2023/12/23(Sat) 17:21:25|NO.100917

返答しようと思ったら、理想的な回答が……素晴らしいです。
一応副産物として、妥協案のつもりで作った「複数のファイルが選べるファイル選択ダイアログ」の
モジュールを貼っておきます。

#include "comdlg32.as" //multi_opendlg 配列名 //複数のファイルを選択できる「開く」ダイアログを開く。 //ユーザーがファイルを選んだ場合、配列名に指定した変数が文字列配列として初期化され、 //そこに選ばれたファイル名が入り、statは配列の要素数になる。 //ユーザーが1つだけファイルを選んだ場合は配列の要素数は1になり、 //そこに選ばれたファイルのフルパスが入る。 //ユーザーが複数のファイルを選んだ場合は配列の要素数は3以上になり、 //最初の要素にはディレクトリ名が、以降の要素にはファイル名が入る。 //キャンセルされるかエラーが起きた場合はstatは0になる。 #module #const max_chr 65535 //一度に取得できる最大文字数 #deffunc multi_opendlg array arr c_dir=dir_cur dim ofn,22 sdim strfile,max_chr*2 ofn=88,hwnd,hinstance,0,0,0,0,varptr(strfile),max_chr,0,0,0,0,0x10080A00 GetOpenFileNameW varptr(ofn) : res=stat chdir dir_cur if res=0 : return 0 flag=0 : items=0 repeat max_chr //アイテム数を数える if wpeek(strfile,cnt*2) { flag=0 } else { if flag : break flag=1 items++ } loop if items=0 : return 0 sdim arr,64,items item_pos=0 : start=0 : cou=0 : flag=0 repeat max_chr if wpeek(strfile,cnt*2) { if flag : start=cnt : cou=0 : item_pos++ flag=0 cou++ } else { if flag : break flag=1 if cou { sdim buf,cou*2+2 memcpy buf,strfile,cou*2,0,start*2 arr(item_pos)=cnvwtos(buf) } } loop dim strfile return items #global multi_opendlg hoge repeat stat mes hoge(cnt) loop



UNGA

リンク

2023/12/24(Sun) 17:23:21|NO.100919

TOMATOさん、沢渡さん、誠にありがとうございます。

TOMATOさんのスクリプトを、一応理解しようと努力はしたのですが、comは私にとっては難し
すぎで手に負えません(;´д`)。自作のプログラムに組み込んで挙動を試しました。実行された時
た時点で、コピー元も先も、ハイライトされているファイル(フォルダー)はすべてリストアップ
されるようです。

要望ばかりで恐縮ですなのですが、「コピーされたときだけ、コピー元の選択ファイル(フォルダ)
のパスのみを取得」する方法はないものでしょうか。

よろしくお願いいたします。



TOMATO

リンク

2023/12/24(Sun) 19:52:38|NO.100920

以下のスレッドの内容と組み合わせているという話でしょうか?
この辺の事情は最初から書いてくれると、助かると思います。
(単発で実行するなら要件を満たしているが、他と組み合わせると問題が起きる…なんてことはよくあります)
https://hsp.tv/play/pforum.php?mode=all&num=100729

で、先ほど紹介したものは、
エクスプローラ上でファイル選択されている項目を取得する機能のみであり、
それがコピーされたかどうかの判断するすべは直接的にはありません。
(コピーした時にコピー先のファイルをエクスプローラが選択しますからね)

エクスプローラでコピーした時限定になりますが、コピーフックという機能があったりします。
コピーされようとしたときに、割り込む機能ですね。
https://eternalwindows.jp/shell/shellex/shellex05.html

ただし、C++などでDLLを作成する必要があり、
HSPだけで完結しないというのが難点でしょうか?

私個人の事情ですが、新型コロナに感染して発熱で若干意識朦朧としているので、
取り急ぎこれぐらいの情報共有とさせていただきましし。



UNGA

リンク

2023/12/24(Sun) 20:48:17|NO.100921

いろいろとアドバイスありがとうございます。
体調不良の折りに申し訳ありません。

コピーフック、調べてみますが、私の今の技量では難しそうです。
また質問させていただくかもしれませんが、その時はよろしくお願いいたします。

どうぞ無理なさらないよう、ご自愛ください。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.100909への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.