如何在我的机器上用C#编写代码以获得直接的X版本

本文关键字:版本 代码 我的 机器 | 更新日期: 2023-09-27 17:57:56

我想知道当用户单击菜单项时,他应该能够知道机器上安装的直接X版本?

我想在VS2008中用C#对此进行编码。

我应该在菜单项单击事件中写些什么?我是C#的初学者,所以不知道从哪里开始。。

有人能帮忙吗?谢谢

如何在我的机器上用C#编写代码以获得直接的X版本

这可能会有所帮助:.NET如何检测是否支持DirectX 10?。

编辑:

下面是一些我认为更好的代码。我能想到的最好的办法是在DX10或DX11的情况下,基于Windows版本进行检查。这不是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<9(thx@Telanor)

这种方法非常非常慢,但我发现只有一种方法是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]);
}