Как написать код, чтобы получить direct X version на моей машине в C#? [дубликат]


На этот вопрос уже есть ответ здесь:

Я хочу знать, когда пользователь нажимает на пункт меню, он должен знать версию direct X, установленную на его машине?

Я хочу закодировать это в C# в VS2008.

Что я должен написать в пункте меню click event? Я новичок в C#, поэтому не знаю, с чего начать..

Кто-нибудь может помочь? Спасибо..

2 4

2 ответа:

Это может помочь: .NET как определить, поддерживается ли DirectX 10?.

Правка:

Ниже приведен некоторый лучший код, я думаю. Лучшее, что я могу придумать, - это проверка на основе версии Windows в случае DX10 или DX11. Это не 100% точно (потому что Vista можно обновить до DX11, но я не проверяю это), но лучше, чем ничего.

    private int GetDirectxMajorVersion()
    {
        int directxMajorVersion = 0;

        var OSVersion = Environment.OSVersion;

        // if Windows Vista or later
        if (OSVersion.Version.Major >= 6)
        {
            // if Windows 7 or later
            if (OSVersion.Version.Major > 6 || OSVersion.Version.Minor >= 1)
            {
                directxMajorVersion = 11;
            }
            // if Windows Vista
            else
            {
                directxMajorVersion = 10;
            }
        }
        // if Windows XP or earlier.
        else
        {
            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\DirectX"))
            {
                string versionStr = key.GetValue("Version") as string;
                if (!string.IsNullOrEmpty(versionStr))
                {
                    var versionComponents = versionStr.Split('.');
                    if (versionComponents.Length > 1)
                    {
                        int directXLevel;
                        if (int.TryParse(versionComponents[1], out directXLevel))
                        {
                            directxMajorVersion = directXLevel;
                        }
                    }
                }
            }
        }

        return directxMajorVersion;
    }

Нашел этот вопрос связанным с другим, но я вижу, что решение не является эффективным, поэтому я публикую свою идею о том, как решить проблему. Но будьте осторожны: это очень, очень медленно.

EDIT: удален метод проверки реестра, так как он работает только для Dx

Этот метод очень, очень медленный, но я вычислил только один, который на 100% точен

private static int checkdxversion_dxdiag()
{
    Process.Start("dxdiag", "/x dxv.xml");
    while (!File.Exists("dxv.xml"))
        Thread.Sleep(1000);
    XmlDocument doc = new XmlDocument();
    doc.Load("dxv.xml");
    XmlNode dxd = doc.SelectSingleNode("//DxDiag");
    XmlNode dxv = dxd.SelectSingleNode("//DirectXVersion");

    return Convert.ToInt32(dxv.InnerText.Split(' ')[1]);
}