|
|
2009/10/18(Sun) 23:54:33|NO.28400
質問させていただきます。
現在外部アプリのクリップボードに文字列を送るソースを書いてるのですが、
いまいちスマートでないのでスマートなやり方教えていただけたらうれしいです。
そこでいろいろぐぐって ぷまさん のソース見つけたのですが、ぷまさん のソースでは
あらかじめボタンに文字列を設定しておくと、ボタンの数だけルーチンが増えてしまい、
ソースが膨大になってしまい困ってます。
とりあえず今できてるソースは次の通りです。
#uselib "user32.dll"
#func global keybd_event "keybd_event" int, int, int, int
#module
#deffunc aplkey2 int k , int optKey
opt=limit(optKey+15, 16, 18)
if optKey : keybd_event opt, 0, 0, 0
keybd_event k, 0, 0, 0 : keybd_event k, 0, 2, 0
if optKey : keybd_event opt, 0, 2, 0
return
#global
screen 0,200,100
gsel 0,2 //アクティブスイッチ
button gosub "ok",*mesj
input code,0,0 : winmes=stat : chobj= objinfo_hwnd(winmes)
stop
*mesj
code="mes" : objprm 1,code //インプットボックスに文字列を返す
objsel winmes : sendmsg chobj, $b1, 0, -1 : sendmsg chobj, $301
gsel 0, -1 //hsp側を非アクティブにする
wait 5 : aplkey2 'V', 2 //キーイベで外部クリップに送る
gsel 0,2 //hsp側にハンドルを戻す
return
です。
できたらAPIとかでスマートにしたいのですが、先輩方の知恵を貸していただけない
でしょうか。
よろしくお願いします。
|
|
2009/10/19(Mon) 00:26:44|NO.28402
質問とプログラムの意図が読み取れません
外部アプリのクリップボードとはいったい何のことでしょう。クリップボードは共有です。
aplkey2の説明もないので何をする命令なのかわかりません。命令名をわかりやすくするか、説明を入れましょう。
ぷまさんのスクリプトを見つけた、とありますが、一体どのスクリプトのことでしょうか。わかりません
キーイベやメッセなどの言葉も少なくとも俺には理解できませんでした。
そのためタイトルの、外部(?)クリックボード(?)にメッセ(?)を送る、を理解することができず、回答をすることができません。
|
|
2009/10/19(Mon) 10:39:45|NO.28411
Ctrl + V を送信してやるのがスマートと思います。
#uselib "user32.dll"
#func keybd_event "keybd_event" int, int, int, int
#define VK_CONTROL 0x11
#define KEYEVENTF_KEYUP 2
exec "notepad"
wait 100
// 押す
keybd_event VK_CONTROL, 0, 0, 0
keybd_event 'V', 0, 0, 0
wait 10
// 離す
keybd_event 'V', 0, 2, 0
keybd_event VK_CONTROL, 0, 2, 0
標的が Edit コントロール等の時は
#define WM_PASTE 0x0302
sdim a, 0xFF
mesbox a, 640, 480
hEdit = objinfo_hwnd(stat)
wait 50
sendmsg hEdit, WM_PASTE, 0, 0
みたいな方法もあります。
他のやり方でやりたいならなら、WM_SETTEXT メッセージか、SetWindowText 関数を使って下さい。
しかしその場合汎用性を大きく失うことになります。
なぜなら WM_SETTEXT に対応していないウィンドウもあります。
Office Word とか Windows 標準のコントロールを使っていないものに多いです。
|
|
2009/10/20(Tue) 00:48:49|NO.28438
ありがとうございます。
そこでもう一つ質問させてください。
このソースだと現在開かれてるエディターの文字列が対象になってますが、
これを変数などにあらかじめ登録しといてやる場合は
やはりインプットボックスに一度移してやるしかないのでしょうか?
質問ばかりですみません。
現在回らないあたまで考えたあげくできたソースは
#uselib "user32.dll"
#func global keybd_event "keybd_event" int, int, int, int
#module
#deffunc aplkey2 int k , int optKey
opt=limit(optKey+15, 16, 18)
if optKey : keybd_event opt, 0, 0, 0
keybd_event k, 0, 0, 0 : keybd_event k, 0, 2, 0
if optKey : keybd_event opt, 0, 2, 0
return
#global
exec "notepad"
wait 100
button gosub "mes",*sp
hbuttonP_A = objinfo(stat, 2)
button gosub "pos",*sp
hbuttonP_B = objinfo(stat, 2)
stop
*sp
switch stat
case 0
pcode="mes"
swbreak
case 1
pcode="pos"
swbreak
swend
input pcode,0,0 : pstc=stat : mesinp= objinfo_hwnd(pstc)
hinputP = objinfo(stat, 2)
objsel obj_p
sendmsg mesinp, $b1, 0, -1 : sendmsg mesinp, $301
gsel 0, -1 : wait 5 : aplkey2 'V', 2 : gsel 0,2
return
て、感じです。
ソースにコメントなくてすみません。許してください_(._.)_ ユルシテ
ただ気になるのは貼り付ける際スクリーンが消えるのが気になってしかたありません。
ハンドルを指定してメッセージとして送れないものでしょうか・・。
長文になりましたがすみません。
その辺ぐぐってみます。
ありがとうございました。
| |
|
2009/10/20(Tue) 10:03:48|NO.28441
aplstr 命令を使った例です。
何にでも送信できるわけでないのが難点です。
最近ブラウザに対して文字列を選択的に送信するものが必要になって、作ったものです。
#include "hspext.as"
#uselib "user32.dll"
#func global GetClassName "GetClassNameA" int,int,int
#func global GetWindowText "GetWindowTextA" int,int,int
#func global WindowFromPoint "WindowFromPoint" int,int
#func global GetParent "GetParent" int
screen 0,480,56,0 : gsel 0,2
font msgothic,16
objsize 64,24
*START_APP
mes "対象のウインドウ内をクリック."
sdim classname,256
sdim windowtitle,256
*SELECT_WINDOW
classname=""
WindowFromPoint ginfo_mx,ginfo_my
hnd = stat
GetClassName hnd,varptr(classname),256
repeat
GetParent hnd
if(stat):hnd=stat:else:break
loop
GetWindowText hnd,varptr(windowtitle),256
stick k,,0
if(k&256){
color 255,255,255:boxf:color 0,0,0:pos 0,0
mes "target:"+windowtitle
mes "class :"+classname
pos 0,ginfo_winy-24:button "ワッショーイ",*ONBUTTONPASTE
pos ginfo_winx-64,ginfo_winy-24:button "対象を選択",*ONBUTTONRESET
goto *WAITING_CLICK
}
wait 10
goto *SELECT_WINDOW
*WAITING_CLICK
stop
*ONBUTTONPASTE
id = stat
aplsel windowtitle,0
if(stat=0){
if (classname=="MozillaWindowClass"):idx=3:else:idx=0
aplobj classname,idx
if(stat=0){
aplstr "ワッショーイ"
stop
}
}
dialog "貼れない",1,"エラー"
stop
*ONBUTTONRESET
clrobj
cls
goto *START_APP
| |
|
2009/10/20(Tue) 10:38:57|NO.28444
タブブラウザ使ってたから問題が起きなかったけど、
よく考えたらこれ 同じタイトルのウインドウ2つ以上開いてたらダメじゃん……orz
やっぱりウインドウハンドル使ってまじめに対象見つけないとダメかな。
およその解説しときますと
*SELECT_WINDOW 〜 *WAITING_CLICK では、WindowsのAPIを利用して クリックした地点に見えているウインドウの、ウインドウタイトル文字列とクラス名(apl***命令で指定するもの)を取得しています。
*ONBUTTONPASTE あたりでは、HSPの apl***命令で目的のウインドウの目的のオブジェクトに文字列を設定しています。
クラス名文字列が"MozillaWindowClass"のときだけ何かしてるのが見えますが、これは対象がFirefoxだったときに同じクラス名のウインドウがいくつかあって、実際のページ表示に使われているものが4番目だったのでこんな風になっています。姑息手段なのであんまりアテにできません。
|
|
2009/10/20(Tue) 17:59:37|NO.28448
おおおぉぉぉ〜〜〜〜〜
まさしくこの動作です!!!!
貼り付ける側の方がチラつかないのがGO!です!!
ありがとうございました!
昨日これに投稿してから色々調べて書いたソースがあるのですが
SendMessageA の部分が実行されません。
#uselib "user32.dll"
#func global SendMessageA "SendMessageA" sptr,sptr,sptr,sptr
#func WindowFromPoint "WindowFromPoint" int,int
sdim mespost //文字列の格納
exec "notepad"//メモ帳を開く
repeat//左クリックを監視
getkey as,1
if as=1 {
WindowFromPoint ginfo(0), ginfo(1)
mes stat
whnd = stat //クリックしたハンドルを取得
break
}
wait 10
loop
wait 100
mespost="できた〜〜〜"
SendMessageA whnd,WM_SETTEXT,0,mespost// <--実行されない orz
stop
参考にしたページは
http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendmessage/
です。
あれこれやってるうちに頭痛くなって未解決のまま寝てしまいましたが、
SendMessageA実行がされません。
ハンドルの取得の仕方がわるいのでしょうか?
それとも根本的に間違ってるのでしょうか・・・orz
力不足=未熟な私ですが研究のためにもご教授お願いします。
|
|
2009/10/20(Tue) 18:19:34|NO.28449
惜しい。
WM_SETTEXT は、HSPのシステム変数の類ではありません。
このスクリプトでは、WM_SETTEXTを定義してませんから、値 0 のただの変数扱いになっています。
#define WM_SETTEXT 0x000C
を、最初あたりに足してください。
|
|
2009/10/20(Tue) 19:00:40|NO.28450
はい・・。
できました^^
ありがとうございます!!!
そこで一つ気が付いたことは APIの SendMessageA を呼び出さなくても
HSPの sendmsg でも 書き込むことができると言うことが分かりました。
#uselib "user32.dll"
#func WindowFromPoint "WindowFromPoint" int,int
#define WM_SETTEXT 0x000C
sdim text // <---文字列の格納 このbuffer はいるの?? いりますよね・・・。
exec "notepad"//メモ帳を開く
repeat//左クリックを監視
getkey as,1
if as=1 {
WindowFromPoint ginfo(0), ginfo(1)
mes stat
whnd = stat //クリックしたハンドルを取得
break
}
wait 10
loop
wait 100
text="できた〜〜〜"
sendmsg whnd, WM_SETTEXT, 0, varptr(text)
stop
て、感じです。
まだまだ未熟ですが先輩方のアドバイスで一つ一つ進歩することができます。
ありがとうございました。
今後ともなにとぞよろしくお願いします。
|
|