我想检测 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# 应用程序中,您可以使用 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# 如何检测 Netflix 是否正在运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54280947/