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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1206
D.J.エクスプローラへのドロップについて19未解決


D.J.

リンク

2015/12/6(Sun) 18:58:06|NO.73476

現在、エクスプローラへのドラッグ&ドロップを検知できないかと模索中です。
ドラッグ&ドロップについては、エクスプローラを複数開いて、エクスプローラからエクスプローラへの移動を主に考えています。

サンプル等を検索しましたが、どれもエクスプローラから、hspで作成したウィンドウへドロップしたもののパスを取得する等のものばかりでしたのですが、
エクスプローラへドロップされたファイル・フィルだのパスを取得することは不可能なのでしょうか?

回答よろしくお願いします。



この記事に返信する


D.J.

リンク

2015/12/7(Mon) 20:47:31|NO.73495

タイプミスがありましたので、訂正します。
6行目、
 ファイル・フィルだのパス → ファイル・フォルダのパス
です。
申し訳ありません。



kanamaru

リンク

2015/12/7(Mon) 22:51:20|NO.73501

試してないからわかりませんが、
1.findwindowでエクスプローラーのハンドルを取得する
2.なんらかの方法でドラッグを検知
3.ScreenToClientというuser32内の命令でエクスプローラ内での座標を取得
(この時にハンドルを使います。)
4.あとはifかなんかで判断
とかでいけそうです。
2のドラッグの検知は、
mouseupとかmousedownとかいう名前のウィンドウメッセージがあったので、
それをoncmdで処理すればできます。



kanamaru

リンク

2015/12/7(Mon) 23:01:08|NO.73502

あっドラッグされたファイルのパスも取得したいのか…
前述の方法だとドラッグの動作だけだし。
だったらどうやるんだろ。



774

リンク

2015/12/8(Tue) 20:29:09|NO.73520

他所のエクスプローラ同士のドラッグ&ドロップ処理を捕捉したい…という事でしょうか?

取り敢えずそういう仮定で…
グローバルフックでWM_DropFilesメッセージを捕捉すれば出来るのかも知れません。
グローバルフックはHSP単体では無理っぽいですが、それが可能なDLLは在るかも知れません。

