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?
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
Hi! AFAIK geht das nicht direkt mit C#. Die entsprechende API-Funktion mit der man es realisieren kann, heißt: EnumDisplayDevices. HTH - sarabande
Über die WMI-Klasse Win32_DesktopMonitor vielleicht?
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
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);
}
}
}
Height: 1024
Width: 3840
RefreshRate: 60
Format: X8R8G8B8
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.
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
Ü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
ScreenWidth: 3840`
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.
Hi! Die Remarks in der MSDN zu EnumDisplayDevices sind von fundamenteller Bedeutung! 😉 HTH - sarabande