You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:18:25