|
|
|
2008/12/6(Sat) 23:36:05|NO.21327
HSP初心者です。
コピーや貼り付けなどの操作を自動でしてみたいと思い、プログラムを組んで見たのですが、
どうせなら、クリップボードの中身も監視したいと思い、mesboxに表示させることにしました。
使い方は、マウスで対象物をドラックしてから、コピーを押すとクリップボードに対象物がコピーされます。
詳細モード表示中にコピーを押すと、クリップボードの中身とmesboxの中身が変わる・・・ように
組んだつもりなのですが、何故か2回コピーボタンを押さなければ更新されません。
#uselib "user32.dll"
#cfunc GetForegroundWindow "GetForegroundWindow"
#func SetForegroundWindow "SetForegroundWindow" int
#func keybd_event "keybd_event" int, int, int
#include "clipboard.hsp"
sdim moji,2000
*def
screen 0,200,180
gsel 0,2
objsize 100,80
if aa=null :aa=""
button gosub "コピー",*copy
pos 100,0
button gosub "ペースト",*pest
pos 0,80
button gosub "切り取り",*kiritori
pos 100,80
button gosub "元に戻す",*motoni
pos 0,160
objsize 200,20
button gosub ">>>詳細オプション(兼更新)",*syousai
gosub *main
repeat
wait 1
loop
stop
*main
if a=0 {
repeat
// そのときアクティブなウィンドウのハンドルを取得する
hWnd_active = GetForegroundWindow()
a=0
wait 150
loop
}
return
*syousai
screen 0,450,180
gsel 0,2
if aa=null :aa=""
Clipget c
if c=null : aa="" :else : Clipget aa
objsize 100,80
button gosub "コピー",*ccopy
pos 100,0
button gosub "ペースト",*pest
pos 0,80
button gosub "切り取り",*kiritori
pos 100,80
button gosub "元に戻す",*motoni
pos 0,160
objsize 200,20
button gosub "<<<詳細オプション",*def
pos 250,0
Clipget aa
mesbox aa,150,40,0
pos 200,10
mes "現在:"
pos 400,0
objsize 50,40
button gosub "コピー",*acopy
gosub *main
stop
*copy
a=1
SetForegroundWindow hWnd_active
keybd_event 17
keybd_event 67
keybd_event 17,,2
keybd_event 67,,2
return
*pest
a=1
SetForegroundWindow hWnd_active
keybd_event 17
keybd_event 86
keybd_event 17,,2
keybd_event 86,,2
return
*kiritori
a=1
SetForegroundWindow hWnd_active
keybd_event 17
keybd_event 88
keybd_event 17,,2
keybd_event 88,,2
return
*motoni
a=1
SetForegroundWindow hWnd_active
keybd_event 17
keybd_event 90
keybd_event 17,,2
keybd_event 90,,2
return
*ccopy
a=1
SetForegroundWindow hWnd_active
keybd_event 17
keybd_event 67
keybd_event 17,,2
keybd_event 67,,2
gsel 0,2
clrobj 5,5
pos 250,0
Clipget aa
mesbox aa,150,40,0
pos 250,0
SetForegroundWindow hWnd_active
return
*acopy
Clipset aa
return
モジュールは、 http://f17.aaa.livedoor.jp/~takasoft/Programer/HSP_module/clip.htmを使わせてもらっています。
解決できる方がいらっしゃったらご教授くださいm(_ _)m
| |
|
2008/12/7(Sun) 06:57:44|NO.21332
>何故か2回コピーボタンを押さなければ更新されません。
Ctrl+Cを押している時間が短すぎます。waitを入れましょう。
起動して31回ほど「詳細オプション」ボタンを押すとエラーが起きます。
何でもかんでもgosubにすればいいというものではありません。
clipboard.hspのClipgetには、クリップボードがテキストで
なおかつ空のとき、エラーが起きるというバグがあります。
|
|
2008/12/7(Sun) 14:09:02|NO.21346
ラベルジャンプ処理があっち行ったりこっち行ったりで無駄が多いです。(^^;
↓に注意して、一から書き直したほうがいいカモ
・screen命令を呼ぶのは一度だけ。
(ウィンドウの表示サイズを変更 → width命令)
・オブジェクトの設置も一度だけ。
(オブジェクトの中身を変更 → objprm命令)
|
|
2008/12/7(Sun) 19:14:12|NO.21378
>ANTARESさん
なるほど、waitを入れれば良いのですね。ありがとうございます。
wait 10を入れると、正常に動きました。
wait 1を入れても動かなかったので、そこを原因から完全に消去していたので、だめだったようです。
gosub命令は、行って帰ってくる命令なのですね。
button gosub ">>>詳細オプション(兼更新)",*syousai
などのところを、
button gosub ">>>詳細オプション(兼更新)",*syousai
こうしたらエラーが出ませんでした!ありがとうございます。
>クリップボードがテキストでなおかつ空のとき、エラーが起きるバグ
これは、クリップボードがテキストで空のときに、代理として" "(半角スペース)
などをクリップボードに入れることで回避可能でしょうか?
>Kpanさん
効率の悪いプログラムになっていますね^^;反省します。。
最初はobjprm命令を使っていたのですが、うまくmesboxの内容が更新されないようなので、
いったん消去してもう一度書き直したらうまくいくかなぁと思ってclrobj命令を使っていました。
治ったみたいなので、objprm命令に戻しました。
screen命令をwidth命令で書き直すと、どうも<<<詳細オプションボタンが機能しなくなってしまうのですが、
改善可能ですか?可能でしたら教えてください。m(_ _)m
<略>
//最初に初期化
screen 0,450,180
*def
//screen 0,200,180
width 200,180
<略>
*syousai
//screen 0,450,180
width 450,180
<略>
後の部分は変えていません。
|
|
2008/12/7(Sun) 20:26:09|NO.21381
たとえば、こんな感じで組んでみてください。
screen 0, 400, 200
width 200, 200
pos 0, 0
button gosub "", *change
sdim buf, 8096
pos 300, 0
mesbox buf, 100, 50
// 必要なオブジェクトはここまでに全部設置する
repeat
wait 50
// ここに監視する処理
loop
*change
if check {
width 200, 200
} else {
width 400, 200
}
// 0 or 1のスイッチ
check ^ 1
return
|
|
2008/12/7(Sun) 22:35:35|NO.21390
>Kpanさん
ありがとうございます。
オブジェクトなどは最初に配置して、変更するときにobjprmを使えば良いのですね。
おかげでプログラムが簡潔に&早くなりました。これで解決とさせていただきます。
また、Clipgetのバグは、clipboard.hspをイングルードするのではなく、hspext.asをイングルードすることで
なくなりました。Kpanさん、ANTARESさん、ありがとうございました。
#uselib "user32.dll"
#cfunc GetForegroundWindow "GetForegroundWindow"
#func SetForegroundWindow "SetForegroundWindow" int
#func keybd_event "keybd_event" int, int, int
#include "hspext.as"
screen 0, 450, 180
gsel 0,2
width 200, 180
namae=">>>詳細オプション"
pos 0, 0
objsize 100,80
button gosub "コピー",*copy
pos 100,0
button gosub "ペースト",*pest
pos 0,80
button gosub "切り取り",*kiritori
pos 100,80
button gosub "元に戻す",*motoni
pos 0,160
objsize 200,20
button gosub namae,*change
pos 400,0
objsize 50,43
button gosub "コピー",*acopy
sdim buf, 8096
dhWnd_active = GetForegroundWindow()
pos 250,0
Clipget buf
mesbox buf,150,43,0
pos 200,11
mes "現在:"
// 必要なオブジェクトはここまでに全部設置する
repeat
chWnd_active = GetForegroundWindow()
if dhWnd_active != cWnd_active {
hWnd_active = chWnd_active
}
// ここに監視する処理
wait 50
loop
*change
if check {
width 200, 180
namae=">>>詳細オプション"
objprm 4,namae
} else {
width 450, 180
namae="<<<詳細オプション"
objprm 4,namae
}
// 0 or 1のスイッチ
check ^ 1
return
*copy
SetForegroundWindow hWnd_active
keybd_event 17
keybd_event 67
wait 20
keybd_event 17,,2
keybd_event 67,,2
Clipget buf
objprm 6,buf
return
*pest
a=1
SetForegroundWindow hWnd_active
keybd_event 17
keybd_event 86
wait 20
keybd_event 17,,2
keybd_event 86,,2
return
*kiritori
a=1
SetForegroundWindow hWnd_active
keybd_event 17
keybd_event 88
wait 20
keybd_event 17,,2
keybd_event 88,,2
Clipget buf
objprm 6,buf
return
*motoni
a=1
SetForegroundWindow hWnd_active
keybd_event 17
keybd_event 90
wait 20
keybd_event 17,,2
keybd_event 90,,2
return
*acopy
Clipset buf
return
これからも、良いソフトができるよう、頑張ります!
| |
|
2008/12/8(Mon) 00:49:54|NO.21396
>これは、クリップボードがテキストで空のときに、代理として" "(半角スペース)
>などをクリップボードに入れることで回避可能でしょうか?
Clipgetを使わずにそんなことできないでしょう。
最初に書いておけばよかった。
hRetText=GlobalLock(hMemText)
if (lstrlen(hRetText)) {
dupptr dRetText,hRetText,lstrlen(hRetText),2
RetText=dRetText
} else {
RetText=""
}
GlobalUnLock(hMemText)
>また、Clipgetのバグは、clipboard.hspをイングルードするのではなく、
>hspext.asをイングルードすることでなくなりました。
ほかにもバグがあるかもしれないので、それでいいのなら
その方が安全でしょう。
|
|
2008/12/8(Mon) 02:43:14|NO.21401
オブジェクトIDについて、せっかくなのでちょっとTIPSを書き添えときます。
オブジェクトを配置すると、そのオブジェクトのオブジェクトIDが、システム変数 stat に代入されます。
そこで、
sdim message,1024
button "1", *onbutton1 : objid_btn1 = stat
button "2", *onbutton2 : objid_btn2 = stat
mesbox message, 480,64, 0, 1000 : objid_mes = stat
stop
*onbutton1
btn="pushed."
objprm objid_btn1, btn
message += "button1 pushed.\n"
objprm objid_mes, message
stop
*onbutton2
btn="pushed."
objprm objid_btn2, btn
message += "button2 pushed.\n"
objprm objid_mes, message
stop
……のように、オブジェクトを配置するときに必ずシステム変数 stat から オブジェクトID を取得するようにしておくと、後でオブジェクトの追加や削除、並べ替えがとってもラクになります。
上のサンプルでは、オブジェクトを並べ替えても それ以外の変更は発生しませんね。
逆に、objprm 命令にオブジェクトIDを直接数字で指定していると、
オブジェクト配置命令を追加または削除したとき、それ以降に配置しているオブジェクトのオブジェクトIDが全部ズレてしまいます。当然、スクリプト内の objprm 命令を全部書き換える羽目になります。
また、[Tab]キーでのフォーカス移動の順序はオブジェクト配置命令の順序と同じです。これを並べ替えなんかしたくなったらえらい手間です。
そして、変更の手間や範囲が大きいことは、変更漏れや間違いによってバグが発生する絶好の機会になります。
#
オブジェクト配置命令のHELPに、「配置したオブジェクトのオブジェクトIDがstatに代入される」ことが書いてあってもいいような気がするなぁ…。
|
|