vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: System/Windows · Desktop/Bildschirm/Display   |   VB-Versionen: VB2008, VB2010, VB201217.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 HerrmannBewertung:  Views:  8.604 
ohne HomepageSystem:  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.



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.