c # Как определить, работает ли Netflix - PullRequest
0 голосов
/ 21 января 2019

Я хочу определить, работает ли Netflix. Я использую приложение Windows Forms.

Netflix - это приложение Metro, которое размещено процессом WWAHost.exe. Я использую следующий код:

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

Код работает примерно 0,6 секунды после запуска Netflix. Через 0,6 секунды MainWindowTitle содержит пустую строку. Это означает, что обнаружение Netflix возможно только после его запуска.

Обновление: на самом деле мой код работает только в том случае, если Netflix свернут или запущен (0,6 секунды - это только начало).

Это ошибка? Есть ли лучший способ решить эту проблему?

моя система: Win10 1809, VS2015, .Net4.5.2

1 Ответ

0 голосов
/ 21 января 2019

Я не видел, как исчезает MainWindowTitle, но здесь есть альтернативное решение.Если вы посмотрите в TaskManager с запущенным приложением Netflix, мы увидим, что да, он работает как wwahost.exe, но ему дана командная строка, которая легко идентифицирует его как приложение Netflix -ServerName:Netflix.App.wwa.

enter image description here

Итак, из вашего приложения 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;
        }
    }
}
...