Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取所有应用程序的列表_C#_Process - Fatal编程技术网

C# 获取所有应用程序的列表

C# 获取所有应用程序的列表,c#,process,C#,Process,我正在尝试获取所有打开的应用程序的列表。特别是,如果打开任务管理器并转到“应用程序”选项卡,则会显示该列表 我试过使用这样的东西: foreach (var p in Process.GetProcesses()) { try { if (!String.IsNullOrEmpty(p.MainWindowTitle)) { sb.Append("\r\n"); sb.Append("Window t

我正在尝试获取所有打开的应用程序的列表。特别是,如果打开任务管理器并转到“应用程序”选项卡,则会显示该列表

我试过使用这样的东西:

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、Calculator和Microsoft Word

有人知道为什么这不能正常工作,或者怎么做吗

另外,一位朋友建议这可能是权限问题,但我以管理员身份运行VisualStudio,并且没有更改

编辑:我遇到的问题是,我得到的大多数解决方案只返回所有进程的列表,这不是我想要的。我只想要打开的应用程序或窗口,如任务管理器上显示的列表。不是每个进程的列表


另外,我知道这里有错误的代码,包括空的catch块。这是一个一次性的项目,只是为了弄清楚它最初是如何工作的。

正如马修指出的,这可能是因为它们没有主标题,因此你会过滤掉它们。下面的代码将运行所有进程。然后可以使用
Process.ProcessName
筛选出不需要的。是关于使用ProcessName的文档

using System.Diagnostics;

Process[] processes = Process.GetProcesses();

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

你可以试试这样的,克里斯

//下面的更新将使您获得在“应用程序”选项卡中运行的所有进程

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

正如其他人所说的,这是因为某些应用程序(Notepad++就是其中之一)没有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);
    }
}

我认为,出于某种原因,MainWindowTitle对于某些进程是空的,因此您将跳过这些进程。尝试以下测试:

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);
    }
}
代码示例似乎给出了您的要求。修改版本:

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;
    }
}
公共类桌面窗口
{
公共IntPtr句柄{get;set;}
公共字符串标题{get;set;}
公共布尔值可见{get;set;}
}
公共类User32Helper
{
公共委托bool enumregate(IntPtr hWnd、intlparam);
[DllImport(“user32.dll”)]
[返回:Marshallas(UnmanagedType.Bool)]
公共静态外部bool IsWindowVisible(IntPtr hWnd);
[DllImport(“user32.dll”,EntryPoint=“GetWindowText”,
ExactSpelling=false,CharSet=CharSet.Auto,SetLastError=true)]
公共静态外部int GetWindowText(IntPtr hWnd、StringBuilder lpWindowText、int nMaxCount);
[DllImport(“user32.dll”,EntryPoint=“EnumDesktopWindows”,
ExactSpelling=false,CharSet=CharSet.Auto,SetLastError=true)]
公共静态外部bool EnumDesktopWindows(IntPtr hDesktop、EnumDelegate lpEnumCallbackFunction、,
IntPtr(内存);
公共静态列表GetDesktopWindows()
{
var collection=新列表();
EnumDelegate筛选器=委托(IntPtr hWnd、int lParam)
{
var结果=新的StringBuilder(255);
GetWindowText(hWnd、result、result.Capacity+1);
字符串标题=result.ToString();
var isVisible=!string.IsNullOrEmpty(title)和&IsWindowVisible(hWnd);
添加(新桌面窗口{Handle=hWnd,Title=Title,IsVisible=IsVisible});
返回true;
};
EnumDesktopWindows(IntPtr.Zero、filter、IntPtr.Zero);
回收;
}
}
使用上面的代码,调用
User32Helper.GetDesktopWindows()
应该会给您一个列表,其中包含所有打开的应用程序的句柄/标题,以及它们是否可见。请注意,
true
无论窗口的可见性如何,都会返回,因为正如作者所问,该项仍会显示在任务管理器的应用程序列表中


然后,您可以使用集合中某个项的相应句柄属性,使用其他项(如或)执行许多其他任务。

可能是因为这些应用程序没有主窗口标题。如果您的程序有主窗口标题,则可以执行以下操作:Chris Process[]processs=Process.getprocesss();foreach(var proc in processs){if(!string.IsNullOrEmpty(proc.MainWindowTitle))Console.WriteLine(proc.MainWindowTitle);}您也可以使用
WMI
您是否正在查看您正在复制和粘贴的代码?并且,千万不要使用
try
和空
catch{}
。它只会掩盖错误,使bug无法被发现。这就像说“我不在乎这是否有效。”克里斯,我为你找到了一个可行的解决方案,我刚刚测试了它,它让那些正在运行的进程出现在“应用程序”选项卡上。查看我更新的帖子。我想我感到困惑的是,我不知道要过滤什么,如果这有意义的话。我知道我需要所有正在运行的应用程序,但我如何检查它?我在这件事上看到的大多数情况是,如果一个应用程序有一个窗口,它就有一个MainWindowTitle,那么我怎么能得到像记事本++这样的东西,而记事本显然没有呢?@ChrisBacon它仍然有一个processname或processid,如果它正在运行的话!这个解决方案的问题是,它仍然让我运行每个进程,这不是我想要的。我只想要有windows的进程。基本上,我所需要的是可以在任务管理器的“应用程序”选项卡中看到的应用程序。这个解决方案的问题是,它仍然只让我运行每个进程,这不是我想要的。我只想要有windows的进程。基本上,我想要的是我可以在任务管理器的应用程序选项卡中看到的应用程序