これがアイデアです、私はサービスを作りたいですか?特定のプログラムの起動を探し、特定の条件が満たされない限り許可しないようにします。
たとえば、1 週間プレイするのをやめたいゲームがあるとします。そのため、金/土/日以外の日に起動すると、インターセプトされてキャンセルされます。これはC#で可能ですか?
私が探している主なことは、プログラムの起動をキャッチする方法です。残りは簡単なはずです。
必要なプロセス名 (GetProcessesByName()) を探してそれらを強制終了することで、どのプログラムが実行されているかを確実に判断できます。
Process[] processes = Process.GetProcessesByName(processName);
foreach(Process process in processes)
{
process.Kill();
}
実行したくないもののリストを作成し、時間チェック (または満たすべき基準) を実行してから、リストをたどることができます。テストのためにこのようなことを一度行いましたが、十分に機能します。
ここでは特に C# については知りませんが、これを達成できる理由の 1 つ (危険な方法だと思います) は、イメージ ファイル実行オプション ( http://blogs.msdn.com/junfeng/archive ) を使用することです。 /2004/04/28/121871.aspx ) をレジストリに追加します。傍受したい実行可能ファイルについては、Debugger オプションを設定し、デバッガーで使用される小さなアプリケーションを作成して、基本的にこれらの呼び出しをフィルター処理することができます。実行を許可したい場合は、プロセスを開始します。それ以外の場合は、好きなことをしてください。私はこれを試みたことはありませんが、あなたが望むことができるようです。
または、プロセスの開始に反応してから終了する場合は、ProcessWatcher ( http://weblogs.asp.net/whaggard/archive/2006/02/11/438006.aspx ) を使用して、作成されたイベントを処理し、必要に応じて閉じます。ただし、これは最初のアプローチのようなプロアクティブなアプローチではなく、よりリアクティブなアプローチです。
アプリケーションを無効にする必要がある場合は、レジストリを編集して、デバッガーをそのアプリケーションに自動的に接続しようとすることができます。デバッガーが存在しない場合、ウィンドウは文句を言ってベイルアウトします。
[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File Execution Options]が重要です。詳細については、MSの記事http://support.microsoft.com/default.aspx?kbid=238788を参照してください。
必ずしもスタートアッププログラムを傍受する必要はありません。プログラムを起動する「プログラム起動マネージャー」アプリを作成できます(ホワイトリストに登録されている場合)。アプリを作成したら、適切なパラメーターを使用してスタートアップマネージャーを指すように、アプリケーションのショートカットを変更するだけです。
このアプリは
、私が作者ではないオレンジランプからのキルプロセスを実行します。
うーん、起動を傍受するのではなく、サービスが何らかの方法で実行可能ファイルを妨害する可能性があります(つまり、権限をいじる、EXEの名前を変更する、EXEをあなたの弱い意志を叱る何かに置き換えるなど)。
それでも十分でない場合は、次のいずれかの方法を試すことができます。
http://www.codeproject.com/KB/system/win32processusingwmi.aspx
常にフックがあります。.net ライブラリではサポートされていませんが、いつでも win32 dll をラップできます。ここに素晴らしい記事があります: http://msdn.microsoft.com/sv-se/magazine/cc188966(en-us).aspx
これは低レベルのプログラミングであり、コードを移植可能にしたい場合は、フックを使用しません。
起動をキャッチできるかどうかはわかりませんが、ウィンドウのリストでプログラムを探して (ENUM_WINDOWS でしたか? 思い出せません)、表示されたらすぐにシャットダウンすることができます。
おそらくAutoItでこれを行うことさえできます!
Petzold をドラッグして、ウィンドウを楽しんでください...
編集:アクティブなプロセスを一覧表示する方法については、sysinternals のソースを確認してください。これをループで実行すると、プログラムの起動時にキャッチできます。公式サイトにはまだソースがないと思いますが、どこかにあるはずです...