• ベストアンサー

ウィンドウを終了させたい・・・

いつもお世話になっています。 画面遷移時にあるメッセージウィンドウ(別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) ネットで調べていますが、他の方法が浮かびません。 どなたか、良い方法をご存じでしょうか?? よろしくお願いします!!

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.6

>今までにない現象で、そのユーザーのマシンのみでメッセージウィンドウが閉じないのです。。。 こういう大事なことは先に書いてください。 みなさん、全然動かないと思って回答してますよ。 >まず、問題のマシンはエンドユーザーが使用しているので、直接デバッグはできません。 リモートデバッグも出来ませんか?

その他の回答 (5)

  • kaha
  • ベストアンサー率23% (41/177)
回答No.5

参考URL: [VB] Win32 アプリケーションを起動させ、終了させる方法 わたしには、よくわかりませんが。検索でヒット。

参考URL:
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B129797
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

まず、PostMessageにしてどうなるか確認してください。 で、CloseしたいアプリはWM_CLOSEメッセージで本当に終了するものですか? 終了しないように組まれているんでしたらとっても意味が無いことをしているような。

hemakozo
質問者

補足

まず、問題のマシンはエンドユーザーが使用しているので、直接デバッグはできません。 通常PostMessage(引数をWM_CLOSE)をすれば、起動させたメッセージウィンドウは閉じます。 今までにない現象で、そのユーザーのマシンのみでメッセージウィンドウが閉じないのです。。。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>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で作ればこんな苦労することも無いと思いますけど。

hemakozo
質問者

補足

FindWindowに関しては、vbNullStringを使ってみましたが、やはり同じ状態でした。 実は、今、新規でメッセージウィンドウを作っているわけではなく、元にあるプログラムの修正をしている状態でなので、新しくexeの作り直しはできないのです・・・。

  • hope10
  • ベストアンサー率48% (17/35)
回答No.2

基本的な事をお尋ねしますが、その "#32770"クラスのメッセージウィンドウのハンドルは間違いなく正しく捕らえているのでしょうか? 良く見かけるクラス名と思ったので、それで特定して大丈夫なのかと... そのメッセージウィンドウがGUIを持つならば、閉じるメニューが有効になっているのでしょうか? 単純な事なので、任意のメッセージを送れるツール等を使って確認した方が早いと思います。

hemakozo
質問者

補足

>基本的な事をお尋ねしますが、その "#32770"クラスのメッセージウィンドウのハンドルは間違いなく正しく捕らえているのでしょうか? この点については、大丈夫です。 試しに、クラス名とハンドルを一緒にチェックするようプログラムで確認しました。 引き続き、ご指導の方お願いします。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

>(2) FindWindowで、起動しているexeのハンドルを取得 >(3) 取得したハンドルに、SendMessageでexeを閉じるようにする(WM_CLOSEを使用)。 とりあえず、ここの部分のソースを。 あと、WM_CLOSEはSendじゃなくてPostMessageでPostするもんなんですけど。 どうしてSendMessageで送る人が多いのかなぁ? >他にも、SendMessageの代わりにShowWindowを使ってみましたが同じくダメでした・・・(T-T) ShowWindowは用途が違いますね。

hemakozo
質問者

補足

早速のご回答ありがとうございます。 Dim Rtn As Long (2)Rtn = FindWindow("#32770", "") 今のForm.Hide 次のForm.Show (3)Call SendMessage(wnRtn, WM_CLOSE, 0&, 0&) プログラムの流れとしては、このようなカンジです。 引き続きよろしくお願いいたします!!

