Rubrik: System/Windows · Desktop/Bildschirm/Display | VB-Versionen: VB2008, VB2010, VB2012 | 17.04.13 |
Ermitteln der Zuordnung von Displayname zu Monitorname (Produktname) Im Tipp wird eine Funktion aufgezeigt, mit der man auf einem Multiscreen-System die Zuordnung von Displayname zu Monitorname (Produktname) ermitteln kann. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 8.604 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Ich brauchte für mein Programm eine Combobox, mittels der ein User einen speziellen Monitor aus seinem Multiscreen-System auswählen kann. Die Auswahl soll anhand der Produktnamen der Monitore erfolgen können. Durch diese Auswahl wird gleichzeitig der dem Monitor zugeordnete Displayname bereitgestellt (über diesen kann man dann ermitteln, ob der gewählte Monitor der PrimaryScreen ist oder nicht, u.ä.).
Das Ganze wird über die API-Funktion EnumDisplayDevices realisiert.
Imports System.Runtime.InteropServices Module Module1 <DllImport("user32.dll")> _ Private Function EnumDisplayDevices(ByVal lpDevice As String, _ ByVal iDevNum As Integer, _ ByRef lpDisplayDevice As DISPLAY_DEVICE, _ ByVal dwFlags As Integer) As Boolean End Function ' Benötigte API-Struktur Public Structure DISPLAY_DEVICE <MarshalAs(UnmanagedType.U4)> _ Public cb As Integer <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> _ Public DeviceName As String <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> _ Public DeviceString As String <MarshalAs(UnmanagedType.U4)> _ Public StateFlags As Integer <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> _ Public DeviceID As String <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> _ Public DeviceKey As String End Structure Public Function GetSystemDisplayDevices() As Dictionary(Of String, String) Dim drf As New Dictionary(Of String, String) Dim iDevNum As Long, sDeviceName As String Dim dev As DISPLAY_DEVICE ' Abfrage aller Display-Geräte im System durch den Aufruf von ' EnumDisplayDevices in einer Schleife, ' beginnend mit iDevNum = 0, und erhöhen, bis die Funktion fehlschlägt ' (Aufruf gibt nicht Null zurück, wenn wahr oder 0, wenn false). dev.cb = Marshal.SizeOf(dev) iDevNum = 0 Do While EnumDisplayDevices(vbNullString, iDevNum, dev, 0&) sDeviceName = dev.DeviceName ' Wenn als lpDevice null zurückgegeben wurde, ist es eine Information ' über den Adapter des Displays. ' Durch den erneuten Aufruf der API-Funktion, dieses Mal unter Angabe ' lpDevice = dev.devicename und iDevNum = 0, gibt der Aufruf ' Informationen über den angeschlossenen Monitor am speziellen Gerät zurück. If EnumDisplayDevices(sDeviceName, 0, dev, 0&) <> 0 Then drf.Add((iDevNum + 1).ToString & " - " & dev.DeviceString, _ Replace(Replace(sDeviceName, ".", ""), "\", "")) End If iDevNum += 1 Loop Return drf End Function End Module
Die Funktion "GetSystemDisplayDevices" stellt die benötigten Daten bereit, und zwar in Form eines Dictionary. Grund dafür ist die spätere Zuordnung der Monitordaten zu einer Combobox.
Im Programm selbst schreibt man an der erforderlichen Stelle den Code für den Aufruf, unter der Voraussetzung folgender Vereinbarung:
Dim displ As Dictionary(Of String, String)
Und nun kann man die Auflistung der Combobox erzeugen:
displ = GetSystemDisplayDevices() With ComboBox1 If displ.Count > 0 Then .DataSource = New BindingSource(displ, Nothing) .ValueMember = "Value" .DisplayMember = "Key" End If End With
Im SelectedIndexChanged-Ereignis der Combobox erhält man mittels...
Dim DisplayName As String = DirectCast(ComboBox1.SelectedItem, _ KeyValuePair(Of String, String)).Value Dim MonitorName As String = Split(DirectCast(ComboBox1.SelectedItem, _ KeyValuePair(Of String, String)).Key, " - ")(1)
...jeweils die ausgewählten Daten.