C#如何获取当前运行的应用程序列表而非进程列表
获取Windows上正在运行的应用程序列表(而非全部进程)
你说得对——Process.GetProcesses()和Process.GetProcessesByName()会返回系统中所有活跃进程,但其中混杂了大量后台服务、应用辅助进程,没法直接区分出用户实际在使用的“真正运行的应用程序”。要解决这个问题,核心是找到用户可见、有交互窗口的进程,或者明确属于当前用户会话的应用进程。
方案1:筛选有可见主窗口的进程
大部分用户感知的“运行中应用”都有一个顶层交互窗口,我们可以通过进程的MainWindowTitle和MainWindowHandle来筛选:
using System.Diagnostics; using System.Linq; using System; // 获取所有有可见主窗口的进程 var runningApplications = Process.GetProcesses() .Where(process => !string.IsNullOrEmpty(process.MainWindowTitle) && process.MainWindowHandle != IntPtr.Zero) .Select(process => new { ProcessId = process.Id, AppName = process.ProcessName, WindowTitle = process.MainWindowTitle }) .ToList(); // 输出示例 foreach (var app in runningApplications) { Console.WriteLine($"[{app.ProcessId}] {app.AppName}: {app.WindowTitle}"); }
这个方法能过滤掉绝大多数后台进程,只保留有用户可见窗口的应用,比如浏览器、Word、VS Code这类程序。
方案2:精准筛选当前用户会话的应用
如果你的系统有多个用户登录,还可以结合进程的会话ID,只保留当前用户启动的应用:
int currentUserSessionId = Process.GetCurrentProcess().SessionId; var currentUserApps = Process.GetProcesses() .Where(process => process.SessionId == currentUserSessionId && !string.IsNullOrEmpty(process.MainWindowTitle) && process.MainWindowHandle != IntPtr.Zero) .Select(process => new { ProcessId = process.Id, AppName = process.ProcessName, WindowTitle = process.MainWindowTitle }) .ToList();
这样可以排除掉其他用户会话中运行的应用,只聚焦当前用户正在使用的程序。
补充说明
- 对于Chrome、Edge这类多进程架构的应用,你会看到多个同名进程,但只有主进程带有
MainWindowTitle,其他都是无窗口的渲染/插件进程,这个方法会自动只保留主窗口进程。 - 如果需要包含托盘后台应用(比如微信、QQ托盘状态),这个方法就不够了——这类应用没有主窗口,需要调用Windows原生API(如
Shell_NotifyIconGetInfo)来检测,实现起来会更复杂,一般场景下用前两种方案就足够。
内容的提问来源于stack exchange,提问作者keenns
相关产品推荐
相关产品推荐

