|
|
2008/4/16(Wed) 22:51:21|NO.15165
以前同じような質問をしたのですが、今回は別のプログラムを終了した時に
HSP側に終了したことを知らせる事についてお聞きしたいと思います。
repeat命令でウインドウタイトルを取得して在るか無いか調べれば
終了しているかどうか分かるかと思いますが、TOOL目的で使いたいので出来るだけ
repeatは使いたくないのです。
そこで、repeatなどの繰り返し系を使わず上記を実現させることは可能ですか?
宜しくお願いいたします。
|
|
2008/4/17(Thu) 00:12:43|NO.15167
別のプログラムに飛んでくるウィンドウメッセージは普通ほかのプログラムには
飛んでこないのでおそらく無理だと思います
SetTimerで監視する頻度を落とせばCPU使用率は節約できると思います
|
|
2008/4/17(Thu) 00:18:14|NO.15168
その外部アプリが終了した際に、そのアプリケーション自身がWM_USERあたりのメッセージを
送信するか、そのアプリケーションが終了した際にHSPアプリケーションに向けてコマンドラインを付加
させ重複起動し、WM_USERを送信させるあたりの方法しかないと思います。
|
|
2008/4/17(Thu) 00:26:48|NO.15169
返信有難う御座います
やはり無理なんでしょうか?
前回の質問で別のプログラムのウインドウ上にHSPのボタンなどを設置したのですが、
別のプログラムを終了させるとhsp3.exeが残ってしまうので困っています。
別のプログラムが終了すると貼り付けたボタンなどは消えてしまうので、それを利用する手など
ありますでしょうか?
|
|
2008/4/17(Thu) 00:46:24|NO.15170
別のプログラムが HSPで作られたものかつ自作である場合は可能ですよ。
SendMsg hHsp, WM_CLOSE,0,0
これを 操作先HSPプログラムで実行させてください
|
|
2008/4/17(Thu) 01:18:41|NO.15171
>Asさん
hHspってなんでしょう?やってみたら0で何も起きませんでしたし検索しても何もヒットしなかった…
呼び出す先が自作プログラムであればできる、というのであれば、
呼び出し元に対する通知だけして終了するプログラムをひとつ自作しておき、
呼び出し元が外部プログラムを実行するときに、そのプログラムの後に通知プログラムを起動するようなバッチファイルを生成してそれを起動したら、要求する機能はなんとか実現できるような気がします。
|
|
2008/4/17(Thu) 02:42:17|NO.15172
>hHsp
操作元HSPプログラムのハンドルです。
|
|
2008/4/17(Thu) 07:22:56|NO.15173
> 前回の質問で別のプログラムのウインドウ上にHSPのボタンなどを設置したのですが、
> 別のプログラムを終了させるとhsp3.exeが残ってしまうので困っています。
実際どの様なコードを書かれているのか分からないので推測です。
別のプログラムを実行した元のプログラム側のソースコードですが、
oncmd の WM_DESTROY ($2) で end 命令を実行してみてはどうでしょうか?
もし、別のプログラムのウィンドウを親ウィンドウとしているのなら、
WM_DESTROY が別プログラム終了時に送信されているかと思います。
しかし、HSPで作成、実行されたウィンドウに
WM_DESTROYメッセージを送信しても終了されないようです。
( Windows XP / HSP Ver 3.1 )
|
|
2008/4/17(Thu) 21:06:46|NO.15183
有難う御座います
http://hsp.tv/play/pforum.php?mode=all&num=14703
以下begriffさんのスクリプト引用+hiroさん
#uselib "user32.dll"
#cfunc FindWindow "FindWindowExA" int,int,int,int
#func SetParent "SetParent" int,int
#func ShowWindow "ShowWindow" int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#func EnableWindow "EnableWindow" int,int
#func DestroyWindow "DestroyWindow" int
#func MoveWindow "MoveWindow" int,int,int,int,int,int
#func GetWindowRect "GetWindowRect" int,int
exec "notepad.exe"
gsel 0,-1
a=""
b="無題 - メモ帳"
hwnd_= FindWindow(0,0,0,varptr(b))
if hwnd_=0:end
b="EDIT"
hwnd1_= FindWindow(hwnd_,0,varptr(b),0)
dim rect,4
winx=160
;EnableWindow hwnd1_,0
;DestroyWindow hwnd1_
GetWindowRect hwnd1_,varptr(rect)
MoveWindow hwnd1_,winx,0,rect(2)-rect(0)-winx,rect(3)-rect(1),1
bgscr 3,
SetParent hwnd,hwnd_
syscolor 15
boxf
width winx,rect(3)-rect(1),0,0
color
sysfont 17
pos 12,12
objsize 88,21
button "終了",*s
pos ,ginfo_cy+6
mes "これはHSPのウィンドウです。"
pos 6,ginfo_cy+6
objsize winx-6*2,rect(3)-rect(1)-(ginfo_cy+6)-6
str_=""
mesbox str_
oncmd *exit,$2
stop
*s
MoveWindow hwnd1_,0,0,rect(2)-rect(0),rect(3)-rect(1),1
end
*exit
end
これで出来ました。
ウインドウを作らずオブジェクトのみの貼り付けだと旨くいかないようです。
| |
|
2008/4/17(Thu) 21:25:13|NO.15184
解決にしたいのですが、前回の質問でbegriffさんのスクリプトまんま
使わせていただいている状態で、結局最小化して復元すると貼り付けたHSPのウインドウが
消えてしまう不具合が対処できませんでした。
マウスでポイントするとオブジェクトは復活するのですが、mesは一度消えたら復活できません。
repeatで描画処理をすれば消えずに表示されます。しかし上記同様の理由で使わない事が前提です。
新たにスレッド立てるのもどうかと思いますので、このまま続けさせて下さい。
スルーされて構いません。時を見て解決にします。宜しくお願いします。
|
|
2008/4/17(Thu) 22:04:23|NO.15185
一見できてるように見えるスクリプト。
まず、メインの方。
screen 0,160,120,0
cmd="notepad"
gosub *notifyexec
oncmd *notified,WM_NOTIFY
stop
*notifyexec
buf=cmd+"\nnotifier "+hwnd
notesel buf : notesave "runexe.bat"
exec"runexe.bat",2
return
*notified
dialog "メモ帳が終了したことに気がついた.",0
oncmd 0
stop
……で、もうひとつ.
こちらは EXEファイル作成しておくこと。
#packopt name "notifier"
#packopt hide 1
SendMsg int(dir_cmdline), WM_NOTIFY
end
メモ帳を終了させると、メインの方に通知が行きます。
…しかしこんなことするより、間隔大きめにして監視した方がいいなぁ…。
|
|
2008/4/17(Thu) 23:12:58|NO.15187
WM_NOTIFY を送るより、 素直に WM_CLOSE を送信したほうがいいとおもうのですが・・
|
|
2008/4/17(Thu) 23:33:50|NO.15188
>Asさん
要求がHSP側の終了ではなく、外部アプリケーションが終了したことを知ることだったので、WM_CLOSEにはしてませんです。
また、複数起動したりするとメッセージにパラメータが必要になったりします。
…そうすると、Asさんが最初に挙げたWM_USERが妥当な気がしてきました。WM_NOTIFYはおかしいですね。
しかしよく考えたら定義もしないでWM_???なんて書いても中身が 0 じゃん…
|||orz
|
|
2008/4/22(Tue) 22:37:56|NO.15316
あれから色々なAPIで試したのですが、未だに他のウインドウが重なった時
貼り付けたウインドウが消えてしまうバグ?が解決できません。
oncmd *tobu,WM_PAINT
で再描画の時にウインドウをアクティブにしてみたりしたのですが駄目でした。
objselでフォーカスあてれば再表示されますが、他ウインドウの重なり具合で半欠け表示みたいになり、
お粗末です。
良い知恵をお貸しください。お願いします。
|
|
2008/4/22(Tue) 23:11:33|NO.15319
私もひと通り試しましたが、かなり難しいようで…
要するに私が言うのもアレですがお手上げです。^^;
できるかどうかわからないけど、SetWindowLong でメモ帳を子にしてメッセージを受け取れば
いいかも SetParentじゃないのは親になると言うよりはオーナーになるそうです。推奨されてないが
これで(SetWindowLong)親子関係を設定するとウィンドウの中にウィンドウが入ると言うことは起きません。
見た目の変化はありませんが子ウィンドウになります。
間違ってたらスマソ。
|
|
2008/4/23(Wed) 00:08:30|NO.15322
begriffさん、有難うございます。
貴方のおかげでAPIがおおよそ理解できました。サンプルスクリプトが私には打って付けでした。
不要な物が多数(悪く取らないでください)入っていたおかげで、上から下まで調べざるを得なかったからです。
話元に戻して、逆に子にしたとしても貼り付けたい(付けた)ボタン等の挙動は変わりませんでした。
|
|
2008/4/23(Wed) 06:56:50|NO.15327
そうでしたか・・・そもそもプロセスが違いますからねぇ(できている人はいますが
子になったら終了・最大化・最小化のメッセージを受け取れるかなぁっと思いましたが、やはりだめか。
|
|
2008/4/25(Fri) 00:53:33|NO.15360
お騒がせしました。出来ました
最初はメモ帳にボタン貼り付けて、更にメモ帳を子にしてHSPに貼り付けていたので旨くいかなかったみたいです。
#uselib "user32.dll"
#cfunc FindWindow "FindWindowExA" int,int,int,int
#cfunc GetWindowLong "GetWindowLongA" int,int
#cfunc GetMenu "GetMenu" int
#func GetMenuItemRect "GetMenuItemRect" int,int,int,int
#func SetParent "SetParent" int,int
#func MoveWindow "MoveWindow" int,int,int,int,int,int
#func SetWindowLong "SetWindowLongA" int,int,int
#func ShowWindow "ShowWindow" int,int
exec "notepad.exe"
gsel 0
dim rect,4
a="無題 - メモ帳"
hwnd_= FindWindow(0,0,0,varptr(a))
if hwnd_=0:end
a="EDIT"
hm=GetMenu (hwnd_)
hwnd1_= FindWindow(hwnd_,0,varptr(a),0)
SetWindowLong hwnd_,-16,GetWindowLong (hwnd_,-16)-$40C40000
GetMenuItemRect hwnd_,hm,0,varptr(rect)
MoveWindow hwnd_,0,0,640,480,1
MoveWindow hwnd1_,0,30,640,450-rect(3),1
SetParent hwnd_,hwnd
hsp0 = hwnd
bgscr 3,640,30,,0,rect(3)
SetParent hwnd,hsp0
syscolor 15:boxf:color
mes "HSPのウインドウ-bgscr 3"
pos 190,0
objsize 100,30
button "test",*s
stop
*s
dialog "\"bgscr 3\"のボタンが押されました"
stop
もっとスマートな方法がある気がします。有難う御座いました。
| |
|
2008/4/25(Fri) 01:20:07|NO.15361
^^
おもしろいですねぇ
メモ帳に貼ると言うよりは
メモ帳が貼られている ってかんじですね
|
|