- ベストアンサー
対象のアプリケーションが終了するまで起動し続ける
C言語でメモ帳を起動している間だけ作ったプログラムが起動し続け メモ帳が終了したらプログラムも終了する方法がありますでしょうか? メモ帳が起動しているときは「起動しています」と無限ループで出て メモ帳を終了したときは1回だけ「終了しました」と出るようにしたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
起動中のプロセス名の一覧を取得して、その中に「notepad.exe」(メモ帳の場合)が存在するかどうかを確認することで、監視してはどうでしょう? 試しにコードを書いてみました。 あんまりうまくは書けてないですが参考にしてみてください。 コンパイルする時には、 psapi.lib をリンクしてやる必要があります。 実行してみるとわかりますが、わりとCPUパワーを食います。 少しくらいのタイムラグが許容できるなら continue の直前に Sleep(100) とか入れるとマシになるかもしれません。 //////////// #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); //無限ループでメモ帳が起動中か監視する for (;;) { //プロセス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, FALSE, procIdList[i]); if (hProcess != NULL) { //プロセス名の取得 if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &retSize)) { GetModuleBaseName(hProcess, hMod, procName, MAX_STR / sizeof(char)); } } //メモ帳が起動中かどうか確認する if (strcmp(procName, "notepad.exe") == 0) { //メモ帳を確認 break; } } CloseHandle(hProcess); if (i != nProc) { //iがnProcと同じ数になっているようならメモ帳は見つからなかった printf("メモ帳が起動しています。\n"); continue; } else { printf("メモ帳を確認できません。終了します。\n"); break; } } return 0; } //end of main
その他の回答 (1)
- m-take0220
- ベストアンサー率61% (480/785)
メモ帳はどうやって起動したものでしょうか? 単にnotepad.exeのプロセスを調べると、ユーザーが後から起動したものかもしれないし、メモ帳以外にもnotepad.exeという名前のものがあるかもしれません。 自身のプログラムで起動したメモ帳を監視したいのであれば、CreateProcessなどでメモ帳を起動したうえでプロセスハンドルを保存し、WaitForSingleObjectなどでプロセスの状態を監視するのが一般的だと思います。
補足
CreateProcessなどでメモ帳を起動するのではなく 普通に「スタート」ー>「アクセサリー」・・・・ のように普通に起動します。