Bei Laptops mit umschaltbarer Grafik (AMD Radeon 7670M + Intel 4000) haben wir in unserer WPF-Anwendung folgendes Problem:
Das D3DImage , das wir verwenden, um einige Videos anzuzeigen, zeigt nur a schwarzer Rahmen. Dies geschieht nur, wenn die diskrete Grafik (AMD) für die Anwendung aktiv ist (Modus auf hohe Leistung eingestellt). Bei aktivierter Intel-Grafik (Energiesparmodus) funktioniert es. Es sieht so aus, als wären wir mit diesem Problem nicht allein. Eine Suche bei Google ergab die folgenden Posts in den AMD Foren:
Ich habe eine Problemumgehung mit D3DImage.CopyBackBuffer gefunden - Es sieht so aus, als ob der Backbuffer tatsächlich den richtigen Frame enthält - also werde ich versuchen, das stattdessen anzuzeigen.
Aber um diese Problemumgehung nur dann anzuwenden, wenn es notwendig ist, bringt mich das zum Thema dieser Frage: Wie finde ich heraus, ob das System tatsächlich umschaltbare Grafiken hat?
Ich nehme an, es könnte einige Wege geben, WMI zu benutzen oder durch die Registry zu schauen, aber ich würde mich freuen, wenn mir jemand in die richtige Richtung zeigen könnte oder vielleicht sogar ein Beispiel dafür hätte.
Aktualisierung:
Ich habe versucht EnumDisplayDevices und System.Management.ManagementObjectSearcher. Das erste, das nicht alle Geräte zurückgibt, während das letztere tut. Aber vielleicht gibt es noch einen besseren Weg?
Kombiniert diese Frage und dieser wäre die Lösung, System.Management wie folgt zu verwenden:
> %Vor%Meine Hardware ist:
Und das Ergebnis ist:
Da ich ein nicht-wirklich-Hardware-Gerät namens "DameWare Development Mirror" habe, können Sie sich auch die VideoProcessor-Eigenschaft ansehen. Für NVidea und Intel haben sie ihren Wert, für nicht vorhandene Geräte gibt es null.
%Vor%Und um eine aktive Grafikkarte zu bestimmen, können Sie prüfen, ob die "CurrentBitsPerPixel" Eigenschaft einen Wert
hatVielleicht ist die Suche nach dem Treibernamen eine andere Antwort. Aber ist nicht ganz richtig. Weil es möglich ist, den Fahrer zu aktualisieren. Daher bevorzuge ich die Verwendung von System.Management.ManagementObjectSearcher.
Mit etwas Glück können Sie WMI-Abfragen verwenden, um diese Informationen mit System.Management.ManagementObjectSearcher
zu erhalten, aber es könnte sehr eng an Windows- und Treiberversionen gekoppelt sein.
Ich denke, dass Ihr echtes Problem darin besteht, dass Sie das Schlüsselereignis verpassen, wenn Hardwaregeräte verloren gehen und hardwarebezogene Ressourcen (Oberflächen und VRAM-Speicher) ausgelagert werden. Versuchen Sie, Ereignisse wie diese zu abonnieren Ссылка um die Schaltung zu erfassen und Ihre Hardware-Oberflächen auf den neuen Grafikkontext umzustellen.