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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
1223
As自動的にファイルをドロップする9解決


As

リンク

2006/12/23(Sat) 18:01:52|NO.4360

 あるソフトウェアの指定した位置にファイルをドロップするような仕組みを考え
ています。そこでWM_DROPFILESメッセージをそのソフトウェアに送ることまではわ
かったのですが、そのwParamの中の構造体のハンドルというのがどうしても理解で
きません。いったいどういったことをすればこの構造体のハンドルにマウスの位置
などの値を代入することができるのでしょうか?  何卒ご教示お願いします。



この記事に返信する


774

リンク

2006/12/24(Sun) 21:51:02|NO.4388

ググっても見つからなかったけど、
WM_DROPFILES の wparam が内部構造体のハンドルで、
それを使って DragQueryFile、DragQueryPoint でファイル名やドロップ位置を取得できる
ってことは、wparam はアドレスでそれを辿ればどんな構造体かわかるはず?
と思ったのでこんなことやってみた

#uselib "shell32" #func DragAcceptFiles "DragAcceptFiles" int, int #func DragQueryFile "DragQueryFileA" int, int, int, int #func DragQueryPoint "DragQueryPoint" int,int #func DragFinish "DragFinish" int oncmd gosub *dropfiles, $233 //WM_DROPFILES sdim path,512 DragAcceptFiles hwnd, 1 stop *dropfiles pos cx,0 dim point,2 DragQueryPoint wparam, varptr(point) DragQueryFile wparam, 0, varptr (path), 512 dupptr copy,wparam,4 //wparamが指してるアドレスに入ってるデータをコピー mes copy mes path mes ""+point(0)+" "+point(1) mes dupptr copy2,copy,80 //アドレスっぽかったのでさらにコピー repeat 20 mes ""+copy2(cnt)+" "+strf("%x",copy2(cnt))+" "+strf("%c",copy2(cnt) >> 16)+" "+strf("%c",copy2(cnt) & 0xffff) loop DragFinish wparam cx += 200 return
他の数値はわからないけど、2個目と3個目がドロップ位置で
6個目からがファイル名になってる模様。

これで表示されるのと同じ様なデータが入った配列を作って
そのアドレスを wparam として WM_DROPFILES を sendmsg したら
動くんじゃないかな〜?

とりあえず、今日はこの辺で
//詳しい人のツッコミ募集中ですw



t.hamaguti

リンク

2006/12/25(Mon) 00:00:02|NO.4390

