c# 如何检测 Netflix 是否为 运行

c# How to detect if Netflix is Running

我想检测 Netflix 是否 运行。我正在使用 Windows 表单应用程序。

Netflix 是一个由进程 WWAHost.exe 托管的 Metro 应用程序。我使用以下代码:

Process[] ps = Process.GetProcessesByName("WWAHost");
foreach(var p in ps)
{
  if(p.MainWindowTitle == "Netflix")
  {
    return true;
  }
}

代码在 Netflix 启动后运行大约 0.6 秒。 0.6 秒后,MainWindowTitle 包含一个空字符串。这意味着只有在 Netflix 启动后才能检测到它。

更新:实际上我的代码只有在 Netflix 最小化或启动时才有效(0.6 秒只是从开始开始)。

这是一个错误吗?有没有更好的方法来解决这个问题?

我的系统:Win10 1809,VS2015,.Net4.5.2

我没有看到 MainWindowTitle 的这种行为消失了,但这里有一个替代解决方案。如果您在 TaskManager 中查看 Netflix 应用程序 运行,我们可以看到它是 运行 作为 wwahost.exe,但它提供了一个命令行,可以轻松地将其识别为 Netflix 应用程序 [=13] =].

因此,从您的 C# 应用程序中,您可以使用 WMI 提取进程命令行(为此您需要参考 System.Management)。

这是一个例子:

class Program
{
    static void Main(string[] args)
    {
        var processes = Process
            .GetProcesses()
            .Where(a => a.IsNetflix());

        Console.ReadKey();
    }
}

static class Extensions
{
    public static bool IsNetflix(this Process process)
    {
        if (process.ProcessName.IndexOf("WWAHost", StringComparison.OrdinalIgnoreCase) == -1) return false;

        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher($"SELECT CommandLine FROM Win32_Process WHERE ProcessId = {process.Id}"))
        using (ManagementObjectCollection objects = searcher.Get())
        {
            var managementObject = objects
                .Cast<ManagementBaseObject>()
                .SingleOrDefault();

            if (managementObject == null) return false;
            return managementObject["CommandLine"].ToString().IndexOf("netflix", StringComparison.OrdinalIgnoreCase) > -1;
        }
    }
}