関連するQ&A

  • visualstudioについて

    visualstudio2008 c++でアプリケーションを作っているのですが, 画像のようなアプリケーションを起動させ, HWND hWnd = ::FindWindow(NULL,"D:\アプリケーション.exe"); ::SendMessage(hWnd,WM_SETFOCUS,0,0); としたのですが,ウィンドウハンドルを取得できていないみたいで,SendMessageが働いていません. また,HWND hWnd = ::FindWindow(NULL,"D:\アプリケーション.exe");の行のところで warning C4129: '' :とエラーがでているのですがどうしてでしょうか? 一応"D:\\アプリケーション.exe"と変えれば警告は消えます. よろしくお願いします.

  • エクスプローラの終了と再起動をするには?

    プログラムから『エクスプローラ』を一度終了して、再び起動させる方法を探しています。 私の考えでいくと WM_CLOSE というメッセージを送れば『エクスプローラ』を一度終了させられると 思っていますが、そのためにはウインドウ・ハンドルが必要ですよね。 問題はどうやって『ウインドウ・ハンドル』を取得するかということです。 ここの部分がよく分からないため質問します。 『エクスプローラ』を終了すべく大本の『エクスプローラ』のウインドウ・ハンドルを どうやって取得すればよいのか、ご存知の方がいましたら私に教えてくれませんか? また、WM_CLOSE メッセージ以外でもっとよい方法や、別の方法があれば複数の方法を より多く知りたいと思っていますので、たくさんのアイデア(終了と再起動)などを 教えて下さい。また、再起動は単に『エクスプローラ』を起動すればよいのですよね? よろしくお願いします。

  • 別アプリを終了させる

    以前にも同様の質問をさせていただいたのですが、 再度質問です。 A.EXEとB.EXEがあったとします。 B.EXEからA.EXEを終了させたい。 そこで、FindWindowでA.EXEのウィンドウハンドルを ゲット。 その後、WM_CLOSEメッセージを送るという流れなのですが、 どうも、終了する時と終了しない時があります。 1回目は必ず、終了させる事ができず、2回目以降は 終了します。 原因がわからず、困っております。 なにか良い解決策などがございましたら、ご教授ください。 よろしくお願い致します。

  • ウィンドウハンドルの取得方法

    ダイアログの表示されないEXEを起動させて、FindWindowを使用してそのEXEのウィンドウハンドルを取得したいのですが上手くいきません・・。 FindWindowの第一引数は「ウィンドウのクラス名」を指定するようなのですが、「ウィンドウのクラス名」の意味が良くわかりません。第二引数は「ウィンドウ名」を指定するようなのですが、今回のようなアンダーグラウンドで動くEXEには「ウィンドウ名」は無いと思ってよいのでしょうか? ちなみにダイアログのあるEXEならウィンドウハンドルを取得できます。 お分かりの方がいらっしゃれば、ご教授願います。

  • 別アプリの終了について

    いつもお世話になります。 開発環境はVC++6.0MFCです。 以前にも質問させていただいたのですが、 A.EXEとB.EXEがあったとします。 A.EXEをB.EXEから終了させたい。 しかし、A.EXEのタイトル(キャプション)は動的に 変更があり、タイトルNULLの時もある。 私はFindWindowでウィンドウハンドルを取得し、WM_CLOSE を投げているのですが、この方法だと上記理由により、 不正動作になります。 どなたかこういう場合の解決方法をご存知の方、 ご教授よろしくお願い致します。

  • 他のアプリの表示、非表示について

    他のアプリケーション(アプリA)をコントロールするプログラムを作っています。アプリAと自作アプリは起動したままです。自作アプリでボタンを押すとアプリAを表示させてアクティブにして仕事をさせ、終わったら非表示にします。 アプリAのハンドルをhandle = FindWindow()で取得して ShowWindow(handle,SW_SHOWNORMAL)で表示して、 ShowWindow(handle,SW_HIDE);で隠しています。 ボタンを押したときに、アプリAが表示されていると、非表示にしたあとタスクバーのアプリを手動で表示できません。 MINIMIZEやCloseWindos()も試しましたが、それだと画面の左下にアプリAが残ってしまいます。 SendMessage(handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);も試しましたがうまくいきません。使い方が悪いのかもしれません。 アプリAを隠す事と元のサイズで表示する。という二つの動作をプログラムで交互に行う場合に、途中で手動でアプリAの最小化、あるいはタスクバーから出すという動作をさせることができるのが希望です。どうすればよいでしょうか。 OSはXPです。

  • textboxに文字列を挿入したい。

    すみません。 質問があります。 VB6.0 windows2000 AファイルのFormの中にtextBoxを作成します。 BファイルにsendMessageAPIを使ってAファイルのTextBoxに文字列を送りたいのですが、うまくいきません。 sendMessage(hWnd,WM_SETTEXT,0,"テスト") FindWindowを使って、hWndのハンドルを取得したいのですが、うまくいきません。 他にハンドルの取り方ってあるのでしょうか? また、sendMessageのだい4引数は文字列を挿入しても文字化けを起こします。どうしてかよくわかりません。 どうしてもうまくいかないのですみませんが、ご存知の方いたら教えてください。

  • vbaから他のアプリを終了

    エクセルVBAから他のアプリを終了するマクロを書きたいのですが、途中で行き詰ってます。 Sub test() Dim h As Long h = FindWindow(vbNullString, "タイトル") Call SendMessage(h, 0, 0, "ALT+{F4}") End Sub FindWindowでハンドルを取得してALT+F4を送ればいいじゃないかと思ってますが ALT+F4の送り方がわかりません。どなたか教えてください。 また、ほかに良い方法があれば併せてご提案くださると幸甚です。 よろしくお願いします。 -- エクセル2003

  • Windowsの終了について

    私はWindows XP SP2 を利用している者です。 最近、Windowsを終了しようとすると、「Tea Timer.exe」が立ち上がり、しばらくの間何やら作業を行った後で、次のメッセージを送ってきます。 「このプログラムは応答していません。Windowsに戻って、プログラムの状態を確認するには、[キャンセル]をクリックしてください。  プログラムを終了した場合は、保存されてないデーターが失われる可能性があります。直ちに終了するには[すぐに終了]をクリックしてください。」 私は[すぐに終了]をクリックします。すると無事に終了してくれます。 私の質問は、このプログラムとは何を指すのか? ということです。終了前には、すべてのプログラムを私は終了しています。だから、このプログラムとは、EXPLORERのことなのかな、と推測します。 もう一つ教えてほしいのは、私はそのメッセージが出た後で、つねに[すぐに終了]をクリックして、終了させているのですが、その作業を毎回するのは邪魔くさいので、これを回避する方法はないかということです。以前はこんなこともなく、スムースに終了していたのですが…。OSが不安定・不調になりかけているのでしょうか。 お分かりの方に、アドバイスをお願いします。

  • ウィンドウアプリが思うように動かない(GetWindowTextの使い方?)

    プログラミング初心者です。Windows XP, Visual Studio 2005 PE 使用。MFCは使わない(というより使い方がわからない…)。 簡単なウィンドウプログラムを作っています。エディットボックス1つとボタン1つを含むもので、ボタンを押すとエディットボックスの文字列を取得して、もしそれが close であればプログラムを終了するようにしたいんです。 自分で書いたコードの一部(プロシージャのみ)を以下に載せます。WM_CREATE、WM_DESTROYメッセージは省略。edit1はエディットボックスのハンドル、case式の2はボタンの子ウィンドウIDです。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ char lpString[6]; switch(msg){ case WM_COMMAND: switch(LOWORD(wParam)) { case 2: GetWindowText(edit1,lpString,6); if(lpString == "close") SendMessage(hWnd, WM_CLOSE, 0, 0); else SendMessage(edit1, WM_CLEAR, 0, 0); return 0; } return 0; default : return DefWindowProc(hWnd,msg,wParam,lParam); } return 0; } Visual Studioではちゃんとビルドしてくれるんですが、いざ実行してcloseと入力した上でボタンを押してもうんともすんとも言いません。原因は何でしょうか?素人ながらlpStringをそのまま取り出して使用してるのがまずいのではと思いますが、関数の使い方がわからず対処に困っています。教授いただければ幸いです。

専門家に質問してみよう