vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
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:     [ Jetzt bewerten ]Views:  8.594 
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.

Dieser Tipp wurde bereits 8.594 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle 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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel