2013-01-08 17 views
6

私はすべての開いているアプリケーションのリストを取得しようとしています。具体的には、タスクマネージャを開き、アプリケーションタブに移動すると、その一覧が表示されます。私が見つけたいくつかの例ですべてのアプリケーションのリストを取得

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を使用します。

これが正しく動作しない理由やその理由を知っている人はいますか?

また、友人は権限の問題である可能性がありますが、私は管理者としてVisual Studioを実行しており、変更されていません。

EDIT:問題は、私が与えたソリューションのほとんどがすべてのプロセスのリストを返すということです。これは私が望むものではありません。私は、タスクマネージャに表示されるリストのように、開いているアプリケーションやウィンドウを必要とします。すべての単一プロセスのリストではありません。

また、空のキャッチブロックを含め、ここには悪いコードがあることは知っています。これは最初の場所でどのように動作するかを把握するための簡単なプロジェクトでした。

+2

これらのアプリにメインウィンドウのタイトルがない可能性が高いためです。 – cgTag

+0

プログラムにメインウィンドウのタイトルがある場合、Chris Process [] processes = Process.GetProcesses(); foreach(プロセス内のvar proc) { if(!string.IsNullOrEmpty(proc.MainWindowTitle)) Console.WriteLine(proc.MainWindowTitle); } また、WMIを使用することもできます。http://msdn.microsoft.com/en-us/library/windows/desktop/aa394599%28v=vs.85%29.aspx – MethodMan

+2

コピー&ペーストしていますか? –

答えて

2

Mathewが主なタイトルを持っていない可能性があると言いました。以下のコードはすべてのプロセスを実行します。 Process.ProcessNameを使用して、不要なものを除外することができます。 HereはProcessNameの使用に関するドキュメントです。

using System.Diagnostics; 

Process[] processes = Process.GetProcesses(); 

foreach (Process process in processes) 
{ 
    //Get whatever attribute for process 
} 
+0

私が混乱しているのは、フィルタリングしたいものが正確にわからないということです。実行しているすべてのアプリケーションが必要なのは分かっていますが、どうすれば確認できますか?私がこの問題に関して見たことのほとんどは、アプリケーションにウィンドウがある場合、MainWindowTitleを持っているので、Notepad ++のようなものをどうやって得ることができるのでしょうか? –

+0

@ChrisBacon実行中の場合、まだプロセス名またはプロセスIDを持っています! – FrostyFire

+0

なぜダウン率?????????????????? – FrostyFire

0

あなたは

//以下UPDATEDこのクリスのような何かを試すことができ、アプリケーション]タブで他の人のよう

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(""); 
    } 
} 
+0

この解決策の私の問題は、それがまだすべてのプロセスを実行してくれていることです。これは私が望むものではありません。私は_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _する_基本的に私が望むのは、自分のタスクマネージャの[アプリケーション]タブに表示されるアプリケーションだけです。 –

+0

@ChrisBacon私の更新された回答を参照してください – MethodMan

0

を実行しているすべてのプロセスがいくつかのアプリケーション(メモ帳からだと述べているあなたを取得します++ 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); 
    } 
} 
+0

この解決策の私の問題は、それだけで私に欲しいものではないすべてのプロセスを実行しているということです。私はウィンドウを持つプロセスだけを望んでいます。基本的に私が望むのは、自分のタスクマネージャの[アプリケーション]タブに表示されるアプリケーションだけです。 –

0

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

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

あなたのtry ...キャッチは、それはいくつかのエラーを取得する場合、いくつかのプロセスをジャンプし、そうもせずにしようとしています。

UPDATE: はそれは醜いですが、これを試してみて、窓がありませんが、多分あなたはフィルタすることができ、いくつかのプロセスを取る..

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); 
    } 
} 
+0

try/catchブロックを削除しようとしましたが、まだいくつかのウィンドウは無視されます。そして、主な問題は、私はすべての単一のプロセスを望んでいない、私はちょうどウィンドウがそれらに関連付けられているものをしたい。 –

+0

Chris、あなたのコードはSkypeやNotepad ++を含む私のコンピュータで実行されます。どのようなウィンドウとフレームワークのバージョンを使用していますか? –

10

コード例hereあなたが求めているものを与えるように見えます。変更されたバージョン:上記のコードでは

public class DesktopWindow 
{ 
    public IntPtr Handle { get; set; } 
    public string Title { get; set; } 
    public bool IsVisible { get; set; } 
} 

public class User32Helper 
{ 
    public delegate bool EnumDelegate(IntPtr hWnd, int lParam); 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool IsWindowVisible(IntPtr hWnd); 

    [DllImport("user32.dll", EntryPoint = "GetWindowText", 
     ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount); 

    [DllImport("user32.dll", EntryPoint = "EnumDesktopWindows", 
     ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)] 
    public static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, 
     IntPtr lParam); 

    public static List<DesktopWindow> GetDesktopWindows() 
    { 
     var collection = new List<DesktopWindow>(); 
     EnumDelegate filter = delegate(IntPtr hWnd, int lParam) 
     { 
      var result = new StringBuilder(255); 
      GetWindowText(hWnd, result, result.Capacity + 1); 
      string title = result.ToString(); 

      var isVisible = !string.IsNullOrEmpty(title) && IsWindowVisible(hWnd); 

      collection.Add(new DesktopWindow { Handle = hWnd, Title = title, IsVisible = isVisible }); 

      return true; 
     }; 

     EnumDesktopWindows(IntPtr.Zero, filter, IntPtr.Zero); 
     return collection; 
    } 
} 

、あなたに開いているすべてのアプリケーションのためだけでなく、彼らが見えているかどうかにかかわらず、ハンドル/タイトルを含むリストを与える必要がありますUser32Helper.GetDesktopWindows()を呼び出します。ウィンドウの可視性に関係なく、trueが返されることに注意してください。これは、作成者が依頼していたタスクマネージャのアプリケーションリストに項目が表示されるためです。

他のWindow FunctionsShowWindowまたはEndTaskなど)を使用して、コレクション内のアイテムの1つから対応するHandleプロパティを使用して、他の多くのタスクを実行できます。

+0

素晴らしい作品です。アプリケーション全体ではなく特定のウィンドウを閉じようとしている場合は、この[回答]をお勧めします(http://stackoverflow.com/questions/1694451/cannot-use-pinvoke-to-send-wm-close-to- a-windows-explorer-window)を使用します。 DestroyWindow(https://msdn.microsoft.com/en-us/library/windows/desktop/ms632682%28v=vs.85%29.aspx)は、同じスレッドとCloseWindow(https://msdn.microsoft)からのみ動作します.com/en-us /ライブラリ/ windows/desktop/ms632678%28v = vs.85%29.aspx)は、ターゲットウィンドウを最小化するだけです。 –

関連する問題