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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0627
山田他のソフトにドラッグアンドドロップしたい3未解決


山田

リンク

2014/6/27(Fri) 05:04:42|NO.62624

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

他のフリーソフトへフォルダをD&Dしたいのですが
どうすれば出来ますか?
フォルダの中身はテキスト2個、画像3枚です。

マウスのオートパイロットのように一旦手動で登録するのではなくて、
※フォルダが沢山ある為ポインターがずれたりする為

フォルダの位置と名前をcsvなどに保管して、
それを読み取って次々にフォルダをD&Dしたいのです。
そういった事は可能でしょうか?

もしくはフォルダを次々に自動で移動させてD&Dとかも可能ですか?

是非とも作り方を教えてください。
よろしくお願いします。



この記事に返信する


Humi

リンク

2014/6/27(Fri) 13:02:59|NO.62626

自分で作っている最中にここでみつけました(泣

http://hsp.tv/play/pforum.php?mode=pastwch&num=4360

自分にもいいますけど、ちゃんと過去ログはあさるべきですね(--;)



山田

リンク

2014/6/27(Fri) 19:38:36|NO.62635

Humi様

どうもありがとうございます

他にも同じように考えている人がいたんですね^^)
どうもわざわざすみませんでしたm(_ _)m

ソースを記事を参考に書き足したところ、
C:\\test.txt は HSPスクリプトエディタには読み込まれるのですが(何故か)
試しに起動しているメモ帳には何の変化もありません
※メモ帳は左上にくっつけるようにしてヒライています。

記事を読むと、私がやりたいことが出来そうなんですが
使い方のサンプルなどが有れば教えてください。

やりたいことは

実行中の他のソフトのウインドウに、準備してあるフォルダを次々にD&Dしたいのです。
※自動でマウスでつまんで動かすイメージに近いです。

すみませんが、どうぞよろしくお願いします。


//---------------------------- //※ドロップ確認用の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 #cfunc WindowFromPoint "WindowFromPoint" int,int //これを追加したらエラーがなくなった //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:\\DELL",123,456,0 repeat 10 hTarget = WindowFromPoint(ginfo(0),ginfo(1)) if hTarget ! hwnd : autodrop hTarget,"C:\\test.txt",10,10,0 mes hTarget wait 50 loop stop 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



Humi

リンク

2014/6/29(Sun) 12:04:15|NO.62677

そうですね。
WindowFromPointはマウスのグローバル座標の場所の下にある
ウィンドウハンドルを取得するんですが、

たとえばメモ帳を起動していると、
メモ帳はだいたい 本体+エディタボックスで構成されているので、
メニューバーやタイトルバーのところにマウスをもっていかないと、
メモ帳だと判断しないでエディタボックスにファイルを送り付けます。

メモ帳なんかがサブクラス化をしているとは思えないので、
ファイルが読み込まれません。
ためしにメモ帳のタイトルバーにマウスを持っていってください。
正常にファイルが読み込まれると思います。

そいで、そのサンプルは自分自身に読み込むようにしているので、
その部分を消して、
さらにrepeatで無差別にWindowFromPointするのは
山田sが
>C:\\test.txt は HSPスクリプトエディタには読み込まれるのですが(何故か)
といっていたように危ないので、
できるだけFindWindowやEnumWindowなどで確実だと確かめたのちに
送信するべきですね。

以下[自分自身へ送信部分]と[WindowFromPointをFindWindowへ変更]したサンプルです。


//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 #cfunc FindWindow "FindWindowA" 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 *main // メモ帳起動 exec "notepad" //repeat 10 //hTarget = WindowFromPoint(ginfo(0),ginfo(1)) hTarget = FindWindow("notepad", 0) // FindWindow(クラス名, ウィンドウタイトル) if hTarget != 0 : autodrop hTarget,""+dir_desktop+"\\test.txt",10,10,0 mes hTarget //wait 50 //loop stop

ではでは、長々と失礼しました。



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