2013-08-08 11 views
9

zmagamy się z następującym problemem na laptopy z przełączanymi grafiki (AMD Radeon 7670M + Intel 4000) w naszej aplikacji WPF:
Programowo określić, czy system ma przełączana grafika

D3DImage używamy, aby wyświetlić jakiś film pokazuje tylko czarna ramka. Dzieje się tak tylko wtedy, gdy dyskretna grafika (AMD) jest aktywna dla aplikacji (tryb ustawiony na wysoką wydajność). Z aktywną grafiką Intel (tryb ustawiony na oszczędzanie energii) działa. Wygląda na to, że nie jesteśmy sami z tym problemem. Wyszukiwanie w Google ujawniło następujące posty na forach AMD:

Znalazłem obejście korzystając D3DImage.CopyBackBuffer - wygląda na to Backbuffer rzeczywiście zawiera prawą ramkę - więc spróbuję to wyświetlić.

Ale aby zastosować to obejście tylko wtedy, gdy jest to konieczne, dochodzę do tematu tego pytania: Jak mogę się dowiedzieć, czy system faktycznie ma ma przełączalną grafikę?
Przypuszczam, że może być kilka sposobów korzystania z usługi WMI lub przeglądania rejestru, ale byłbym bardzo zadowolony, gdyby ktoś mógł wskazać mi właściwy kierunek lub nawet podać przykład, jak to zrobić.

Aktualizacja:

Próbowałem EnumDisplayDevices i System.Management.ManagementObjectSearcher. Pierwszy nie zwraca wszystkich urządzeń, podczas gdy drugi to robi. Ale może jest jeszcze lepszy sposób?

Odpowiedz

0

Wyszukiwanie według nazwiska kierowcy to inna odpowiedź. Ale nie jest całkowicie poprawne. Ponieważ możliwe jest zaktualizowanie sterownika. Więc wolę używać narzędzia System.Management.ManagementObjectSearcher.

1

Łącząc this question i this one rozwiązaniem byłoby wykorzystanie System.Management tak:

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(); 
    } 
} 

Mój sprzęt jest:

enter image description here

a wynik jest:

enter image description here

Ponieważ mam niezbyt prawdziwe urządzenie sprzętowe o nazwie "DameWare Development Mirror", można również spojrzeć na właściwość VideoProcessor. W przypadku NVidea i Intel będą miały one wartość, w przypadku nieistniejącego urządzenia będzie to wartość null.

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

enter image description here

i określić aktywną karta graficzna można sprawdzić, czy „CurrentBitsPerPixel” właściwość ma wartość

0

z niektórymi szczęścia można używać kwerend WMI, aby uzyskać te informacje z System.Management.ManagementObjectSearcher, ale może być bardzo ściśle powiązanym z wersjami Windows i sterownikami.

Myślę, że Twoim prawdziwym problemem jest brak kluczowego zdarzenia, gdy urządzenie sprzętowe zostanie utracone, a zasoby sprzętowe (powierzchnie i przydzielona pamięć VRAM) zostaną zrzucone. Spróbuj zasubskrybować takie wydarzenia, jak https://msdn.microsoft.com/en-us/library/system.windows.interop.d3dimage.isfrontbufferavailablechanged.aspx , aby przechwycić przełączanie i przebudować powierzchnie sprzętowe na nowy kontekst graficzny.

Powiązane problemy