9

我们在 WPF 应用程序中使用可切换显卡(AMD Radeon 7670M + Intel 4000)的笔记本电脑上遇到以下问题:

我们用来显示一些视频的D3DImage只显示一个黑框。仅当应用程序的独立显卡 (AMD) 处于活动状态时(模式设置为高性能),才会发生这种情况。在英特尔显卡处于活动状态(模式设置为省电)的情况下,它可以工作。看起来我们并不孤单。谷歌搜索显示 AMD 论坛中的以下帖子:

我找到了使用D3DImage.CopyBackBuffer的解决方法- 看起来后台缓冲区确实包含正确的帧 - 所以我将尝试显示它。

但是为了仅在必要时应用此解决方法,这使我想到了这个问题的主题:如何确定系统是否确实具有可切换图形?
我想可能有一些使用 WMI 或查看注册表的方法,但如果有人能指出我正确的方向,或者甚至可能有一个如何这样做的例子,我会很高兴。

更新:

我试过 EnumDisplayDevices 和 System.Management.ManagementObjectSearcher。第一个不返回所有设备,而后者返回。但也许还有更好的方法?

4

3 回答 3

1

结合这个问题这个问题,解决方案是像这样使用 System.Management :

internal class Program
{
    private static void Main(string[] args)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController");
        var mos = searcher.Get();
        foreach (ManagementObject mo in mos)
        {
            foreach (PropertyData property in mo.Properties)
            {
                if (property.Name == "Description")
                {
                    Console.WriteLine(property.Value);
                }
            }
        }
        Console.ReadKey();
    }
}

我的硬件是:

在此处输入图像描述

结果是:

在此处输入图像描述

由于我有一个名为“DameWare Development Mirror”的非硬件设备,您还可以查看 VideoProcessor 属性。对于 NVidea 和 Intel,它们将有其价值,对于不存在的设备,它们将是 null。

if (property.Name == "Description")
   Console.WriteLine(property.Value);
if (property.Name == "VideoProcessor")
   Console.WriteLine(property.Value);

在此处输入图像描述

并且要确定活动视频卡,您可以检查“CurrentBitsPerPixel”属性是否具有价值

于 2015-08-27T09:16:23.413 回答
0

可能正在搜索驱动程序名称是另一个答案。但也不完全正确。因为有可能更新驱动程序。所以我更喜欢使用 System.Management.ManagementObjectSearcher。

于 2013-08-13T21:16:50.310 回答
0

运气好的话,您可以使用 WMI 查询来获取该信息System.Management.ManagementObjectSearcher,但它可能与 Windows 和驱动程序版本紧密耦合。

我认为您真正的问题是当硬件设备丢失并且硬件相关资源(表面和 VRAM 分配的内存)被转储时,您错过了关键事件。尝试订阅此类事件https://msdn.microsoft.com/en-us/library/system.windows.interop.d3dimage.isfrontbufferavailablechanged.aspx 以捕捉切换并将硬件表面重建到新的图形上下文。

于 2015-08-29T15:14:44.707 回答