• 締切済み

別アプリ終了させる

いつもお世話になります。 再度質問ですが、 A.EXEとB.EXEがあり、B.EXEはA.EXEからShellExecuteで起動させています。 起動したB.EXEからA.EXEを終了させたいのですが、それにはA.EXEの ウィンドウハンドルが必要になると思います。 このときにA.EXEのタイトルは動的に変更されるので、FindWindowは使えません。 そこでA.EXEからB.EXEを起動した時にhWNDを送ってやれば、B.EXEからA.EXEを 操作できるとおもいます。 hWNDを対象アプリに送りたいのですが、ShellExecuteやCreateProcessのパラメータにhWndを持たすことはできるのでしょうか? もたせることができそうですが、具体的にどう記述すればいいのかが わからないので、サンプルソースをつけていただければありがたいです。 見当違いであれば、別の方法をご教授ください。 よろしくお願いします。

みんなの回答

回答No.2

WIN32APIのPostMessage()を使用してはどうでしょうか。  PostMessage(A.EXEのウインドウハンドル,        WM_QUIT,        0,0);

参考URL:
http://www.sainet.or.jp/~eino/database/wwwboard/messages/12373.html
  • alfeim
  • ベストアンサー率58% (114/195)
回答No.1

コマンドライン引数に載せればいいだけでは? itoa()を使って文字列に変換し、CreateProcess()の第2引数に載せ実行後、B.exeのWinMain()の第3引数をatoi()すれば良いかと。まぁ実際はエラートラップルーチンは必要でしょうが・・・

関連するQ&A

  • 別アプリを終了する方法

    A.EXE と B.EXEがあったとします。 A.EXEからShellExecuteアプリケーションB.EXEを立ち上げたとします。 その時にA.EXEを終了せずにB.EXEの処理が終わり次第、B.EXEからA.EXEを、 終了させたいのですが、可能でしょうか? いろいろと調べてみたのですが、見当がつきません。 どなかたご教授願えませんでしょうか? ちなみにVC++6.0MFCです。

  • 別アプリを終了させる

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

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

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

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

    VC++にて 以下でメモ帳を起動することが出来ました。 ::WinExec(_T("notepad.exe"),SW_SHOW); こんどは、CreateProcess()でメモ帳を起動したいのですがどう書けば良いのですか? また、メモ帳を終了させるにはどう記述すれば良いのでしょうか? よろしくお願いします。

  • 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"と変えれば警告は消えます. よろしくお願いします.

  • 他アプリの起動

    builderC++を使用してます。 sample.exeを起動した際にもう一つの他アプリ(sample2.exe)を起動させ、 sample.exeを終了した際に一緒に起動したsample2.exeも終了させるコードはどういう風に書けばよろしいですか? WindowsAPIのCreateProcessを使い起動させようとしてます。 ご教授お願いします。

  • createprocessで起動させる別.exeをモーダルで起動したい

    createprocessで起動させる別.exeをモーダルで起動したい お世話になります。 VC++6.0 MFCで開発しております。 現在A.exeのあるボタンを押すとcreateprocessでB.exeを起動させるようにしております。 B.exeを起動後、A.exeの画面表示をクリックするとA.exeがアクティブになるのです。 それを、B.exeが終了しないとA.exeがアクティブにならないように変更したいのですがどのようにすればよいでしょうか? 現状は PROCESS_INFORMATION pi; STARTUPINFO si; si.cb=sizeof(si); CreateProcess(実行EXEパス,コマンドライン,NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); で起動しております。 また、実現不可能というお答えでもいいので教えていただければと思います。 お手数ですが何卒よろしくお願いします。

  • CreateProcessでアプリが終了しない

    ちょっとした変換ツールを作ろうと思い、ダイアログベースの MFCアプリケーションを作成しました。 OKボタンが押された時にCreateProcess()で子プロセスを 起動して、終了したら結果表示して親プロセスも終了する 様にしようと思ったのですが、結果表示までは正常に 実行されるのですが、親プロセスが終了しません。 恐らくCreateProcess()に渡す引数が悪いのだと思うのですが、 どなたかわかる方がいらしたらご教示願います。 void CMscGenSelectorDlg::OnBnClickedOk() {   STARTUPINFO si;   PROCESS_INFORMATION pi;   ZeroMemory( &si, sizeof si );   si.cb = sizeof si;   ZeroMemory( &pi, sizeof pi );   // 子プロセス起動   CreateProcess(     NULL,                // モジュール名     _T("mscgen.exe -Tpng hoge.msc"),  // コマンドライン     NULL,                // セキュリティ記述子     NULL,                // セキュリティ記述子     FALSE,               // ハンドルの継承オプション     0,                 // 作成のフラグ     NULL,                // 新しい環境ブロック     NULL,                // カレントディレクトリ名     &si,                // スタートアップ情報     &pi);                // プロセス情報   // 子プロセス終了待ち   WaitForSingleObject( pi.hProcess, INFINITE );   CloseHandle( pi.hProcess );   CloseHandle( pi.hThread );   // シーケンスチャート表示   ShellExecute( NULL, _T("open"), _T("hoge.png"), NULL, NULL, SW_SHOW );   // 終了   OnOK(); }

  • 任意のIEにリンクを指定したいです

    2つのIEが起動しており、そのうち指定するIEの方にリンク先を上書きする方法をご教授頂ければと思います。 環境はVisual C++ 2005 Express Editionのwin32コンソールで作成しています。 IEを起動する方法として、FindWindow関数で上書きしたいIEのウィンドウ名のハンドルを取得し、ShellExecute関数でそのハンドルにリンク先を指定する方法を取っています。 下記は作成したプログラムです。 確かに指定したウィンドウ名を参照し、hWndにNULL以外の値が入っておるのですが、URLを上書きするウィンドウが指定したウィンドウではなく、最後に起動したIEのウィンドウに表示されてしまいます・・・。 説明べたなので例を示します・・・。以下のような動作になります。 (1)作成したプログラムからIEを起動する。ウィンドウ名:test - Windows Internet Explorer (2)デスクトップから新規にIEを起動する。ウィンドウ名:yahoo - Windows Internet Explorer (3)もう一度作成したプログラムからIEを起動すると、(2)で起動したIEに上書きしてしまう。本当は(1)に上書きしたいのに・・・。 また、ShellExecuteの第一引数はそのハンドルを持つウィンドウを差していると認識しているのですが、違いますでしょうか? /////////////////////////////////////////////////// HWND hWnd = FindWindow( NULL, "ウィンドウ名") ); if ( hWnd != NULL ) {   ShellExecute( hWnd, "Open", URL, NULL, NULL, SW_SHOW ); } else {   ShellExecute( NULL, "Open", "IExplore",​ URL, NULL, SW_SHOW ); } ///////////////////////////////////////////////////

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

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