2

いくつかの独自のプロセスを監視し、必要に応じてそれらを再起動する組み込みシステムのウォッチドッグサービスをコーディングしています。(質問する前に、マルウェアとは何の関係もありません。これは単なるビジネス要件です)

作成したばかりのプロセスからフレンドリ名を取得する必要があります。これにより、後でその名前を使用してそのプロセスを取得し、その状態を監視できます。

私の問題は次のとおりです。

  • Process.ProcessName直後Process.Start()に読み込もうとするInvalidOperationExceptionと、プロセスがまだ完全に作成されていないため、が表示されます。

  • を使用する場合も同じことが起こりますProcess.WaitForInputIdle()が、これにはメッセージポンプが必要であり、多くの実行可能ファイルは実際のアプリケーションのUIレスランチャーである可能性があるため、これはオプションではない可能性があります。

  • プロセスを作成した直後、他のことをする前に、わかりやすい名前を取得する必要があります。

コードスニペットは次のとおりです。

var startInfo = new ProcessStartInfo { FileName = "notepad.exe" };
var process = new Process();
process.StartInfo = startInfo;
process.Start();
process.WaitForInputIdle();
var friendlyName = process.ProcessName;

InvalidOperationExceptionたとえば、開始されているプロセスがFirefoxの場合、これにより最後の行にがスローされます。

では、これをどのように行うのでしょうか?より安全な方法はありますか?

編集:明確にするためのコードスニペットを追加しました。EDIT2:明確にするために質問全体を言い換え、無関係なものを省きました。

4

2 に答える 2

4

さて、多くの調査の後、私はややハッキーな解決策に頼らなければなりませんでした。

Process.GetProcessesByName()のドキュメントによると、「プロセス名はOutlookなどのプロセスのわかりやすい名前であり、.exe拡張子やパスは含まれていません。

これを考慮して、私はこのコードを使用して問題を回避しました:

var startInfo = new ProcessStartInfo { FileName = "notepad.exe" };
var process = new Process();
process.StartInfo = startInfo;
process.Start();
var friendlyName = Path.GetFileNameWithoutExtension(startInfo.FileName);

私が言ったように、それはまだちょっとハッキーな感じがします、しかし少なくともそれは仕事を成し遂げて、私が先に進むことを可能にしました。

とにかくすべてのコメントをありがとう!

于 2013-01-23T15:32:37.763 に答える
0

あなたはあなたのコードにいくつかの重要なことを見逃していて、このようなことを使って試してみてください、NotePad.exeそしてあなたは私が話していることを見るでしょう

var startInfo = new ProcessStartInfo { FileName = "notepad.exe" };
var process = new Process();
process.StartInfo = startInfo;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = false;
process.Start();
process.WaitForInputIdle();
// this line below will always be false because `process.ProcessName will be 
//notepad and process.StartInfo.FileName = notepade.exe 
if (process.ProcessName.Equals(process.StartInfo.FileName) == false)
{
   var theConfiguredProcessName = process.ProcessName;
}

次の2つのことのいずれかを実行できる別のオプション

Process[] processName = Process.GetProcessesByName("blah.exe");

または、実行中のすべてのプロセスを確認し、実行中のプロセスを確認します

Process[] processlist = Process.GetProcesses();
foreach(Process process in processlist)
{
   Console.WriteLine("Process: {0} ID: {1}", process.ProcessName, process.Id);
}
于 2013-01-22T22:58:18.503 に答える