• ベストアンサー

対象のアプリケーションが終了するまで起動し続ける

WaitForSingleObjectを使って対象のアプリケーションが終了するまで 無限ループして対象のアプリケーションが終了したら無限ループを 抜ける事はできるでしょうか?あまりWaitForSingleObjectを理解していないので 意味がわからない質問かもしれませんが、よろしくお願いします。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.4

>補足にかけなかったのですがfor(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) { >でfor文のループを回したらGetAsyncKeyStateを使えますが1秒で終了してしまいます で、今はどう書いているんです? # まぁ、内容がアレなのでforループではなくwhileループでもいいんですけどね。 while(WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT) {  //終了待ちの間に実行したい処理(間隔はWaitForSingleObject()の第2引数の値次第) } って感じですかねぇ。

nahe1112
質問者

お礼

すみませんでした。 1秒で終了するのは書き間違えでした。 うまく対象のアプリケーションが終了するまで起動して GetAsyncKeyStateを使えるようになりました。 本当に感謝です(^^) またお世話になるかもしれませんがその時は、よろしくお願い致します。m(__)m

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.3

>WaitForSingleObject()を使って対象のアプリケーションが終了するまでProgramを実行することは出来るようになったのですが >待機している間GetAsyncKeyStateを使ってF1を押すとMessageが出るようにすることは可能ですか? >考えたプログラムは↓のようにしたのですがダメでした。 そりゃ、指定したプロセスが終了(シグナル状態)になるまでWaitForSingleObject()から戻って来ません(INFINITE=無限待ち)から無理ですわな。 WaitForSingleObject()の第2引数を指定して、ループで回すようにすることで対処できるでしょう。 具体的な例は回答済みですけどね。 #1のコードだと終了までの間、おおよそ1秒毎に"."が表示されるようになってます。 # ちなみに、MessageBox()だと表示中に終了された場合はすぐに検出できませんよ。

nahe1112
質問者

お礼

補足にかけなかったのですがfor(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) { でfor文のループを回したらGetAsyncKeyStateを使えますが1秒で終了してしまいますGetAsyncKeyStateを使えてなおかつ対象のアプリケーションが終了するまでプログラムを実行するにはどうしたらよいでしょうか?

nahe1112
質問者

補足

とても丁寧に説明していただきありがとうございます(^^) ですが無知すぎて申し訳ないのですが >>WaitForSingleObject()の第2引数を指定して、ループで回すようにすることで対処できるでしょう。 WaitForSingleObject(hProcessHandle,○○○) ○○○のところとwhile文の()のなかどどうやって書けばいい出ようか?

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

>printf("\nメモ帳がしました。\n"); printf("\nメモ帳が終了しました。\n"); です。 くだらない間違いですが。 実際に使用する場合には別にスレッド起動して、WaitForMultipleObjects()辺りを使うべきでしょう。 # 監視スレッドを終了させる為のイベントオブジェクトとか設定して。 まかり間違ってもプロシージャ内で無限ループしないように。 「(応答無し)」とかのラベルを授与されますからね。

全文を見る
すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

「WaitForSingleObject プロセス 終了待ち」で検索すれば、そこそこ見つけられるかと。 ただし… http://okwave.jp/qa/q8101869.html で指摘されているように自分で起動したものではないプロセス…の場合は面倒かも知れません。 OpenProcess()でハンドルが取れるかどうか…とか。 # 実行ファイル名が同名の別アプリかも知れない。という問題もありますし。 あとは…WaitForSingleObject()の待ち時間を無限に設定したりすると、 自分のアプリの終了に不具合があるかも知れませんので注意が必要かもしれません。 ということで前回の質問の#1さんのプログラムを改造してみました。 # WinExec()で起動したメモ帳は待てましたが…他から起動したメモ帳だとGetModuleBaseName()で実行ファイル名が取得できませんでした。 # 権限の問題かも知れませんな。 #include <stdio.h> #include <string.h> #include <windows.h> #include <psapi.h> #define MAX_STR 500 #define MAX_ARRAY 1024 int main() { DWORD procIdList[MAX_ARRAY]; DWORD retSize; int nProc; int i; char procName[MAX_STR]; HANDLE hProcess; HMODULE hMod; //メモ帳を起動してやる WinExec("notepad.exe", SW_SHOWNORMAL); //プロセスIDの一覧を取得 if (!EnumProcesses(procIdList, sizeof(procIdList), &retSize)) { printf("EnumProcesses関数が失敗\n"); return 1; } nProc = retSize / sizeof(DWORD); //printf("%d個のプロセス\n", nProc); for (i = 0; i < nProc; i++) { strcpy(procName, ""); hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | SYNCHRONIZE, FALSE, procIdList[i]); if (hProcess != NULL) { //プロセス名の取得 retSize = sizeof(hMod); if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &retSize)) { GetModuleBaseName(hProcess, hMod, procName, MAX_STR / sizeof(char)); } } //メモ帳が起動中かどうか確認する if (strcmp(procName, "notepad.exe") == 0) { //メモ帳を確認 break; } CloseHandle(hProcess); hProcess = NULL; } if (hProcess != NULL) { printf("メモ帳が起動しています。\n終了を待ちます。\n"); for(;WaitForSingleObject(hProcess, 1000) == WAIT_TIMEOUT;) { printf("."); } printf("\nメモ帳がしました。\n"); CloseHandle(hProcess); } else { printf("メモ帳を確認できません。終了します。\n"); } return 0; } //end of main

nahe1112
質問者

補足

WaitForSingleObject()を使って対象のアプリケーションが終了するまでProgramを実行することは出来るようになったのですが 待機している間GetAsyncKeyStateを使ってF1を押すとMessageが出るようにすることは可能ですか? 考えたプログラムは↓のようにしたのですがダメでした。 他にありますでしょうか? #include <windows.h> #include<tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd) { DWORD proccess_ID; HWND hWnd = FindWindow("classname" ,"windowtitle"); GetWindowThreadProcessId(hWnd, &proccess_ID); HANDLE hProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, NULL, proccess_ID); if(hProcessHandle != 0){ if( GetAsyncKeyState( VK_F1 ) & 1 ){ MessageBox(NULL, "起動中でもキーが押せます", "F1を押しました。", MB_OK + MB_ICONINFORMATION); } WaitForSingleObject(hProcessHandle,INFINITE); CloseHandle(hProcessHandle); MessageBox(NULL, "対象のアプリケーション終了", "Success", MB_OK + MB_ICONINFORMATION); } }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 対象のアプリケーションが終了するまで起動し続ける

    C言語でメモ帳を起動している間だけ作ったプログラムが起動し続け メモ帳が終了したらプログラムも終了する方法がありますでしょうか? メモ帳が起動しているときは「起動しています」と無限ループで出て メモ帳を終了したときは1回だけ「終了しました」と出るようにしたいです。

  • アプリケーションが終了するまで待機

    SHELLEXECUTEINFO shellinfo; ZeroMemory(&shellinfo, sizeof(SHELLEXECUTEINFO)); shellinfo.cbSize = sizeof(SHELLEXECUTEINFO); shellinfo.lpVerb = "open"; shellinfo.lpFile = "test.htm"; shellinfo.nShow = SW_SHOW; shellinfo.hwnd = this->m_hWnd; shellinfo.fMask = SEE_MASK_NO_CONSOLE | SEE_MASK_NOCLOSEPROCESS; WaitForSingleObject(shellinfo.hProcess,INFINITE); ShellExecuteEx(&shellinfo); 上記のようなソースでShellExecuteEXでhtmlファイルを アプリケーション(インターネットエクスプローラ)で開き WaitForSingleObjectでアプリケーションが終了するまで待機させておきたいのですが うまくいきません。txtファイルでメモ帳ならうまくできるのですが なぜでしょうか。なにか情報ありましたらお願い致します。

  • アプリケーションの終了の仕方について

    CD-ROMをインストールして使おうとしました。 すると起動中のアプリケーションを終了させてくださいとでたのですが、意味がわかりません。すべてのアプリケーションを終了するにはどうすればいいのですか? 何をチェックすべきなのでしょうか? 教えてください。

  • アプリケーションの終了方法について

     もう4年ほど前の事ですが、ずっと気になっていたので質問させていただきます。  当時私の勤務先で、あるソフトを導入したのですが、そのとき業者の方から聞いた話によると、アプリケーションを終了させる場合は、ウインドウ右上の×で終了させるのではなく、ファイル---終了を使って終了させるようにと言われました。  その方曰く、「×はキャンセルという意味なので、そのアプリケーションで使用している作業用のTEMPファイルが、ごみファイルとなってハードディスク上に残ってしまう。ファイル---終了で終了させると、それらのファイルを削除し、現在の設定を保存してから終了する。だから、必ずファイル---終了を使ってください。」と言うのです。  私は、それまでそんなことは気にせず×を使っていましたし、私の周りの人もみんなそうでした。しかも、それ以降、そんな話を聞いたことがありません。  実際のところはどうなのでしょうか?詳しい方よろしくお願いします。

  • アプリケーションが終了できない・・・

     こんにちは。  実は、あるネットワーク対応のアプリケーション(ゲーム)なんですが、ネットワークに接続して、プレイした後、アプリケーションを終了すると「応答なし」になってしまいます。「すぐに終了」すると終了したかのように見えるのですが、ctrl+alt+delで見るとプロセスに.exeファイルが残っており、プロセスの終了をしてもリストから消えず、終了できません。ですので、再度そのゲームを実行しようとしても立ち上がらず、再起動するしかないのです。  ネットワークに接続しなければ問題なく終了できるのですが、原因が分かりません。  原因が思い当たる方、又、アプリケーションを完全に終了させる方法(プロセスを終了)させる方法があれば、教えて下さい。  ボクのOSはXP home です。この質問文からも分かると思いますが、あまりこの方面には詳しくないので、質問した場所が間違っていたかもしれませんが申し訳ありません。また、教えて下さる方、ご面倒でも素人相手に説明すると思って教えて頂ければうれしいです。  よろしくお願いします。

  • アプリケーションを自動的に終了して、再起動する

    エバーノートをバージョンアップしようと思うのですが 「セットアップの完了後 アプリケーションを自動的に終了して、再起動する」 と言うのは、 何を再起動するのでしょうか? パソコンでしょうか? エバーノートの事でしょうか?

  • CPU資源をなるべく消費しないでイベントを待機する

    こんにちは。 VC++2008Exressを使用して、以下のようなプログラムを作成したいと思います。 初心者で、どうやって作成すれば良いのか悩んでおります。 参考になるものなどありましたら、ご教授ください。 Windowsアプリケーション Win32API メッセージループ内でWaitForSingleObjectなどのイベントを待機する関数を使用して イベントを待つようにしたいのですが メッセージループ内でメッセージも待機できイベントも待機できるような方法はないでしょうか? 今のところ、実現はしておりませんが検討しているのは メッセージ待機用のスレッドを作成して、GetMessageで待機して メッセージがきたら、SetEvent関数でメインのメッセージループ内の WaitForSingleObjectを返す。 また、別のメッセージ以外のイベントを監視するスレッドを作成して WaitForSingleObjectで監視してイベントが来たら、さきと同じイベントを SetEvent関数を使用しメインのメッセージループ内のWaitForSingleObjectを返す。 という感じでメッセージとイベントをメッセージループ内で監視するようにするしか 分かりません。 その他、簡単な関数で実現可能なものなどありませんでしょうか? WaitForMultiObjectsとか、MsgWaitForMultiObjectsやら調べてみましたが、いまいち使い方が。。。。 また、スレッドは監視イベントが来るたびに終了させた方がよいのでしょうか? それでは、またスレッド作成を繰り返すので効率悪い気がします。 無限ループで監視させた方が良いのではと思いますが、CPU資源的には・・・。 というようなことで悩んでおります。 どうか、ご教授ください。よろしくお願いします。

  • アプリケーションを監視し終了していたら再度起動するソフト

    とあるサーバーを運営しているのですが よくサーバーのアプリケーションが落ちてしまう現象が起きていて困っているのですが ・起動している特定のアプリケーションの監視 (アプリケーションが終了されてしまったら自動再起動) このような事ができるフリーウェアはありませんでしょうか? よろしくお願いします

  • 他のアプリケーションの起動と終了のログをとりたい。

    SetWindowsHookExを使ってWindowsメッセージをフックし、 他のアプリケーションの起動と終了のログを取ろうと思っているのですが、 使用するフックタイプと起動と終了を意味するメッセージの種類がわからずに困っております。 ついでにアプリの起動を検知した後にそのアプリのプロセスIDを取得したいのですがどのようにすればよいでしょうか? よろしくお願いします。

  • 起動中のアプリケーションを終了する方法

    いつもお世話になっています、こんばんは。 とあるCD-ROMを入れて起動をしようと試みたのですが、「起動中の他のアプリケーションをすべて終了してください」というメッセージが出て起動できない状態です。 そこで無線子機を外して外部ネットワークを遮断し、セキュリティソフトを無効にしてCtrl+Alt+Deleteボタンを同時押ししてタスクマネージャを起動して確認したのですが起動中アプリケーションはありませんでした。 次に、{スタートボタン}→{検索}→{msconfig}を実行してみてシステム構成を選んだのですが、{サービス}{スタートアップ}の項目がありチェックボイス項目があったのでこれをいじれば何とかなるのではないかと思いました。 そこで質問です。 質問1:この{サービス}と{スタートアップ}どちらの項目で起動中のアプリケーションを確認できるのでしょうか? 質問2:チェックボイスを全て外してしまえば現パソコンに何らかの被害が出るのでしょうか?チェックボイスをメモ(元に戻すため)しておいたほうがいいでしょうか? 質問3:右下にあるいくつかのアイコン?が起動中のアプリケーションなのでしょうか? Vistaは全くの初心者であり、NEC製のLavieを使用しています。 どなたかご指導ください、よろしくお願いします。

このQ&Aのポイント
  • ミュージシャンの発言に共感し、自分へ向けられているのではないかと期待するファンの悩み
  • ミュージシャンのライブMCで話した動物の名前について、ファンは自分宛のメッセージかと思ってしまう
  • ファン会報にミュージシャンの関心事に近い話題が書かれており、期待をしてしまうファンの葛藤
回答を見る