Как написать код, чтобы получить direct X version на моей машине в C#? [дубликат]
На этот вопрос уже есть ответ здесь:
Я хочу знать, когда пользователь нажимает на пункт меню, он должен знать версию direct X, установленную на его машине?
Я хочу закодировать это в C# в VS2008.
Что я должен написать в пункте меню click event? Я новичок в C#, поэтому не знаю, с чего начать..
Кто-нибудь может помочь? Спасибо..
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]); }