2013-08-08 5 views
9

stiamo lottando con il seguente problema su computer portatili con grafica commutabile (AMD Radeon 7670M + Intel 4000) nella nostra applicazione WPF:
livello di programmazione determinare se il sistema ha una grafica commutabile

Il D3DImage che utilizziamo per visualizzare alcuni video mostra solo una cornice nera. Ciò si verifica solo quando la grafica discreta (AMD) è attiva per l'applicazione (modalità impostata su prestazioni elevate). Con la grafica Intel attiva (modalità impostata per il risparmio energetico) funziona. Sembra che non siamo soli con questo problema. Una ricerca su Google ha rivelato i seguenti messaggi nei forum di AMD:

ho trovato una soluzione utilizzando D3DImage.CopyBackBuffer - sembra che il backbuffer effettivamente contiene la giusta cornice - quindi proverò a mostrarlo.

Ma per applicare questa soluzione alternativa solo quando è necessario, questo mi porta all'argomento di questa domanda: Come faccio a sapere se il sistema in realtà ha una grafica selezionabile?
Suppongo che potrebbero esserci modi per utilizzare WMI o consultare il registro, ma sarei molto felice se qualcuno potesse indicarmi la giusta direzione o magari avere un esempio su come farlo.

Aggiornamento:

ho cercato EnumDisplayDevices e System.Management.ManagementObjectSearcher. Il primo non restituisce tutti i dispositivi mentre quest'ultimo lo fa. Ma forse c'è ancora un modo migliore?

risposta

0

Forse cercare il nome del driver è un'altra risposta. Ma non è completamente corretto. Perché è possibile aggiornare il driver. Quindi preferisco usare System.Management.ManagementObjectSearcher.

1

Combinando this question e this one la soluzione sarebbe quella di utilizzare System.Management come questo:

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

Il mio hardware è:

enter image description here

E il risultato è:

enter image description here

Dato che ho un dispositivo non-veramente-hardware chiamato "DameWare Development Mirror", puoi anche guardare la proprietà VideoProcessor. Per NVidea e Intel avranno il loro valore, per il dispositivo non esistente ci sarà nulla.

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

enter image description here

E per determinare scheda video attiva si può verificare se "CurrentBitsPerPixel" proprietà ha valore

0

Con un po 'di fortuna è possibile utilizzare query WMI per ottenere tali informazioni con System.Management.ManagementObjectSearcher, ma potrebbe essere molto strettamente abbinato a Windows e versioni dei driver.

Penso che il tuo vero problema è che ti manca l'evento chiave quando il dispositivo hardware viene perso e le risorse relative all'hardware (superfici e memoria allocata VRAM) vengono scaricate. Prova ad iscriverti ad eventi come questo https://msdn.microsoft.com/en-us/library/system.windows.interop.d3dimage.isfrontbufferavailablechanged.aspx per catturare il passaggio e ricostruire le tue superfici hardware nel nuovo contesto grafico.