Laden...

Enumerate physical monitors

Erstellt von esskar vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.845 Views
esskar Themenstarter:in
203 Beiträge seit 2006
vor 15 Jahren
Enumerate physical monitors

Hi,

ich würde gerne die die monitore enumerieren.
Zunächst hab ich die Screen Klasse aus System.Windows.Forms probiert.
Die liefert auf meinem System (Matrox Karte, 3 Monitore im Stretched mode: heißt auflösung 3840x1024) nur einen Screen. An der Grafikkarte hängen aber 3 Monitore.
Es müsste also einen Weg geben, die Grafikkarte direkt zu fragen.
Hat da jemand ne Idee?

J
66 Beiträge seit 2008
vor 15 Jahren

Hi,

inwieweit und ob das mit den 'normalen'(.NET etc) Methoden geht weiß ich nicht!
Du kannst aber API's wie Direct3D/OGL oder auch XNA dafür verwenden.

Habe mal eine Facharbeit zur Grafikkartenenumeration mit D3D geschrieben und eine Komponente die einem bei der Enumeration mit XNA unterstützt. Zweiteres ist aber noch nicht 100% fertig und hat noch Fehler bei Multisampling im Zusammenhang ob windowed mode oder nicht!Denke aber nicht das du das brauchst da du wohl ansonsten dich gleich um die Möglichkeiten der API's gekümmert hättest!

Oder du schaust einfach in die MSDN wenn es dir nur um die Bestimmung der Adapteranzahl(Monitore) geht. Das is mit wenigen Zeilen getan...
Bei XNA wäre das einfach Adapters vom GraphicsAdapter und bei Direct3D GetAdapterCount() vom Device direkt 😉

mfg

230 Beiträge seit 2007
vor 15 Jahren

Hi! AFAIK geht das nicht direkt mit C#. Die entsprechende API-Funktion mit der man es realisieren kann, heißt: EnumDisplayDevices. HTH - sarabande

H
704 Beiträge seit 2003
vor 15 Jahren

Über die WMI-Klasse Win32_DesktopMonitor vielleicht?

[last.fm](http://www.last.fm/user/hauptmanAlpha/)
K
593 Beiträge seit 2007
vor 15 Jahren

Hallo,

also so eine ähnliche Frage gabs schonmal und da hab ich auch schon ein link auf Codeproject gepackt gehabt wo jemand ein ScreenSaver für mehrere Monitore geschrieben hat. Wenn deine Grafikkarte deinem System vorgaukelt das nur ein Monitor angeschlossen ist hast du ein Problem. Dann wüsste ich nicht wie man es einzeln herauskriegen würde. Wahrscheinlich nur über eine API von Matrox selbst.

Gruß Daniel

esskar Themenstarter:in
203 Beiträge seit 2006
vor 15 Jahren

genau.

folgendes snippet hat mir auch nicht geholfen:


using System;
using System.Runtime.InteropServices;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

class MainClass
{
    [STAThread]
    static void Main(string[] args)
    {
        foreach (AdapterInformation adapterInfo in Manager.Adapters)
        {
            Console.WriteLine("{0}", adapterInfo.CurrentDisplayMode);            
        }
    }
}

Output:

Height: 1024
Width: 3840
RefreshRate: 60
Format: X8R8G8B8

esskar Themenstarter:in
203 Beiträge seit 2006
vor 15 Jahren

wo hingegen


[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct DISPLAY_DEVICE
    {
        [MarshalAs(UnmanagedType.U4)]
        public int cb;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string DeviceName;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceString;

        [MarshalAs(UnmanagedType.U4)]
        public uint StateFlags;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceID;

        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceKey;
    }


    [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Unicode)]
    static extern bool EnumDisplayDevicesW(string lpDevice, int iDevNum,
       ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags);

    [STAThread]
    static void Main(string[] args)
    {
        DISPLAY_DEVICE d = new DISPLAY_DEVICE();
        d.cb = Marshal.SizeOf(d);
        try
        {
            for (int id = 0; EnumDisplayDevicesW(null, id, ref d, 0); id++)
            {
                Console.WriteLine(
                    String.Format("{0}, {1}, {2}, {3}, {4}, {5}",
                             id,
                             d.DeviceName,
                             d.DeviceString,
                             d.StateFlags,
                             d.DeviceID,
                             d.DeviceKey
                             )
                              );
                d.cb = Marshal.SizeOf(d);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(String.Format("{0}", ex.ToString()));
        }
    }

Output:
0, \\.\DISPLAY1, Matrox Parhelia APVe , 5, PCI\VEN_102B&DEV_2538&SUBSYS_0947102B&REV_02, \Registry\Machine\System\Curren tControlSet\Control\Video\{CEDE138E-8FC1-4727-996A-6CC6FBABC14B}\0000 1, \\.\DISPLAYV1, NetMeeting driver, 8, , \Registry\Machine\System\CurrentControlSet\Control\Video\{8B6D7859-A639-4A15-8 790-7161976D057A}\0000 2, \\.\DISPLAYV2, RDPDD Chained DD, 8, , \Registry\Machine\System\CurrentControlSet\Control\Video\{DEB039CC-B704-4F53-B4 3E-9DD4432FA2E9}\0000

mal sehen, was ich noch so finde.

K
593 Beiträge seit 2007
vor 15 Jahren

Hallo esskar,

ich weiß nicht ob du meinen Post nicht richtig gelesen hast, aber beide Snippets von dir bringen dir nur 1 großen monitor. Bei dem 2ten Snippet kommen noch Sachen wie NetMeeting mit raus als Treiber für Übertragungen von Video. Aber so wie es bei dir eingestellt ist gauckelt der Matrox Treiber nur 1 Monitor vor. D.h. du musst, wenn es eine gibt, auf eine API von Matrox zur Ansteuerung zurückgreifen.

Gruß Daniel

esskar Themenstarter:in
203 Beiträge seit 2006
vor 15 Jahren

Über die WMI-Klasse
>
vielleicht?

nee, leider auch nicht


strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_DesktopMonitor",,48) 
For Each objItem in colItems 
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "Win32_DesktopMonitor instance"
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "ScreenWidth: " & objItem.ScreenWidth
Next

Output: `

Win32_DesktopMonitor instance

ScreenWidth: 3840`

esskar Themenstarter:in
203 Beiträge seit 2006
vor 15 Jahren

ja, hab es gelesen.
Wollte nur zeigen, wie es nicht geht. falls mal jemand nochmal sucht.
Mit der Grafikkarten API zu liebäugeln hab ich auch schon überlegt, nur kann es ja auch andere hersteller geben, deren api ich nicht zur verfügung hab.
hatte gehofft, es gibt da irgendetwas generisches.

230 Beiträge seit 2007
vor 15 Jahren

Hi! Die Remarks in der MSDN zu EnumDisplayDevices sind von fundamenteller Bedeutung! 😉 HTH - sarabande