我想检测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的这种现象消失,但是这是另一种解决方案。如果您在运行Netflix应用程序的TaskManager中查看,可以看到它以wwahost.exe的身份运行,但是提供了一个命令行,可以轻松地将其识别为Netflix应用程序-ServerName:Netflix.App.wwa

c# - C#如何检测Netflix是否正在运行-LMLPHP

因此,您可以从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;
        }
    }
}

关于c# - C#如何检测Netflix是否正在运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54280947/

10-11 23:07