9

WPF アプリケーションで、切り替え可能なグラフィック (AMD Radeon 7670M + Intel 4000) を備えたラップトップで次の問題に取り組んでいます。

一部のビデオを表示するために使用するD3DImageには、黒いフレームしか表示されません。これは、ディスクリート グラフィックス (AMD) がアプリケーションに対してアクティブな場合 (モードが高パフォーマンスに設定されている場合) にのみ発生します。Intel グラフィックスがアクティブな状態 (モードが省電力に設定されている) で動作します。この問題は私たちだけではないようです。Google で検索すると、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

運が良ければ、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 に答える