Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Enumerate physical monitors
esskar
myCSharp.de - Member

Avatar #avatar-2885.jpg


Dabei seit:
Beiträge: 203
Herkunft: Dubai

Themenstarter:

Enumerate physical monitors

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
J2T
myCSharp.de - Member



Dabei seit:
Beiträge: 66
Herkunft: Bärlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sarabande
myCSharp.de - Member

Avatar #avatar-2450.jpg


Dabei seit:
Beiträge: 230

beantworten | zitieren | melden

Hi! AFAIK geht das nicht direkt mit C#. Die entsprechende API-Funktion mit der man es realisieren kann, heißt: EnumDisplayDevices. HTH - sarabande
private Nachricht | Beiträge des Benutzers
hauptmann
myCSharp.de - Member



Dabei seit:
Beiträge: 704
Herkunft: Österreich/Kärnten

beantworten | zitieren | melden

Über die WMI-Klasse Win32_DesktopMonitor vielleicht?
private Nachricht | Beiträge des Benutzers
Kaji
myCSharp.de - Member



Dabei seit:
Beiträge: 593
Herkunft: Clausthal-Zellerfeld

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
esskar
myCSharp.de - Member

Avatar #avatar-2885.jpg


Dabei seit:
Beiträge: 203
Herkunft: Dubai

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
esskar
myCSharp.de - Member

Avatar #avatar-2885.jpg


Dabei seit:
Beiträge: 203
Herkunft: Dubai

Themenstarter:

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von esskar am .
private Nachricht | Beiträge des Benutzers
Kaji
myCSharp.de - Member



Dabei seit:
Beiträge: 593
Herkunft: Clausthal-Zellerfeld

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
esskar
myCSharp.de - Member

Avatar #avatar-2885.jpg


Dabei seit:
Beiträge: 203
Herkunft: Dubai

Themenstarter:

beantworten | zitieren | melden

Zitat von hauptmann
Über die WMI-Klasse Win32_DesktopMonitor 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
private Nachricht | Beiträge des Benutzers
esskar
myCSharp.de - Member

Avatar #avatar-2885.jpg


Dabei seit:
Beiträge: 203
Herkunft: Dubai

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
sarabande
myCSharp.de - Member

Avatar #avatar-2450.jpg


Dabei seit:
Beiträge: 230

beantworten | zitieren | melden

Hi! Die Remarks in der MSDN zu EnumDisplayDevices sind von fundamenteller Bedeutung! ;-) HTH - sarabande
private Nachricht | Beiträge des Benutzers