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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0416
jill外部アプリについて18解決


jill

リンク

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使用率は節約できると思います



As

リンク

2008/4/17(Thu) 00:18:14|NO.15168

その外部アプリが終了した際に、そのアプリケーション自身がWM_USERあたりのメッセージを
送信するか、そのアプリケーションが終了した際にHSPアプリケーションに向けてコマンドラインを付加
させ重複起動し、WM_USERを送信させるあたりの方法しかないと思います。



jill

リンク

2008/4/17(Thu) 00:26:48|NO.15169

返信有難う御座います

やはり無理なんでしょうか?
前回の質問で別のプログラムのウインドウ上にHSPのボタンなどを設置したのですが、
別のプログラムを終了させるとhsp3.exeが残ってしまうので困っています。

別のプログラムが終了すると貼り付けたボタンなどは消えてしまうので、それを利用する手など
ありますでしょうか?



As

リンク

2008/4/17(Thu) 00:46:24|NO.15170

別のプログラムが HSPで作られたものかつ自作である場合は可能ですよ。


SendMsg hHsp, WM_CLOSE,0,0


これを 操作先HSPプログラムで実行させてください



SYAM

リンク

2008/4/17(Thu) 01:18:41|NO.15171

>Asさん
hHspってなんでしょう?やってみたら0で何も起きませんでしたし検索しても何もヒットしなかった…

呼び出す先が自作プログラムであればできる、というのであれば、
呼び出し元に対する通知だけして終了するプログラムをひとつ自作しておき、
呼び出し元が外部プログラムを実行するときに、そのプログラムの後に通知プログラムを起動するようなバッチファイルを生成してそれを起動したら、要求する機能はなんとか実現できるような気がします。



As

リンク

2008/4/17(Thu) 02:42:17|NO.15172

>hHsp

操作元HSPプログラムのハンドルです。



hiro

リンク

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 )



jill

リンク

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

これで出来ました。
ウインドウを作らずオブジェクトのみの貼り付けだと旨くいかないようです。



jill

リンク

2008/4/17(Thu) 21:25:13|NO.15184

解決にしたいのですが、前回の質問でbegriffさんのスクリプトまんま
使わせていただいている状態で、結局最小化して復元すると貼り付けたHSPのウインドウが
消えてしまう不具合が対処できませんでした。
マウスでポイントするとオブジェクトは復活するのですが、mesは一度消えたら復活できません。
repeatで描画処理をすれば消えずに表示されます。しかし上記同様の理由で使わない事が前提です。

新たにスレッド立てるのもどうかと思いますので、このまま続けさせて下さい。
スルーされて構いません。時を見て解決にします。宜しくお願いします。



SYAM

リンク

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

メモ帳を終了させると、メインの方に通知が行きます。


…しかしこんなことするより、間隔大きめにして監視した方がいいなぁ…。



As

リンク

2008/4/17(Thu) 23:12:58|NO.15187

WM_NOTIFY を送るより、 素直に WM_CLOSE を送信したほうがいいとおもうのですが・・



SYAM

リンク

2008/4/17(Thu) 23:33:50|NO.15188

>Asさん
要求がHSP側の終了ではなく、外部アプリケーションが終了したことを知ることだったので、WM_CLOSEにはしてませんです。
また、複数起動したりするとメッセージにパラメータが必要になったりします。
…そうすると、Asさんが最初に挙げたWM_USERが妥当な気がしてきました。WM_NOTIFYはおかしいですね。

しかしよく考えたら定義もしないでWM_???なんて書いても中身が 0 じゃん…
|||orz



jill

リンク

2008/4/22(Tue) 22:37:56|NO.15316

あれから色々なAPIで試したのですが、未だに他のウインドウが重なった時
貼り付けたウインドウが消えてしまうバグ?が解決できません。
oncmd *tobu,WM_PAINT

で再描画の時にウインドウをアクティブにしてみたりしたのですが駄目でした。 objselでフォーカスあてれば再表示されますが、他ウインドウの重なり具合で半欠け表示みたいになり、 お粗末です。 良い知恵をお貸しください。お願いします。



begriff

リンク

2008/4/22(Tue) 23:11:33|NO.15319

私もひと通り試しましたが、かなり難しいようで…
要するに私が言うのもアレですがお手上げです。^^;

できるかどうかわからないけど、SetWindowLong でメモ帳を子にしてメッセージを受け取れば
いいかも SetParentじゃないのは親になると言うよりはオーナーになるそうです。推奨されてないが
これで(SetWindowLong)親子関係を設定するとウィンドウの中にウィンドウが入ると言うことは起きません。
見た目の変化はありませんが子ウィンドウになります。

間違ってたらスマソ。



jill

リンク

2008/4/23(Wed) 00:08:30|NO.15322

begriffさん、有難うございます。
貴方のおかげでAPIがおおよそ理解できました。サンプルスクリプトが私には打って付けでした。
不要な物が多数(悪く取らないでください)入っていたおかげで、上から下まで調べざるを得なかったからです。

話元に戻して、逆に子にしたとしても貼り付けたい(付けた)ボタン等の挙動は変わりませんでした。



begriff

リンク

2008/4/23(Wed) 06:56:50|NO.15327

そうでしたか・・・そもそもプロセスが違いますからねぇ(できている人はいますが
子になったら終了・最大化・最小化のメッセージを受け取れるかなぁっと思いましたが、やはりだめか。



jill

リンク

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

もっとスマートな方法がある気がします。有難う御座いました。



begriff

リンク

2008/4/25(Fri) 01:20:07|NO.15361

^^
おもしろいですねぇ
メモ帳に貼ると言うよりは
メモ帳が貼られている ってかんじですね



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