9

開いているすべてのアプリケーションのリストを取得しようとしています。具体的には、タスクマネージャーを開いてアプリケーションタブに移動すると、そのリスト.

私はこのようなものを使ってみました:

foreach (var p in Process.GetProcesses())
{
    try
    {
        if (!String.IsNullOrEmpty(p.MainWindowTitle))
        {
            sb.Append("\r\n");
            sb.Append("Window title: " + p.MainWindowTitle.ToString());
            sb.Append("\r\n");
        }
    }
    catch
    {
    }
}

私が見つけたいくつかの例のように、これは私のためにすべてのアプリケーションを引き出すわけではありません. タスクマネージャーに表示されているか、開いていることがわかっているものの約半分しか取得していません。たとえば、このメソッドは何らかの理由で Notepad++ または Skype をピックアップしませんが、Google Chrome、電卓、および Microsoft Word をピックアップします。

これが正しく機能しない理由、またはその方法を知っている人はいますか?

また、友人はそれが権限の問題である可能性があると示唆しましたが、管理者としてビジュアルスタジオを実行していますが、変更されていません.

編集:私が得ている問題は、私が与えられた解決策のほとんどがすべてのプロセスのリストを返すだけであり、これは私が望むものではないということです. タスクマネージャーに表示されるリストのように、開いているアプリケーションまたはウィンドウが必要です。すべてのプロセスのリストではありません。

また、空の catch ブロックなど、ここに悪いコードがあることもわかっています。これは、そもそもこれがどのように機能するかを理解するためだけの使い捨てプロジェクトでした。

4

5 に答える 5

2

マシューが指摘したように、おそらくメイン タイトルがないため、それらを除外しているためです。以下のコードは、実行中のすべてのプロセスを取得します。Process.ProcessName次に、不要なものを除外するために使用できます。ProcessName の使用に関するドキュメントは次のとおりです

using System.Diagnostics;

Process[] processes = Process.GetProcesses();

foreach (Process process in processes)
{
   //Get whatever attribute for process
}
于 2013-01-08T02:57:56.723 に答える
0

このクリスのようなものを試すことができます

//以下で更新すると、[アプリケーション] タブで実行されているすべてのプロセスが取得されます

Process[] myProcesses = Process.GetProcesses();

foreach (Process P in myProcesses)
{
    if (P.MainWindowTitle.Length > 1)
    {
        Console.WriteLine(P.ProcessName + ".exe");
        Console.WriteLine(" " + P.MainWindowTitle);
        Console.WriteLine("");
    }
}
于 2013-01-08T02:58:27.440 に答える
0

他の人が言っているように、一部のアプリケーション (Notepad++ が 1 つ) に MainWindowTitle がないためです。これに対抗するために、私のコード (例として) は次のようになります。

Process[] processes = Process.GetProcesses();

foreach (Process pro in processes)
{
    if (pro.MainWindowTitle != "")
    {
        listBox.Items.Add(pro.ProcessName + " - " + pro.MainWindowTitle);
    }
    else
    {
        listBox.Items.Add(pro.ProcessName);
    }
}
于 2013-01-08T02:59:20.350 に答える
0

何らかの理由で、一部のプロセスでは MainWindowTitle が null であるため、それらのプロセスをスキップしていると思います。テストのためだけにこれを試してください:

foreach (var p in Process.GetProcesses())
{
     sb.Append("\r\n");
     sb.Append("Process Name: " + p.ProcessName);
     sb.Append("\r\n");
}

エラーが発生した場合、 try...catch がいくつかのプロセスをジャンプしている可能性があるため、それなしでも試してください。

更新: これを試してみてください。これは醜く、ウィンドウのないいくつかのプロセスを必要としますが、フィルタリングできるかもしれません..

var proc = new Process()
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "tasklist",
        Arguments = "/V",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};
proc.Start();
StreamReader sr = proc.StandardOutput;
while (!sr.EndOfStream)
{
    string line = sr.ReadLine();
    Match m = Regex.Match(line, @".{52}(\d+).{94}(.+)$");//157
    if (m.Success)
    {
        int session = Convert.ToInt32(m.Groups[1].Value);
        string title = m.Groups[2].Value.Trim();
        if (session == 1 && title != "N/A") sb.AppendLine(title);
    }
}
于 2013-01-08T03:02:48.847 に答える