WM_DROPFILESのWPARAMってどこかで見たなー、と思って探してみたらありました。
http://web.archive.org/web/20040714220349/http://zidney.define.jp/programing/wm/wm_dropfiles/
以前試した時はこれを実装したらOKだった記憶があります。
その時のソースは紛失してしまったので確証はありませんが、試してみてください。(^_^;



As

リンク

2006/12/25(Mon) 03:00:13|NO.4391

>>774さん
なるほど!その手がありましたかΣ(○д○)
つまりはハンドルというのは構造体のアドレスのことだったのですかね^^;
DragQueryPointなどの関数に惑わされてしまっててっきりこういった
関数でないと使えないものかと思ってしまいました('へ`;
手探りで構造体を見つけていただきありがとうございます><
配列の部分の値を入れ替えるだけで実装できそうです^^

>>t.hamagutiさん
まさかウェブアーカイブとは、わざわざ有難うございます><
これでやっとハンドルの正体がわかりましたε-(;ーωーA



As

リンク

2006/12/25(Mon) 03:41:46|NO.4392

只今プログラムを組んでいるのですが、

ハンドルのアドレス に 構造体のアドレスがある
という妙な仕様になっていうようでした(^^;
プログラムが完成したらここに載せて解決にしたいと思います。<(_ _)>



As

リンク

2006/12/26(Tue) 21:16:57|NO.4417

やっと完成しました。グローバルヒープの概念を理解していなかったのが問題だったみたいです><
返信大変参考にさせていただきました。下記に自動でドロップするモジュールを載せておきます。
なにか問題点などありましたらご指摘お願いいたします。


//---------------------------- //※ドロップ確認用のWindowsAPI #uselib "shell32" #func DragAcceptFiles "DragAcceptFiles" int, int #func DragQueryFile "DragQueryFileA" int, int, int, int #func DragQueryPoint "DragQueryPoint" int,int #func DragFinish "DragFinish" int //---------------------------- //WindowsAPI #uselib "KERNEL32.DLL" #func global GlobalAlloc "GlobalAlloc" sptr,sptr #func global GlobalLock "GlobalLock" sptr #func global GlobalUnlock "GlobalUnlock" sptr #uselib "user32.dll" #func global PostMessageA "PostMessageA" sptr,sptr,sptr,sptr //Define #define global GMEM_ZEROINIT $00000040 //メモリの内容を 0 へ初期化 #define global WM_DROPFILES $00000233 //ファイルがドロップされたときに渡されるメッセージ #define global PostMessage PostMessageA #module //p1: ファイルがドロップされるハンドル //p2: ドロップするファイルのパス //p3: ウィンドウの左上からのマウス位置X //p4: ウィンドウの右上からのマウス位置Y //p5: ファイルパスの形式 0(規定)=Unicode(NT専用) 1=通常の文字列 #deffunc autodrop int p1,str p2,int p3,int p4,int p5 c1=20 + strlen(p2)*4 //DROPFILES構造体のデータサイズ + 文字列 GlobalAlloc GMEM_ZEROINIT,c1 //グローバルヒープのメモリを初期化 hMem=stat //初期化されたメモリアドレスを代入 GlobalLock hMem //グローバルヒープ領域のメモリをロック p=stat //構造体の先頭のアドレスを取得 dupptr DropFiles,p,c1 //構造体の取得 DropFiles.0=20 //DROPFILES構造体のデータサイズ DropFiles.1=p3 //マウスX DropFiles.2=p4 //マウスY DropFiles.3=1 //ポインタ取得ON //Unicodeを使うか使わないか指定[p5](バグがあるかも) if p5=0{ //NT用 DropFiles.4=1 cnvstow DropFiles.5,p2 }else{ //9x用 DropFiles.4=1 //NT系OSの環境ではここを0にするとパスを取得できないらしい //9x系OSを持っていないので詳細は不明 s3=0 //文字列を数値に変換するための変数をint型に変換 s1=p2 //ファイルパスを変数にする repeat strlen(p2) s2=strmid(s1,cnt,1) //一文字だけ取り出す poke s3,0,s2 //文字列のを取得 memcpy DropFiles.5,s3,1,cnt*2 //アスキー文字コード memset DropFiles.5,0,1,cnt*2+1 //NULL文字 locnt=cnt loop memset DropFiles.5,0,1,locnt*2+2 //一応NULL文字を付加 } PostMessage p1,WM_DROPFILES,hMem,0 //ドロップメッセージを指定されたウィンドウに送信 GlobalUnlock hMem //メモリ領域のロックを解除 return 1 #global //画面構成// title "ファイルをドロップできます" font msgothic,11 //////////// oncmd gosub *dropfiles,WM_DROPFILES //ドロップされたときにジャンプ DragAcceptFiles hwnd, 1 //ドロップを受け付ける //自分自身のウィンドウにメッセージ送信(笑 autodrop hwnd,"C:\\gs\\hsp3\\mod_drag\\hsptmp",123,456,0 stop //ドロップ情報 Thanks! 774さん *dropfiles pos cx,0 dim point,2 sdim path,512 DragQueryPoint wparam, varptr(point) DragQueryFile wparam, 0, varptr (path), 512 dupptr copy,wparam,4 //wparamが指してるアドレスに入ってるデータをコピー mes "ハンドルの中身\t"+copy mes "ファイルパス\t"+path mes "カーソル位置\t"+point(0)+" "+point(1) mes if copy>100{ dupptr copy2,copy,80 //アドレスっぽかったのでさらにコピー mes "通常 16進数 10進数 上位文字コード 下位文字コード UnicodeOR文字コード配列" foreach copy2 mes ""+copy2(cnt)+" "+strf("%x",copy2(cnt))+" "+strf("%c",copy2(cnt) >> 16)+" "+strf("%c",copy2(cnt) & 0xffff)+" "+cnvwtos(copy2(cnt)) loop }else{ dupptr copy2,varptr(copy),80 //アドレスっぽかったのでさらにコピー mes "通常 16進数 10進数 上位文字コード 下位文字コード UnicodeOR文字コード配列" foreach copy2 mes ""+copy2(cnt)+" "+strf("%x",copy2(cnt))+" "+strf("%c",copy2(cnt) >> 16)+" "+strf("%c",copy2(cnt) & 0xffff)+" "+cnvwtos(copy2(cnt)) loop } DragFinish wparam cx += 200 return



774

リンク

2006/12/29(Fri) 04:10:33|NO.4488

こんな風に考えてたんだけど、これじゃどこかダメだったりするんかな?
(自分とこのパソコン(XP)だと動いたけど・・・

#deffunc autodrop int p1,str p2,int p3,int p4,int p5 dim DropFiles,1000 //1000にしたのはテキトーw DropFiles.0=20 (中略) sendmsg p1,WM_DROPFILES,varptr(DropFiles),0 return 1

>なにか問題点などありましたらご指摘お願いいたします。
私もよくわかってなかったり^^;



As

リンク

2006/12/29(Fri) 17:40:21|NO.4506

ドロップ情報が収まっているメモリ空間というのはグローバルヒープという今では使われなくなった
空間で処理しているらしく、そこに入っているポインタ値でないと実行できないらしいのです。

HSPではできたとしても、メモ帳などにテキストファイルをドロップしてもできないと
思います^^;

それと、前に投稿したソースもどうやらメモ帳など他のアプリケーションには使えなかった
みたいです(´;ェ;`)

HSP専用ということになりますねo(´^`)



774

リンク

2006/12/29(Fri) 20:29:35|NO.4515

私のほうはともかく、No.4417のソースは動くっぽいよ
多分、ドロップを受け付けるように設定されてるコントロールのハンドルを
ちゃんと指定できてなかったりすんだと思う

repeat 10 hTarget = WindowFromPoint(ginfo(0),ginfo(1)) if hTarget ! hwnd : autodrop hTarget,"C:\\test.txt",0,0,0 mes hTarget wait 50 loop stop
これを足してチェックしてみたら
メモ帳だと、タイトルバーとメニューバー
TeraPad(テキストエディタ)だと、どこでも
スレイプニル(タブブラウザ)だと、タイトルバー
にマウスカーソル乗せたらちゃんと動作したよ
(IEはどこも反応しなかったけど・・・



As

リンク

2006/12/29(Fri) 22:53:09|NO.4519

>>774さん
ほんとにもうありがとうございます><
せっかくのソースを無駄にするところでした><

ハンドルは直指定でFindSystemというのを使っていたのですが、
こんかいもう一度同じことを試した結果 成功しました^^;

気づいたらHSPのエディタにまでドロップされてしまいましたが汗



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