アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語でメモ帳を起動している間だけ作ったプログラムが起動し続け
メモ帳が終了したらプログラムも終了する方法がありますでしょうか?

メモ帳が起動しているときは「起動しています」と無限ループで出て

メモ帳を終了したときは1回だけ「終了しました」と出るようにしたいです。

A 回答 (2件)

メモ帳はどうやって起動したものでしょうか?


単にnotepad.exeのプロセスを調べると、ユーザーが後から起動したものかもしれないし、メモ帳以外にもnotepad.exeという名前のものがあるかもしれません。
自身のプログラムで起動したメモ帳を監視したいのであれば、CreateProcessなどでメモ帳を起動したうえでプロセスハンドルを保存し、WaitForSingleObjectなどでプロセスの状態を監視するのが一般的だと思います。

この回答への補足

CreateProcessなどでメモ帳を起動するのではなく
普通に「スタート」ー>「アクセサリー」・・・・
のように普通に起動します。

補足日時:2013/05/25 14:12
    • good
    • 0

起動中のプロセス名の一覧を取得して、その中に「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

参考URL:http://support.microsoft.com/kb/175030/ja
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!