- ベストアンサー
ウィンドウを終了させたい・・・
いつもお世話になっています。 画面遷移時にあるメッセージウィンドウ(別exe)をVBから起動させ、遷移が終わった後にそのexeを終了させるプログラムを作っています。 プログラムの中身としては、 (1) Shell関数でexe(メッセージウィンドウ)を起動 (2) FindWindowで、起動しているexeのハンドルを取得 (3) 取得したハンドルに、SendMessageでexeを閉じるようにする(WM_CLOSEを使用)。 ・・・といったものです。 (1)と(2)はうまくいくのですが、最後のSendMessageがうまくいきません(>_<) 試しに(1)と(2)の後に、Do文の中で [1]SendMessageで起動したexeを終了させるようにする [2]FindWindowをして、ハンドルが0だったら、Exit Doする ・・・ようにプログラムしてみたところ、永久ループになってしまいました・・・。 他にも、SendMessageの代わりにShowWindowを使ってみましたが同じくダメでした・・・(T-T) ネットで調べていますが、他の方法が浮かびません。 どなたか、良い方法をご存じでしょうか?? よろしくお願いします!!
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>今までにない現象で、そのユーザーのマシンのみでメッセージウィンドウが閉じないのです。。。 こういう大事なことは先に書いてください。 みなさん、全然動かないと思って回答してますよ。 >まず、問題のマシンはエンドユーザーが使用しているので、直接デバッグはできません。 リモートデバッグも出来ませんか?
その他の回答 (5)
- kaha
- ベストアンサー率23% (41/177)
参考URL: [VB] Win32 アプリケーションを起動させ、終了させる方法 わたしには、よくわかりませんが。検索でヒット。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
まず、PostMessageにしてどうなるか確認してください。 で、CloseしたいアプリはWM_CLOSEメッセージで本当に終了するものですか? 終了しないように組まれているんでしたらとっても意味が無いことをしているような。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>Dim Rtn As Long >(2)Rtn = FindWindow("#32770", "") >今のForm.Hide >次のForm.Show >(3)Call SendMessage(wnRtn, WM_CLOSE, 0&, 0&) クラス名の#32770ですが、一般的なダイアログのクラス名です。これでチェックしても無駄です。たくさんある可能性のほうが多いです。というか、VBのフォームで作った場合、クラス名は違うはずなんですけど。一般的にVBのフォームのウィンドウハンドルを外部から取得する場合はキャプションを使用するしかないはずです。 また、FindWindowの引数の使い方も間違ってます。使用しないほうの引数は、""ではなくvbNullStringです。 あと、根本的なことですが、こんなことするよりも、別EXEをActiveX EXEで作ればこんな苦労することも無いと思いますけど。
補足
FindWindowに関しては、vbNullStringを使ってみましたが、やはり同じ状態でした。 実は、今、新規でメッセージウィンドウを作っているわけではなく、元にあるプログラムの修正をしている状態でなので、新しくexeの作り直しはできないのです・・・。
- hope10
- ベストアンサー率48% (17/35)
基本的な事をお尋ねしますが、その "#32770"クラスのメッセージウィンドウのハンドルは間違いなく正しく捕らえているのでしょうか? 良く見かけるクラス名と思ったので、それで特定して大丈夫なのかと... そのメッセージウィンドウがGUIを持つならば、閉じるメニューが有効になっているのでしょうか? 単純な事なので、任意のメッセージを送れるツール等を使って確認した方が早いと思います。
補足
>基本的な事をお尋ねしますが、その "#32770"クラスのメッセージウィンドウのハンドルは間違いなく正しく捕らえているのでしょうか? この点については、大丈夫です。 試しに、クラス名とハンドルを一緒にチェックするようプログラムで確認しました。 引き続き、ご指導の方お願いします。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>(2) FindWindowで、起動しているexeのハンドルを取得 >(3) 取得したハンドルに、SendMessageでexeを閉じるようにする(WM_CLOSEを使用)。 とりあえず、ここの部分のソースを。 あと、WM_CLOSEはSendじゃなくてPostMessageでPostするもんなんですけど。 どうしてSendMessageで送る人が多いのかなぁ? >他にも、SendMessageの代わりにShowWindowを使ってみましたが同じくダメでした・・・(T-T) ShowWindowは用途が違いますね。
補足
早速のご回答ありがとうございます。 Dim Rtn As Long (2)Rtn = FindWindow("#32770", "") 今のForm.Hide 次のForm.Show (3)Call SendMessage(wnRtn, WM_CLOSE, 0&, 0&) プログラムの流れとしては、このようなカンジです。 引き続きよろしくお願いいたします!!
補足
まず、問題のマシンはエンドユーザーが使用しているので、直接デバッグはできません。 通常PostMessage(引数をWM_CLOSE)をすれば、起動させたメッセージウィンドウは閉じます。 今までにない現象で、そのユーザーのマシンのみでメッセージウィンドウが閉じないのです。。。