次に、自ソフトからエクスプローラへドロップしたい場合…
「OLEドラッグ&ドロップ」という処理になります。
結論から言うと、こちらもHSP単体では無理っぽいです。
(COMクラスとそのメンバ関数をHSP内で用意する方法がちょっと見当付きません
HSP用では無いですがそういうDLLは在るようなので、それを扱う事ができれば可能なのでしょうか。


結果として「DLLを使えば出来るかも知れません」という回答になります。すいません。



kanamaru

リンク

2015/12/8(Tue) 21:43:50|NO.73521

透明ウィンドウが使えないかな?
エクスプローラの上に透明ウィンドウを配置して、
そこへのドラッグを検知できれば…。
検知できたら、あとは何らかの方法でエクスプローラ側にもドラッグして。



D.J.

リンク

2015/12/9(Wed) 00:04:21|NO.73524

774さん>>自ソフトからエクスプローラへドロップしたい場合
 私がやりたいのは、エクスプローラへのドロップの検知と、その時にドロップされたファイル等のパスの取得です。
 なので、WM_DropFilesメッセージについて、調べてみます。

kanamaruさん>>透明ウィンドウが使えないかな?
 一度考えたのですが、透明ウィンドウをエクスプローラ上においたとして、エクスプローラへのドロップ、
 その他の操作が疎外されないのでしょうか?勉強不足で申し訳ありませんが、私の方でやってみますが、
 教えて頂けるとありがたいです。
 
774さん、kanamaruさん、アドバイスありがとうございます。
ひとまず、お二人のコメントを基に、やってみます。



kanamaru

リンク

2015/12/9(Wed) 00:47:27|NO.73525

例えば、
http://hsp.tv/play/pforum.php?mode=pastwch&num=53280
を参考にすれば、エクスプローラへのマウス操作などは疎外されないと思います。
試してないので、ひょっとしたら、
ドラッグが検知できなくなりそうだけど。



kanamaru

リンク

2015/12/9(Wed) 01:11:20|NO.73526

後は、見た目が悪いですが、
しかも試してないけど、
エクスプローラを子ウィンドウにしてしまうという手もあります。
多分bgscrならあまり目立たないし。
(どうしても見た目が悪いのが嫌だったらリージョン変えればなんとかなる)
ただ、ソースは短くなります。
子ウィンドウにすれば、グローバルフック無しでパスが取得できるし、
ネットに転がっているソースが活躍します。



Rich

リンク

2015/12/9(Wed) 19:53:39|NO.73533

サブクラス化に挑戦したのですが、ウィンドウプロシージャが取得できないようだし、
エクスプローラにDragAcceptFiles以外でD&D可と設定されているようなので、失敗しました。
一応ソース乗せときます。

#include "user32.as" #include "shell32.as" #include "hscallbk.as" #uselib "" #func ExpWndProc "" int,int,int,int setcallbk Proc,ExpWndProc, *MyExpWndProc//コールバック関数の登録 GetWindowLong hwnd,-4:WndProc=stat//ウィンドウプロシージャのアドレス exec "C:\\Windows\\explorer.exe" wait 100 FindWindow "CabinetWClass","ライブラリ":hCabinetWClass=stat//エクスプローラーのウィンドウハンドル DragAcceptFiles hCabinetWClass,1//D&Dできるようにする GetWindowLong hCabinetWClass,-4:OldWndProc=stat SetWindowLong hCabinetWClass,-4,WndProc//ウィンドウプロシージャのアドレスをエクスプロラーに設定 mes "hWnd:"+strf("0x%08X",hCabinetWClass) stop *MyExpWndProc if callbkarg(1)==0x0223{//D&D検知 goto *OnDropFiles }else:if callbkarg(1)==0x0012{//エクスプローラ終了時 CallWindowProc OldWndProc,callbkarg(0),callbkarg(1),callbkarg(2),callbkarg(3) end }else{//それ以外のは元に戻しておく CallWindowProc OldWndProc,callbkarg(0),callbkarg(1),callbkarg(2),callbkarg(3) } return *OnDropFiles//ファイルがドロップされた hDrop = wParam DragQueryFile hDrop, -1, 0, 0 nDrop = stat sdim filename, 260 repeat nDrop DragQueryFile hdrop, cnt, varptr(filename), 260 mes filename loop DragFinish hDrop//D&D情報をクリア return



774

リンク

2015/12/10(Thu) 22:16:24|NO.73558

すいません、エクスプローラ同士でのD&DについてSPY++で覗いてみたのですが
WM_DropFilesメッセージでのやりとりは行っていないようです。

前回ちょっと出た「OLE-D&D」にはドロップされた時の処理も含まれてますので
どうもソチラでやり取りしてそうです。
OLE-D&DはCOM関数での処理で、コレを覗き見る方法はちょっと見当付きません。

ファイルの移動を知りたいだけなら、LVM_GetItemCountでファイル(フォルダ数)を監視し
以前との差分で求める事は出来るかも知れません。

あと、何度か不明なメッセージをやり取りしてるので
ひょっとするとコレを解析すれば内容が掴めたりするのでしょうか…



D.J.

リンク

2015/12/16(Wed) 18:02:59|NO.73630

返信が遅れまして、申し訳ありません。
皆様からのアドバイスを基に、さらに検索や、試作を行ったのですが、うまくいきませんでした。
私の力不足が主な原因ではあると思いますが、どうやらエクスプローラ関係は難しいようです。

それから、少々話がずれてしますのですが、デスクトップへのドロップは、WM_DropFilesで検知できるのでしょうか?
質問に次ぐ質問で申し訳ありません。



774

リンク

2015/12/16(Wed) 19:43:32|NO.73631

デスクトップも同様なようです。
(それ自体がエクスプローラのリストビューなのかも?
基本的にドロップ元となれる場所は、WM_DropFiles使って無さそうですね。

目的にもよりますが、何か別のアプローチを考えた方が良いかもです…



D.J.

リンク

2015/12/16(Wed) 20:17:47|NO.73632

そうなんですか。
目的としては、ファイルのドロップのを検知して、その時のファイルパスからファイルの種類(.txtとか、.exeとか)を知りたいと思っています。
しかし、難しいようなら別の手段も考えてみます。

ずっと未解決ということも何なので、今回は、ドロップの検知は難しいということで、ひとまず決着ということにしておきます。
こういう場合は、解決済みにしたほうがいいのでしょうか?



科学太郎

リンク

2015/12/16(Wed) 22:19:14|NO.73633

> こういう場合は、解決済みにしたほうがいいのでしょうか?
私の意見では「未解決」のままにして欲しいですね。
過去ログを検索したときに「解決マーク」があると「ラッキー」と思いますが、
見ると不可能ではないが難しすぎるので断念して「解決マーク」がついてると残念です。

> 目的としては、ファイルのドロップのを検知して、その時のファイルパスからファイルの種類(.txtとか、.exeとか)を知りたいと思っています。
その後の処理を知りたいです。
そうしないと適切なアドバイスができないので。



D.J.

リンク

2015/12/18(Fri) 01:20:21|NO.73645

科学太郎さん、返信ありがとうございます。

私がやりたいことについてですが、今一度申しますと、エクスプローラまたはデスクトップにドロップされたファイル・フォルダのパスを取得し、
文字列比較などを使用し、拡張子からファイルの種別(テキストファイルやアプリケーション)を判別したいです。
現在作成中のプログラムは、その判別結果から、メッセージを出力しようとしています。
例えば、テキストファイルとフォルダがドロップされると、「テキストファイルが移動されようとしています。」というようなメッセージを出力するものです。



D.J.

リンク

2015/12/18(Fri) 01:22:55|NO.73646

書き洩らしたので、解決について。
科学太郎さんが言われることは、もっともなので、ドロップの検知ができるかどうかの最終的な見解が出るまでは、未解決としておきます。



科学太郎

リンク

2015/12/18(Fri) 20:00:20|NO.73669

> 例えば、テキストファイルとフォルダがドロップされると、
>「テキストファイルが移動されようとしています。」というようなメッセージを出力するものです。
これは「移動前」でないといけないの?
移動後ならば監視できそうですが…。

・FindFirstChangeNotification
http://msdn.microsoft.com/ja-jp/library/cc429231.aspx

・FindNextChangeNotification
http://msdn.microsoft.com/ja-jp/library/cc429240.aspx

・FindCloseChangeNotification
http://msdn.microsoft.com/ja-jp/library/cc429226.aspx



科学太郎

リンク

2015/12/18(Fri) 20:09:33|NO.73670

追記。

・ドラッグ アンド ドロップ操作の実行
https://msdn.microsoft.com/ja-jp/library/ms973845.aspx

・ドラッグ アンド ドロップ (OLE)
https://msdn.microsoft.com/ja-jp/library/96826a87.aspx



D.J.

リンク

2015/12/19(Sat) 18:41:48|NO.73695

返信、参考ページの提示ありがとうございます。

>「移動前」でないといけないの?
移動後でも、実際にファイルが置かれる前であれば、問題ありません。
教えて頂いたページのすべてに目を通していないので可能かわかりませんが、移動後に検知し、ファイルが置かれる前に自分の処理を挟めないか検討してみます。



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