プロセス起動時間を監視し、規定時間経過後プロセスをkillしたい

[戻る]
なお 2008/09/22(月) 21:54:41
はじめまして。なおと申します。

-----------------------------
windows XP VS 2005 PRO

-----------------------------

今回みなさんにアドバイスをいただきたい事は、あるアプリケーションを監視し、
そのアプリケーションが規定時間を経過したら、そのアプリをkillしたいです。
流れは以下のような流れになります。

1,スタートアップに上記作成したアプリを登録し、OS起動時にアプリは常駐し、特定の
アプリが起動しないかを常に見張っている。

2,特定のプロセスが起動した際に内部で時間を計測しており、規定時間が来た際に、
上記プロセスをkillする。

上記の事を実現したいです。過去ログを拝見させていただきました。

・TerminateProcess
・OpenProcess
・closehandle

この3つで、プロセス取得、プロセスKillが実現できそうなのですが、プロセスの起動
時間を計測する箇所のAPIが見当たりませんでした。

初心者ですが、ご教示宜しくお願いいたします。

とおり 2008/09/23(火) 07:15:39
多分、Windowsは起動中のアプリの時間の管理はしていないので
自前で実装になるかと思います。

一般的なアプリならFindWindow APIで定期的にウィンドウ名を
探してウィンドウハンドルを定期的に取得
複数起動可能ならEnumWindowsでそれぞれハンドルを定期的に取得
してハンドル単位で時間管理すればよいかと。
もしかして時間管理の方が分からない?

TerminateProcessは保存確認すら出ないので取得した
ウィンドウハンドルに対してWM_CLOSEを送信する位でいいのでは?

#一歩間違うと悪意あるソフトになるので
#作成しても常駐する使い方には注意が必要です。

... 2008/09/23(火) 10:17:10
killアプリは自身で作成して、時間計測はタスクスケジュールを用いれば?

なお 2008/09/23(火) 12:12:31
なおと申します。

とおりさん、...さん アドバイスありがとうございます。

とおりさん
>一般的なアプリならFindWindow APIで定期的にウィンドウ名を
>探してウィンドウハンドルを定期的に取得
>複数起動可能ならEnumWindowsでそれぞれハンドルを定期的に取得
>してハンドル単位で時間管理すればよいかと。

今回は特に子のウインドは特に意識する必要が無さそうなので、
これで出来そうです。
>#一歩間違うと悪意あるソフトになるので
>#作成しても常駐する使い方には注意が必要です。

えーと、実は、兄がパソコンのゲームにハマッてましてそれを長時間の
プレイはやめさせたいな。って言うのが作成したいと思ったきっかけです・・。

...さん

>killアプリは自身で作成して、時間計測はタスクスケジュールを用いれば?

タスクスケージューラだと、アプリが起動して何分経過しているか?という
細かい操作が出来なさそうですよね??

なお 2008/09/23(火) 16:28:46
なおと申します。

・FindWindow関数
・TerminateProcess関数

上記を利用してプロセスをkillする事は出来ました。(予めウィンドウ名は知っていた
ので、上記2つで出来ました)

時間管理はスマートではありませんが、Sleep関数を使用いたしました。

ここで、また皆様にご教示していただきたい事が出てきました。

コンソールアプリケーションで作成した実行ファイルを実行した際にDOS窓が
立ち上がって来るのですが、これを出さなくする事は可能ですか?調べた所、
最小化して起動と言うのはあったのですが、最小化ではなく、DOS窓を完全に
出したくありません。何か方法はあるのでしょうか?
アドバイス宜しくお願いいたします。

金魚ちゃん 2008/09/23(火) 18:06:52
WinMainから記述すれば良いと思うよ。
これならコンソールのウインドウが出なくてすむ。

#include <stdio.h>
#include <windows.h>

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR 
lpCmdLine, int nCmdShow )
{
 /*
 ここに main と同じ内容を書く
 */
 return 0;
}

あと WinMain から作るなら時間管理として Sleep よりも SetTimer、KillTimer、
WM_TIMER
などを利用すればよりスマートな時間管理ができそうだね。

なお 2008/09/23(火) 20:22:04
[[解決]]
なおと申します。

金魚ちゃんさん

アドバイスありがとうございます。金魚さんちゃんのアドバイスはいつも
参考にさせていただいています。

WinMainの方法で実現出来ました。ありがとうございました。

aetos 2008/09/24(水) 00:20:50
目的に合うかどうかわはりませんが、ジョブオブジェクトを使ってみるとか。

古いスレッドには追加発言できません。