Dialog-Fenster für Monitor-View und Monitor-Auswahl

    • VB.NET
    • .NET (FX) 4.5–4.8

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Dideldum.

      Dialog-Fenster für Monitor-View und Monitor-Auswahl

      Hi Freunde,

      Ich habe eine Form "Monitor Display-Manager" geknotet, welche alle an den PC angeschlossene und eingeschaltete Screens, deren Positionen und sonstige Eigenschaften anzeigt.

      Falls mal jemand so einen Dialog braucht - hier der Code:

      Erforderlich sind nur folgende zwei My.Settings-Einträge, um Form.Location und Form.Size zu speichern:
      My.Settings.Form_MonitorDisplayManager_Location
      My.Settings.Form_MonitorDisplayManager_Size

      Spoiler anzeigen

      Quellcode

      1. Imports System.Windows.Forms
      2. Imports System.Drawing
      3. Imports System.Threading.Tasks
      4. Imports System.Linq
      5. Imports System.Runtime.InteropServices
      6. Imports System.Threading
      7. Imports System.Reflection.Emit
      8. #Region "Information zur Bedienung"
      9. ' Propertys
      10. '
      11. ' MonitorDisplayManager_Fenster_Als_MonitorAuswahl (Boolean) :
      12. ' True = Zeigt einen "Monitor-Auswahl"-Dialog mit Action-Button "OK" (Schliesst die Form)
      13. ' False = Zeigt einen "Monitor-Viewer"-Dialog mit Action-Button "Information" (Bei Klick: Anzeige der Overlays mit den jeweiligen Monitornummern auf allen Monitoren)
      14. ' OK_Button_Pressed (Boolean):
      15. ' True, wenn der "OK"-Button (bei MonitorDisplayManager_Fenster_Als_MonitorAuswahl = true) angeklickt wird
      16. ' False, wenn das Fenster ausge-x-t wird
      17. '
      18. ' Monitor_Auswahl_MonitorNummer (Integer):
      19. ' Beinhaltet nach der Auswahl eines Monitors dessen MonitorNummer bzw. nach dem Schliessen der Form die MonitorNummer des selektierten Monitors.
      20. ' Form_Hintergrundfarbe (Color):
      21. ' Stellt die Hintergrundfarbe des freien Form-Bereichs links und rechts des Panels ein, wenn die Form.Width > Panel.width aufgezogen wird
      22. ' Monitor_Panel_Hintergrundfarbe (Color):
      23. ' Setzt die Hintergrundfarbe des Panels auf welchem sich die Monitor-Buttons befinden
      24. ' Monitor_Buttons_Font (Font):
      25. ' Setzt die Schriftart der Monitor-Buttons
      26. '
      27. ' Monitor_Buttons_Schriftfarbe (Color):
      28. ' Setzt die Schriftfarbe der Monitor-Buttons
      29. '
      30. ' Monitor_Buttons_Hintergrundfarbe (Color):
      31. ' Setzt die Hintergrundfarbe der Monitor-Buttons
      32. '
      33. ' Monitor_SelektierterButton_Hintergrundfarbe (Color):
      34. ' Setzt die Hintergrundfarbe des ausgewählten Monitor-Buttons
      35. '
      36. ' ActionButton_Font (Font):
      37. ' Setzt die Schriftart des Action-Buttons ("OK" bzw. "Identifizieren")
      38. '
      39. ' ActionButton_Schriftfarbe (Color):
      40. ' Setzt die Schriftfarbe des Action-Buttons ("OK" bzw. "Identifizieren")
      41. '
      42. ' ActionButton_Hintergrundfarbe (Color):
      43. ' Setzt die Hintergrundfarbe des Action-Buttons ("OK" bzw. "Identifizieren")
      44. '
      45. ' Monitor_Information_TextBox_Font (Font):
      46. ' Setzt die Schriftart der Monitor-Information Textbox
      47. '
      48. ' Monitor_Information_TextBox_Schriftfarbe (Color):
      49. ' Setzt die Schriftfarbe der Monitor-Information Textbox
      50. '
      51. ' Monitor_Information_TextBox_Hintergrundfarbe (Color):
      52. ' Setzt die Hintergrundfarbe der Monitor-Information Textbox
      53. '
      54. ' Overlay_Position (Integer):
      55. ' Struktur "Overlay_Corner" TopLeft = 0, TopRight = 1, BottomLeft = 2, BottomRight = 3
      56. ' Stellt die AnzeigeEcke der Monitor Overlays ein
      57. '
      58. ' Overlay_AnzeigenBeiMonitorClick (Boolean):
      59. ' Schaltet Anzeige des Monitor-Overlays beim Anklicken eines Monitor-Buttons Ein/Aus
      60. ' True = Beim Anklicken eines Monitor-Buttons wird das Overlay mit der Monitornummer im angeklickten Monitor angezeigt
      61. ' False = Beim Anklicken eines Monitor-Buttons wird kein Overlay angezeigt
      62. '
      63. ' Overlay_Opacity (Integer):
      64. ' Stellt die Transparenz der Monitor Overlays ein (0 = voll Transparent - 1 = keine Transparenz)
      65. '' Overlay_AnzeigeDauer (Integer):
      66. ' Setzt die Anzeigedauer (In ms) der Overlays mit Ausgabe der Monitor-Nummer
      67. '
      68. ' Overlay_Breite (Integer):
      69. ' Setzt die Breite der Overlays mit Ausgabe der Monitor-Nummer durch vor und nach der Monitornummer eingefügte Leerzeichen (zulässige Werte 0 - 5)
      70. '
      71. ' Overlay_Font (Font):
      72. ' Setzt die Schriftart der Overlays mit Ausgabe der Monitor-Nummer
      73. '
      74. ' Overlay_Schriftfarbe (Color):
      75. ' Setzt die Schriftfarbe der Overlays mit Ausgabe der Monitor-Nummer
      76. '
      77. ' Overlay_Hintergrundfarbe (Color):
      78. ' Setzt die Hintergrundfarbe der Overlays mit Ausgabe der Monitor-Nummer
      79. '
      80. '
      81. ' Public Funktionen
      82. '
      83. ' Aufruf aus anderen Formen wie z.B. dem Mainform
      84. '
      85. ' Form_MonitorDisplayManager.Initialize
      86. ' Öffnet das Fenster MonitorDisplayManager als Dialog-Fenster
      87. '
      88. ' Public Form_MonitorDisplayManager.MonitorArrayAufbauen()
      89. ' Erstellt das Array Form_MonitorDisplayManager.Displays as Form_MonitorDisplayManager.Displayliste mit der Auflistung der Details aller Monitore
      90. '
      91. ' Public Form_MonitorDisplayManager.GetMonitorDetails(monitorNummer) as Form_MonitorDisplayManager.DisplayListe
      92. ' Liefert die Details des Monitors mit der MonitorNummer als DisplayListe
      93. ' Aufruf: Dim MonitorDetails as Form_MonitorDisplayManager.Displayliste
      94. ' MonitorDetails = Form_MonitorDisplayManager.GetMonitorDetails(monitorNummer)
      95. #End Region
      96. #Region "Strukturen"
      97. <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)>
      98. Public Structure DEVMODE
      99. Private Const CCHDEVICENAME As Integer = 32
      100. Private Const CCHFORMNAME As Integer = 32
      101. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHDEVICENAME)>
      102. Public dmDeviceName As String
      103. Public dmSpecVersion As Short
      104. Public dmDriverVersion As Short
      105. Public dmSize As Short
      106. Public dmDriverExtra As Short
      107. Public dmFields As Integer
      108. Public dmPositionX As Integer
      109. Public dmPositionY As Integer
      110. Public dmDisplayOrientation As Integer
      111. Public dmDisplayFixedOutput As Integer
      112. Public dmColor As Short
      113. Public dmDuplex As Short
      114. Public dmYResolution As Short
      115. Public dmTTOption As Short
      116. Public dmCollate As Short
      117. <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=CCHFORMNAME)>
      118. Public dmFormName As String
      119. Public dmLogPixels As Short
      120. Public dmBitsPerPel As Integer
      121. Public dmPelsWidth As Integer
      122. Public dmPelsHeight As Integer
      123. Public dmDisplayFlags As Integer
      124. Public dmDisplayFrequency As Integer
      125. Public dmICMMethod As Integer
      126. Public dmICMIntent As Integer
      127. Public dmMediaType As Integer
      128. Public dmDitherType As Integer
      129. Public dmReserved1 As Integer
      130. Public dmReserved2 As Integer
      131. Public dmPanningWidth As Integer
      132. Public dmPanningHeight As Integer
      133. End Structure
      134. <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)>
      135. Public Structure DisplayListe
      136. Public MonitorNummer As Integer
      137. Public MonitorNummerLogisch As Integer
      138. Public MonitorName As String
      139. Public MonitorArt As Integer
      140. Public SkalierungDetected As Integer
      141. Public SkalierungCalculated As Integer
      142. Public SkalierungMaximal As Integer
      143. Public LogischeAuflösung As Size
      144. Public PhysikalischeAuflösung As Size
      145. Public Position As Point
      146. End Structure
      147. Public Enum DpiType
      148. Effective = 0
      149. Angular = 1
      150. Raw = 2
      151. End Enum
      152. Public Enum Overlay_Corner
      153. LeftTop = 0
      154. RightTop = 1
      155. LeftBottom = 2
      156. RightBottom = 3
      157. End Enum
      158. #End Region
      159. Public Class Form_MonitorDisplayManager
      160. #Region "Variablen-Zuweisungen"
      161. Public displays(15) As DisplayListe
      162. Private isLoaded As Boolean
      163. ' Default-Propertys
      164. Private _MonitorDisplayManager_Fenster_Als_MonitorAuswahl As Boolean = True
      165. Private _Monitor_Auswahl_MonitorNummer As Integer = 0
      166. Private _OK_Button_Pressed As Boolean = False
      167. Private _Form_Hintergrundfarbe As Color = SystemColors.Window
      168. Private _Monitor_Panel_Hintergrundfarbe As Color = SystemColors.Window
      169. Private _Monitor_Buttons_Font As New Font("Microsoft Sans Serif", 11, FontStyle.Regular)
      170. Private _Monitor_Buttons_Schriftfarbe As Color = SystemColors.ControlText
      171. Private _Monitor_Buttons_Hintergrundfarbe As Color = SystemColors.ButtonFace
      172. Private _Monitor_SelektierterButton_Hintergrundfarbe As Color = Color.LightBlue
      173. Private _Action_Button_Font As New Font("Microsoft Sans Serif", 11, FontStyle.Regular)
      174. Private _Action_Button_Schriftfarbe As Color = SystemColors.ControlText
      175. Private _Action_Button_Hintergrundfarbe As Color = SystemColors.ButtonFace
      176. Private _Monitor_Information_Textbox_Font As New Font("Microsoft Sans Serif", 11, FontStyle.Regular)
      177. Private _Monitor_Information_TextBox_Schriftfarbe As Color = SystemColors.WindowText
      178. Private _Monitor_Information_TextBox_Hintergrundfarbe As Color = SystemColors.Window
      179. Private _Overlay_AnzeigenBeiMonitorClick As Boolean = True
      180. Private _Overlay_Position As Integer = Overlay_Corner.RightTop
      181. Private _Overlay_Opacity As Double = 0.5
      182. Private _Overlay_AnzeigeDauer As Integer = 5000
      183. Private _Overlay_Breite As Integer = 2
      184. Private _Overlay_Font As New Font("Microsoft Sans Serif", 60, FontStyle.Regular)
      185. Private _Overlay_Schriftfarbe As Color = Color.Yellow
      186. Private _Overlay_Hintergrundfarbe As Color = Color.Red
      187. #End Region
      188. #Region "Controls erstellen"
      189. Dim overlayTimer As System.Windows.Forms.Timer
      190. Dim OverlayPanels As New List(Of Form)
      191. Private panelMonitore As New Panel With {
      192. .Top = 0,
      193. .Left = 0,
      194. .Height = 350,
      195. .Width = 800,
      196. .BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle,
      197. .AutoScroll = True,
      198. .BackColor = Monitor_Panel_Hintergrundfarbe,
      199. .Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top
      200. }
      201. Private btnAction As New Button With {
      202. .Left = 0,
      203. .Height = 30,
      204. .Width = 800,
      205. .Text = "",
      206. .Font = Action_Button_Font,
      207. .ForeColor = Action_Button_Schriftfarbe,
      208. .BackColor = Action_Button_Hintergrundfarbe,
      209. .AutoSize = True,
      210. .Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Bottom
      211. }
      212. Private txtInfo As New TextBox With {
      213. .Left = 0,
      214. .Width = 800,
      215. .Multiline = True,
      216. .Font = Monitor_Information_TextBox_Font,
      217. .ForeColor = Monitor_Information_TextBox_Schriftfarbe,
      218. .BackColor = Monitor_Information_TextBox_Hintergrundfarbe,
      219. .ScrollBars = ScrollBars.None,
      220. .Anchor = AnchorStyles.Left Or AnchorStyles.Right Or AnchorStyles.Top Or AnchorStyles.Bottom
      221. }
      222. #End Region
      223. #Region "DLLS"
      224. ' Monitor Auflistung
      225. <DllImport("user32.dll", SetLastError:=True)>
      226. Public Shared Function MonitorFromPoint(pt As Point, flags As UInteger) As IntPtr
      227. End Function
      228. <DllImport("shcore.dll", SetLastError:=True)>
      229. Public Shared Function GetDpiForMonitor(hmonitor As IntPtr, dpiType As Integer, ByRef dpiX As UInteger, ByRef dpiY As UInteger) As Integer
      230. End Function
      231. ' API-Definitionen für EnumDisplaySettings und EnumDisplayDevices
      232. <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
      233. Public Shared Function EnumDisplaySettings(ByVal deviceName As String, ByVal modeNum As Integer, ByRef devMode As DEVMODE) As Boolean
      234. End Function
      235. <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
      236. Public Shared Function EnumDisplayDevices(ByVal deviceName As String, ByVal deviceIndex As Integer, ByRef devMode As DEVMODE, ByVal dwFlags As Integer) As Boolean
      237. End Function
      238. #End Region
      239. #Region "Form-Funktionen"
      240. Public Sub Initialize()
      241. Me.ShowDialog()
      242. End Sub
      243. Public Sub New()
      244. Me.Visible = False
      245. Me.Opacity = 0
      246. Me.Size = New Size(816, 630)
      247. Me.MinimumSize = New Size(816, 630)
      248. Me.MinimizeBox = False
      249. Me.MaximizeBox = False
      250. Me.BackColor = Form_Hintergrundfarbe
      251. End Sub
      252. Private Sub Form_MonitorDisplayManager_Load(sender As Object, e As EventArgs) Handles MyBase.Load
      253. End Sub
      254. Private Sub Form_MonitorDisplayManager_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
      255. Me.Visible = True
      256. Dim mousePos As Point = Cursor.Position
      257. Dim screen As Screen = Screen.FromPoint(mousePos)
      258. If My.Settings.Form_MonitorDisplayManager_Location = New Point(-1, -1) Then
      259. Me.Location = New Point(CInt((screen.WorkingArea.Left + (screen.WorkingArea.Size.Width - Me.MinimumSize.Width) / 2)), CInt((screen.WorkingArea.Top + (screen.WorkingArea.Size.Height - Me.MinimumSize.Height) / 2)))
      260. Else
      261. Me.Location = My.Settings.Form_MonitorDisplayManager_Location
      262. End If
      263. If My.Settings.Form_MonitorDisplayManager_Size = New Size(-1, -1) Then
      264. Me.Size = New Size(Me.MinimumSize.Width, Me.MinimumSize.Height)
      265. Else
      266. Me.Size = My.Settings.Form_MonitorDisplayManager_Size
      267. End If
      268. 'Controls hinzufügen
      269. Me.Controls.Add(panelMonitore)
      270. Me.Controls.Add(btnAction)
      271. btnAction.Top = Me.ClientSize.Height - btnAction.Height
      272. Me.Controls.Add(txtInfo)
      273. txtInfo.Top = panelMonitore.Height
      274. txtInfo.Height = Me.ClientSize.Height - panelMonitore.Height - btnAction.Height
      275. 'Event-Handler
      276. AddHandler btnAction.Click, AddressOf ButtonAction_Click
      277. 'Monitor-Funktionen aufrufen
      278. MonitorArrayAufbauen()
      279. MonitorButtonsAufbauen()
      280. If MonitorDisplayManager_Fenster_Als_MonitorAuswahl = True Then
      281. btnAction.Text = "OK"
      282. Me.Text = "Monitor-Auswahl"
      283. Else
      284. btnAction.Text = "Identifizieren"
      285. Me.Text = "Monitor-Viewer"
      286. End If
      287. SelektierePrimärenMonitor()
      288. Me.ActiveControl = panelMonitore
      289. Me.Opacity = 1
      290. isLoaded = True
      291. End Sub
      292. Private Sub Form_MonitorDisplayManager_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize
      293. If isLoaded = True Then
      294. If Me.WindowState = FormWindowState.Normal Then
      295. My.Settings.Form_MonitorDisplayManager_Size = Me.Size
      296. End If
      297. End If
      298. End Sub
      299. Private Sub Form_MonitorDisplayManager_LocationChanged(sender As Object, e As EventArgs) Handles MyBase.LocationChanged
      300. If isLoaded = True Then
      301. If Me.WindowState = FormWindowState.Normal Then
      302. My.Settings.Form_MonitorDisplayManager_Location = Me.Location
      303. End If
      304. End If
      305. End Sub
      306. Private Sub Form_MonitorDisplayManager_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
      307. isLoaded = False
      308. End Sub
      309. #End Region
      310. #Region "Buttons"
      311. Private Sub ButtonMonitor_MouseDown(button As Button, monitornummer As Integer)
      312. Me.ActiveControl = panelMonitore
      313. AlleButtonsFarbeSetzen(Monitor_Buttons_Hintergrundfarbe)
      314. button.BackColor = Monitor_SelektierterButton_Hintergrundfarbe
      315. IdentifiziereMonitor(monitornummer)
      316. End Sub
      317. Private Sub ButtonAction_Click(sender As Object, e As EventArgs)
      318. Me.ActiveControl = panelMonitore
      319. If MonitorDisplayManager_Fenster_Als_MonitorAuswahl = True Then
      320. OK_Button_Pressed = True
      321. Me.Close()
      322. Else
      323. IdentifiziereMonitore()
      324. End If
      325. End Sub
      326. #End Region
      327. #Region "Methoden"
      328. Public Sub MonitorArrayAufbauen()
      329. Dim dpiX As UInteger
      330. Dim dpiY As UInteger
      331. For monitorNummer As Integer = 0 To Screen.AllScreens.Length - 1
      332. Dim scr As Screen = Screen.AllScreens(monitorNummer)
      333. Dim hMonitor As IntPtr = MonitorFromPoint(New Point(scr.Bounds.Left + 1, scr.Bounds.Top + 1), 2)
      334. If GetDpiForMonitor(hMonitor, DpiType.Effective, dpiX, dpiY) = 0 Then
      335. Dim devMode As New DEVMODE()
      336. devMode.dmSize = CShort(Marshal.SizeOf(devMode)) ' Wichtig!
      337. If EnumDisplaySettings(scr.DeviceName, -1, devMode) Then
      338. Dim detectedScaling As Single = dpiX / 96.0F
      339. Dim calculatedScaling As Single = CSng(devMode.dmPelsHeight) / CSng(scr.Bounds.Height)
      340. Dim maxScaling As Single = detectedScaling
      341. If calculatedScaling > detectedScaling Then
      342. maxScaling = calculatedScaling
      343. End If
      344. Dim logicalWidth As Integer = devMode.dmPelsWidth
      345. Dim logicalHeight As Integer = devMode.dmPelsHeight
      346. Dim Primär As Integer = If(scr.Primary, 1, 0)
      347. If monitorNummer < 16 AndAlso scr.DeviceName <> "" Then
      348. displays(monitorNummer) = New DisplayListe With {
      349. .MonitorNummer = monitorNummer + 1,
      350. .MonitorName = scr.DeviceName,
      351. .MonitorArt = Primär,
      352. .SkalierungDetected = CInt(detectedScaling * 100),
      353. .SkalierungCalculated = CInt(calculatedScaling * 100),
      354. .SkalierungMaximal = CInt(maxScaling * 100),
      355. .LogischeAuflösung = New Drawing.Size(logicalWidth, logicalHeight),
      356. .PhysikalischeAuflösung = New Drawing.Size(GetNativeResolution(scr.DeviceName).Width, GetNativeResolution(scr.DeviceName).Height),
      357. .Position = New Point(scr.Bounds.Left, scr.Bounds.Top)
      358. }
      359. End If
      360. End If
      361. End If
      362. Next monitorNummer
      363. Dim sortedDisplays = displays.
      364. Where(Function(d) d.MonitorName <> ""). ' Filtert nur Monitore mit Namen
      365. OrderBy(Function(d) d.Position.Y). ' Zuerst nach Y (oben -> unten) sortieren
      366. ThenBy(Function(d) d.Position.X). ' Falls Y gleich ist, nach X (links -> rechts) sortieren
      367. Concat(displays.Where(Function(d) d.MonitorName = "")). ' Unsortierte leere Einträge hinten anhängen
      368. ToArray()
      369. ' **Füge die logische Nummer hinzu**
      370. For i As Integer = 0 To sortedDisplays.Length - 1
      371. sortedDisplays(i).MonitorNummerLogisch = i + 1
      372. Next
      373. displays = sortedDisplays
      374. End Sub
      375. Private Sub SelektierePrimärenMonitor()
      376. For Each btn As Button In panelMonitore.Controls.OfType(Of Button)()
      377. Dim monitorIndex As Integer
      378. If Integer.TryParse(btn.Name.Replace("btn", ""), monitorIndex) Then
      379. If displays(monitorIndex).MonitorArt = 1 Then
      380. btn.BackColor = Color.LightBlue ' Beispiel: Farbe ändern zur Hervorhebung
      381. btn.Focus() ' Falls du den Button auch aktiv setzen möchtest
      382. Dim primaererMonitor = displays.FirstOrDefault(Function(d) d.MonitorArt = 1)
      383. ButtonMonitor_DetailsAnzeigen(primaererMonitor.MonitorNummer, primaererMonitor.MonitorNummerLogisch)
      384. Monitor_Auswahl_MonitorNummer = primaererMonitor.MonitorNummer
      385. Exit For
      386. End If
      387. End If
      388. Next
      389. End Sub
      390. Private Sub MonitorButtonsAufbauen()
      391. panelMonitore.Controls.Clear()
      392. ' Bestimme die Begrenzungen der Monitore
      393. Dim minX As Integer = displays.Min(Function(d) d.Position.X)
      394. Dim minY As Integer = displays.Min(Function(d) d.Position.Y)
      395. Dim maxX As Integer = displays.Max(Function(d) d.Position.X + d.LogischeAuflösung.Width)
      396. Dim maxY As Integer = displays.Max(Function(d) d.Position.Y + d.LogischeAuflösung.Height)
      397. ' Relative Breite und Höhe der Gesamtanzeige
      398. Dim totalWidth As Integer = maxX - minX
      399. Dim totalHeight As Integer = maxY - minY
      400. ' Skalierungsfaktor für die Darstellung (damit alles in das Panel passt)
      401. Dim scaleFactor As Single = Math.Min(CSng((panelMonitore.Width - 4) / totalWidth), CSng((panelMonitore.Height - 4) / totalHeight) * 0.9F)
      402. For vara As Integer = 0 To displays.Count - 1
      403. If displays(vara).MonitorName <> "" Then
      404. Dim monitorNummer As Integer = vara + 1
      405. Dim buttonBounds = New Rectangle(New Point(displays(vara).Position.X, displays(vara).Position.Y),
      406. New Size(displays(vara).LogischeAuflösung.Width, displays(vara).LogischeAuflösung.Height))
      407. ' Suche Monitore, die sich teilweise oder ganz oberhalb befinden
      408. Dim varb As Integer = vara
      409. Dim darüberliegendeMonitore = displays.Where(Function(d) d.Position.Y < displays(varb).Position.Y AndAlso
      410. d.Position.X + d.LogischeAuflösung.Width > displays(varb).Position.X AndAlso
      411. d.Position.X < displays(varb).Position.X + displays(varb).LogischeAuflösung.Width).
      412. OrderByDescending(Function(d) d.Position.Y).
      413. ToList()
      414. Dim newX As Integer = buttonBounds.Left
      415. If darüberliegendeMonitore.Count > 0 Then
      416. ' Berechne den gemeinsamen Überlappungsbereich mit den oberen Monitoren
      417. Dim minXOverlap As Integer = Math.Max(displays(vara).Position.X, darüberliegendeMonitore.Min(Function(d) d.Position.X))
      418. Dim maxXOverlap As Integer = Math.Min(displays(vara).Position.X + displays(vara).LogischeAuflösung.Width,
      419. darüberliegendeMonitore.Max(Function(d) d.Position.X + d.LogischeAuflösung.Width))
      420. ' Setze X in die Mitte des Überlappungsbereichs
      421. newX = minXOverlap + ((maxXOverlap - minXOverlap) \ 2) - (buttonBounds.Width \ 2)
      422. End If
      423. ' Skaliere die berechneten Werte
      424. Dim scaledX As Integer = CInt((newX - minX) * scaleFactor) + 5
      425. Dim scaledY As Integer = CInt((buttonBounds.Top - minY) * scaleFactor) + 5
      426. Dim btn As New Button With {
      427. .Name = "btn" & CStr(vara),
      428. .Text = CStr(displays(vara).MonitorNummer) & " (" & CStr(vara + 1) & ")",
      429. .Font = Monitor_Buttons_Font,
      430. .Size = New Size(CInt(buttonBounds.Width * scaleFactor), CInt(buttonBounds.Height * scaleFactor)),
      431. .Location = New Point(scaledX, scaledY),
      432. .BackColor = Color.LightGray
      433. }
      434. Dim monNummer As Integer = vara
      435. AddHandler btn.MouseDown, Sub(sender, e) ButtonMonitor_MouseDown(CType(sender, Button), displays(monNummer).MonitorNummer)
      436. AddHandler btn.MouseUp, Sub() ButtonMonitor_DetailsAnzeigen(displays(monNummer).MonitorNummer, CInt(monNummer + 1))
      437. panelMonitore.Controls.Add(btn)
      438. End If
      439. Next
      440. AlleButtonsFarbeSetzen(Monitor_Buttons_Hintergrundfarbe)
      441. End Sub
      442. Private Sub ButtonMonitor_DetailsAnzeigen(monitornummer As Integer, logischeNummer As Integer)
      443. Dim monitor As DisplayListe = displays.FirstOrDefault(Function(m) m.MonitorNummer = monitornummer)
      444. Dim native As String = ""
      445. If monitor.MonitorNummer <> 0 Then ' Falls gefunden
      446. If monitor.LogischeAuflösung.Width = monitor.PhysikalischeAuflösung.Width AndAlso monitor.LogischeAuflösung.Height = monitor.PhysikalischeAuflösung.Height Then
      447. native = " (Native Auflösung)"
      448. End If
      449. Dim art As String = "Primärer Monitor"
      450. If monitor.MonitorArt = 0 Then art = "Sekundärer Monitor"
      451. txtInfo.Text = " Monitor Details" & vbCrLf & vbCrLf &
      452. $" Monitornummer: {monitor.MonitorNummer}{Environment.NewLine}" &
      453. $" Logische Nummer: ({logischeNummer}){Environment.NewLine}" &
      454. $" Display-Name: {monitor.MonitorName}{Environment.NewLine}" &
      455. $" Art: {art}{Environment.NewLine}" &
      456. $" Skalierung: {monitor.SkalierungMaximal}%{Environment.NewLine}" &
      457. $" Position: ({monitor.Position.X} , {monitor.Position.Y}){Environment.NewLine}" &
      458. $" Logische Auflösung: {monitor.LogischeAuflösung.Width} x {monitor.LogischeAuflösung.Height}{native}{Environment.NewLine}" &
      459. $" Physikalische Auflösung: {monitor.PhysikalischeAuflösung.Width} x {monitor.PhysikalischeAuflösung.Height}"
      460. Monitor_Auswahl_MonitorNummer = monitor.MonitorNummer
      461. End If
      462. OverlayPanelsEntfernen()
      463. End Sub
      464. Private Sub AlleButtonsFarbeSetzen(Farbe As Color)
      465. For Each btn As Button In panelMonitore.Controls
      466. btn.BackColor = Farbe
      467. Next
      468. End Sub
      469. #End Region
      470. #Region "Funktionen"
      471. Public Function GetMonitorDetails(Monitornummer As Integer) As DisplayListe
      472. Dim monitorGefunden As DisplayListe = displays.FirstOrDefault(Function(m) m.MonitorNummer = Monitornummer)
      473. If monitorGefunden.MonitorNummer <> 0 Then ' Falls gefunden
      474. Return monitorGefunden
      475. End If
      476. Return New DisplayListe
      477. End Function
      478. Public Function GetNativeResolution(ByVal monitorDeviceName As String) As Size
      479. Dim devMode As New DEVMODE()
      480. devMode.dmSize = CShort(Marshal.SizeOf(devMode))
      481. Dim maxWidth As Integer = 0
      482. Dim maxHeight As Integer = 0
      483. Dim modeIndex As Integer = 0
      484. While EnumDisplaySettings(monitorDeviceName, modeIndex, devMode)
      485. If devMode.dmPelsWidth > maxWidth OrElse devMode.dmPelsHeight > maxHeight Then
      486. maxWidth = devMode.dmPelsWidth
      487. maxHeight = devMode.dmPelsHeight
      488. End If
      489. modeIndex += 1
      490. End While
      491. If maxWidth > 0 AndAlso maxHeight > 0 Then
      492. Return New Size(maxWidth, maxHeight)
      493. Else
      494. Return Size.Empty ' Fehlerfall
      495. End If
      496. End Function
      497. #End Region
      498. #Region "Overlay-Panels"
      499. Private Sub IdentifiziereMonitore()
      500. ' Button deaktivieren, um Mehrfachklicks zu verhindern
      501. btnAction.Enabled = False
      502. For i As Integer = 0 To Screen.AllScreens.Length - 1
      503. Dim scr As Screen = Screen.AllScreens(i)
      504. Dim monitorNummer As Integer = displays.Where(Function(d) d.MonitorName = scr.DeviceName).Select(Function(d) d.MonitorNummer).FirstOrDefault()
      505. ZeigeOverlayAufMonitor(monitorNummer)
      506. Next
      507. ' Timer initialisieren und starten
      508. overlayTimer = New System.Windows.Forms.Timer()
      509. AddHandler overlayTimer.Tick, AddressOf Timer_Tick
      510. overlayTimer.Interval = Overlay_AnzeigeDauer ' Dauer der Anzeige in Millisekunden
      511. overlayTimer.Start()
      512. End Sub
      513. Private Sub IdentifiziereMonitor(monitorNummer As Integer)
      514. ' Button wieder aktivieren
      515. btnAction.Enabled = True
      516. overlayTimer?.Stop()
      517. ' Alle OverlayPanels entfernen
      518. OverlayPanelsEntfernen()
      519. If Overlay_AnzeigenBeiMonitorClick = True Then
      520. ZeigeOverlayAufMonitor(monitorNummer)
      521. End If
      522. End Sub
      523. Private Sub ZeigeOverlayAufMonitor(monitorNummer As Integer)
      524. ' Alle Monitore abrufen
      525. Dim alleMonitore As Screen() = Screen.AllScreens
      526. ' Prüfen, ob die gewünschte Monitornummer existiert
      527. If monitorNummer > 0 AndAlso monitorNummer <= alleMonitore.Length Then
      528. Dim scr As Screen = alleMonitore(monitorNummer - 1) ' Array-Index ist 0-basiert
      529. Dim workingArea As Rectangle = scr.WorkingArea
      530. Dim xPos As Integer = 0
      531. Dim yPos As Integer = 0
      532. Dim echteXPos As Integer = 0
      533. Dim echteYPos As Integer = 0
      534. Dim echteWidth As Integer
      535. Dim echteHeight As Integer
      536. Dim overlay As New Form With {
      537. .Visible = False,
      538. .FormBorderStyle = FormBorderStyle.None,
      539. .StartPosition = FormStartPosition.Manual,
      540. .BackColor = Overlay_Hintergrundfarbe,
      541. .Opacity = Overlay_Opacity,
      542. .Size = New Drawing.Size(0, 0),
      543. .Location = New Point(xPos, yPos),
      544. .TopMost = True
      545. }
      546. Dim lbl As New System.Windows.Forms.Label With {
      547. .Text = Space(Overlay_Breite) & monitorNummer.ToString() & Space(Overlay_Breite),
      548. .Font = Overlay_Font,
      549. .ForeColor = Overlay_SchriftFarbe,
      550. .Dock = DockStyle.Fill,
      551. .TextAlign = ContentAlignment.MiddleCenter,
      552. .AutoSize = True
      553. }
      554. overlay.Controls.Add(lbl)
      555. overlay.Show()
      556. echteWidth = lbl.Width
      557. echteHeight = lbl.Height
      558. overlay.Size = New Size(echteWidth, echteHeight)
      559. Select Case Overlay_Position
      560. Case Overlay_Corner.LeftTop
      561. echteXPos = workingArea.Left + 10
      562. echteYPos = scr.Bounds.Top + 10
      563. Case Overlay_Corner.RightTop
      564. echteXPos = workingArea.Left + workingArea.Width - overlay.Width - 10
      565. echteYPos = scr.Bounds.Top + 10
      566. Case Overlay_Corner.LeftBottom
      567. echteXPos = workingArea.Left + 10
      568. echteYPos = scr.Bounds.Top + workingArea.Height - overlay.Height - 10
      569. Case Overlay_Corner.RightBottom
      570. echteXPos = workingArea.Left + workingArea.Width - overlay.Width - 10
      571. echteYPos = scr.Bounds.Top + workingArea.Height - overlay.Height - 10
      572. End Select
      573. overlay.Location = New Point(echteXPos, echteYPos)
      574. overlay.Visible = True
      575. OverlayPanels.Add(overlay)
      576. Else
      577. MessageBox.Show($"Monitor {monitorNummer} nicht gefunden.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
      578. End If
      579. End Sub
      580. Private Sub OverlayPanelsEntfernen()
      581. ' Alle OverlayPanels entfernen
      582. For Each p In OverlayPanels
      583. p.Close()
      584. Next
      585. End Sub
      586. Private Sub Timer_Tick(sender As Object, e As EventArgs)
      587. ' Alle OverlayPanels entfernen
      588. OverlayPanelsEntfernen()
      589. ' Button wieder aktivieren
      590. btnAction.Enabled = True
      591. ' Timer stoppen und aufräumen
      592. overlayTimer.Stop()
      593. overlayTimer.Dispose()
      594. End Sub
      595. #End Region
      596. #Region "Propertys"
      597. Public Property Form_Hintergrundfarbe As Color
      598. Get
      599. Return _Form_Hintergrundfarbe
      600. End Get
      601. Set(value As Color)
      602. _Form_Hintergrundfarbe = value
      603. End Set
      604. End Property
      605. Public Property MonitorDisplayManager_Fenster_Als_MonitorAuswahl As Boolean
      606. Get
      607. Return _MonitorDisplayManager_Fenster_Als_MonitorAuswahl
      608. End Get
      609. Set(value As Boolean)
      610. _MonitorDisplayManager_Fenster_Als_MonitorAuswahl = value
      611. End Set
      612. End Property
      613. Public Property Monitor_Auswahl_MonitorNummer As Integer
      614. Get
      615. Return _Monitor_Auswahl_MonitorNummer
      616. End Get
      617. Set(value As Integer)
      618. _Monitor_Auswahl_MonitorNummer = value
      619. End Set
      620. End Property
      621. Public Property OK_Button_Pressed As Boolean
      622. Get
      623. Return _OK_Button_Pressed
      624. End Get
      625. Set(value As Boolean)
      626. _OK_Button_Pressed = value
      627. End Set
      628. End Property
      629. Public Property Monitor_Panel_Hintergrundfarbe As Color
      630. Get
      631. Return _Monitor_Panel_Hintergrundfarbe
      632. End Get
      633. Set(value As Color)
      634. _Monitor_Panel_Hintergrundfarbe = value
      635. End Set
      636. End Property
      637. Public Property Monitor_Buttons_Font As Font
      638. Get
      639. Return _Monitor_Buttons_Font
      640. End Get
      641. Set(value As Font)
      642. _Monitor_Buttons_Font = value
      643. End Set
      644. End Property
      645. Public Property Monitor_Buttons_Schriftfarbe As Color
      646. Get
      647. Return _Monitor_Buttons_Schriftfarbe
      648. End Get
      649. Set(value As Color)
      650. _Monitor_Buttons_Schriftfarbe = value
      651. End Set
      652. End Property
      653. Public Property Monitor_Buttons_Hintergrundfarbe As Color
      654. Get
      655. Return _Monitor_Buttons_Hintergrundfarbe
      656. End Get
      657. Set(value As Color)
      658. _Monitor_Buttons_Hintergrundfarbe = value
      659. End Set
      660. End Property
      661. Public Property Monitor_SelektierterButton_Hintergrundfarbe As Color
      662. Get
      663. Return _Monitor_SelektierterButton_Hintergrundfarbe
      664. End Get
      665. Set(value As Color)
      666. _Monitor_SelektierterButton_Hintergrundfarbe = value
      667. End Set
      668. End Property
      669. Public Property Action_Button_Font As Font
      670. Get
      671. Return _Action_Button_Font
      672. End Get
      673. Set(value As Font)
      674. _Action_Button_Font = value
      675. End Set
      676. End Property
      677. Public Property Action_Button_Schriftfarbe As Color
      678. Get
      679. Return _Action_Button_Schriftfarbe
      680. End Get
      681. Set(value As Color)
      682. _Action_Button_Schriftfarbe = value
      683. End Set
      684. End Property
      685. Public Property Action_Button_Hintergrundfarbe As Color
      686. Get
      687. Return _Action_Button_Hintergrundfarbe
      688. End Get
      689. Set(value As Color)
      690. _Action_Button_Hintergrundfarbe = value
      691. End Set
      692. End Property
      693. Public Property Monitor_Information_TextBox_Font As Font
      694. Get
      695. Return _Monitor_Information_Textbox_Font
      696. End Get
      697. Set(value As Font)
      698. _Monitor_Information_Textbox_Font = value
      699. End Set
      700. End Property
      701. Public Property Monitor_Information_TextBox_Schriftfarbe As Color
      702. Get
      703. Return _Monitor_Information_TextBox_Schriftfarbe
      704. End Get
      705. Set(value As Color)
      706. _Monitor_Information_TextBox_Schriftfarbe = value
      707. End Set
      708. End Property
      709. Public Property Monitor_Information_TextBox_Hintergrundfarbe As Color
      710. Get
      711. Return _Monitor_Information_TextBox_Hintergrundfarbe
      712. End Get
      713. Set(value As Color)
      714. _Monitor_Information_TextBox_Hintergrundfarbe = value
      715. End Set
      716. End Property
      717. Public Property Overlay_AnzeigenBeiMonitorClick As Boolean
      718. Get
      719. Return _Overlay_AnzeigenBeiMonitorClick
      720. End Get
      721. Set(value As Boolean)
      722. _Overlay_AnzeigenBeiMonitorClick = value
      723. End Set
      724. End Property
      725. Public Property Overlay_Font As Font
      726. Get
      727. Return _Overlay_Font
      728. End Get
      729. Set(value As Font)
      730. _Overlay_Font = value
      731. End Set
      732. End Property
      733. Public Property Overlay_Opacity As Double
      734. Get
      735. Return _Overlay_Opacity
      736. End Get
      737. Set(value As Double)
      738. If value > 0.1 AndAlso value <= 1 Then
      739. _Overlay_Opacity = value
      740. Else
      741. _Overlay_Opacity = 0.5
      742. End If
      743. End Set
      744. End Property
      745. Public Property Overlay_Position As Integer
      746. Get
      747. Return _Overlay_Position
      748. End Get
      749. Set(value As Integer)
      750. If value >= 0 AndAlso value < 4 Then
      751. _Overlay_Position = value
      752. Else
      753. _Overlay_Position = 1
      754. End If
      755. End Set
      756. End Property
      757. Public Property Overlay_AnzeigeDauer As Integer
      758. Get
      759. Return _Overlay_AnzeigeDauer
      760. End Get
      761. Set(value As Integer)
      762. _Overlay_AnzeigeDauer = value
      763. End Set
      764. End Property
      765. Public Property Overlay_Breite As Integer
      766. Get
      767. Return _Overlay_Breite
      768. End Get
      769. Set(value As Integer)
      770. If value >= 0 AndAlso value < 6 Then
      771. _Overlay_Breite = value
      772. Else
      773. _Overlay_Breite = 1
      774. End If
      775. End Set
      776. End Property
      777. Public Property Overlay_SchriftFarbe As Color
      778. Get
      779. Return _Overlay_Schriftfarbe
      780. End Get
      781. Set(value As Color)
      782. _Overlay_Schriftfarbe = value
      783. End Set
      784. End Property
      785. Public Property Overlay_Hintergrundfarbe As Color
      786. Get
      787. Return _Overlay_Hintergrundfarbe
      788. End Get
      789. Set(value As Color)
      790. _Overlay_Hintergrundfarbe = value
      791. End Set
      792. End Property
      793. #End Region
      794. End Class


      Den Code könnt Ihr einfach in ein neues Formular einfügen - alle benötigten Controls werden dynamisch erzeugt.

      Die Form wird als Dialog mit :

      VB.NET-Quellcode

      1. Form_MonitorDisplayManager.Initialize()


      aufgerufen und angezeigt.

      Das Public-Array "Form_MonitorDisplayManager.Displays" beinhaltet nach dem Aufbau durch Aufruf der Public Sub: "Form_MonitorDisplayManager.MonitorArrayAufbauen" oder durch erstmaliges Öffnen des Dialogfensters die Eigenschaften aller Monitore in einer Form_MonitorDisplayManager.DisplayListe Struktur:

      VB.NET-Quellcode

      1. Public Structure DisplayListe
      2. Public MonitorNummer As Integer
      3. Public MonitorNummerLogisch As Integer
      4. Public MonitorName As String
      5. Public MonitorArt As Integer
      6. Public SkalierungDetected As Integer
      7. Public SkalierungCalculated As Integer
      8. Public SkalierungMaximal As Integer
      9. Public LogischeAuflösung As Size
      10. Public PhysikalischeAuflösung As Size
      11. Public Position As Point
      12. End Structure


      Mittels dieses "Displays"-Arrays könnt Ihr in Eurer Anwendung gezielt auf die Eigenschaften aller Monitore zugreifen.

      Dier verwendeten Propertys sind im Script in der Region "Information zur Bedienung" beschrieben.
      Die Property-Default-Werte können im Script in der Region "Variablen-Zuweisung" geändert werden.

      ----------------------------------------------------------------------------------------------------

      Überarbeitung und Erweiterung des Codes (12.03.25 19:45Uhr):

      Hi Freunde,

      Ich habe den Form "Monitor Display-Manager" erweitert.

      Falls mal jemand so einen Dialog braucht - hier der Code:

      Erforderlich sind nur folgende zwei My.Settings-Einträge, um Form.Location und Form.Size zu speichern:
      My.Settings.Form_MonitorDisplayManager_Location
      My.Settings.Form_MonitorDisplayManager_Size

      Zusätzlich erforderlich ist für die Nutzung dieses erweiterten "Monitor Diaplay-Manager", das "System Management" in das eigene Projekt einzubinden:
      Menu "Projekt" - "Verweis hinzufügen ..." - unter "Assemblys" den Eintrag "System.Management" anhakerln - "OK"-Button aklicken.

      Hinzugekommen:
      Mgl. exakte Bildschirmgrössen-Anzeige in Millimeter durch Auslesen der EDID-Werte.

      Information:
      Die EDID-Abfrage (Extended Display Identification Data) dient dazu, Informationen über den angeschlossenen Monitor direkt aus dessen Firmware (EEPROM des Monitors) auszulesen. Die Grafikkarte fragt diese Daten beim Systemstart über das I²C-Protokoll von der DDC-Schnittstelle (Display Data Channel) des Monitors ab.
      Windows speichert diese Daten und stellt sie über WMI (Windows Management Instrumentation) oder direkt über die Registry bereit.
      Nur, wenn diese EDID-Werte nicht gelesen werden können (billige Graphikkarte, billiger Monitor und viele Laptops), werden im "Monitor Display-Manager" die ungenauen DPI-Berechnungen zur Ermittlung der Bildschirmabmessungen verwendet.

      Zusätzliche Anzeige aus EDID-Werten (wenn möglich):
      Hardware: Monitor-Hersteller-Kürzel, Produkt-Code, S/N
      Sehr genaue Bildschirmabmessungen (in mm)
      Pixelgrösse physikalisch, DPI physikalisch
      Pixelgrösse skaliert, DPI skaliert

      Neue Variable:
      Bei_Öffnen_Aktuelles_Fenster_Auswählen (Boolean)
      True = Selektiert beim Öffnen des Fensters den Monitor, auf welchem das Fenster geöffnet wird
      False = Selektiert beim Öffnen des Fensters den primären Monitor

      Neue Funktion:
      Public Form_MonitorDisplayManager.GetMonitorDeviceNumberFromCursor()
      Liefert die Monitornummer des Monitors, auf welchem sich der Mauszeiger befindet
      Aufruf: Dim MonitorDetails as Form_MonitorDisplayManager.Displayliste
      MonitorDetails = Form_MonitorDisplayManager.GetMonitorDetails(Form_MonitorDisplayManager.GetMonitorDeviceNumberFromCursor())

      Den Code könnt Ihr einfach in ein neues Formular einfügen - alle benötigten Controls werden dynamisch erzeugt.

      Die Form wird als Dialog mit :

      VB.NET-Quellcode

      1. Form_MonitorDisplayManager.Initialize()


      aufgerufen und angezeigt.

      Das Public-Array "Form_MonitorDisplayManager.Displays" beinhaltet nach dem Aufbau durch Aufruf der Public Sub: "Form_MonitorDisplayManager.MonitorArrayAufbauen" oder durch erstmaliges Öffnen des Dialogfensters die Eigenschaften aller Monitore in einer Form_MonitorDisplayManager.DisplayListe Struktur:

      VB.NET-Quellcode

      1. Public Structure DisplayListe
      2. Public MonitorNummer As Integer
      3. Public MonitorNummerLogisch As Integer
      4. Public MonitorName As String
      5. Public MonitorArt As Integer
      6. Public DpiX As UInteger
      7. Public DpiY As UInteger
      8. Public SkalierungDetected As Integer
      9. Public SkalierungCalculated As Integer
      10. Public SkalierungMaximal As Integer
      11. Public LogischeAuflösung As Size
      12. Public PhysikalischeAuflösung As Size
      13. Public Position As System.Drawing.Point
      14. Public BildschirmgrössePhysikalisch As Size
      15. Public DPIXPhysikalisch As Double
      16. Public DPIYPhysikalisch As Double
      17. Public PixelgrössePhysikalischXMM As Double
      18. Public PixelgrössePhysikalischYMM As Double
      19. Public DPIXSkaliert As Double
      20. Public DPIYSkaliert As Double
      21. Public PixelgrösseSkaliertXMM As Double
      22. Public PixelgrösseSkaliertYMM As Double
      23. Public Berechnung As String
      24. Public Hardware As String
      25. End Structure


      Mittels dieses "Displays"-Arrays könnt Ihr in Eurer Anwendung gezielt auf die Eigenschaften aller Monitore zugreifen.

      Propertys:
      Dier verwendeten Propertys sind im Script in der Region "Information zur Bedienung" beschrieben.
      Die Property-Default-Werte können im Script in der Region "Variablen-Zuweisung" geändert werden.

      Da das Script zu gross für dieses Forum ist, hier als ZIP-Anlage :)
      Bilder
      • 2025-02-28 16_19_16-Monitor Display-Manager.jpg

        102,47 kB, 802×623, 17 mal angesehen
      • 2025-03-12 19_47_22-Monitor Display-Manager.jpg

        205,16 kB, 822×940, 12 mal angesehen
      Dateien

      Dieser Beitrag wurde bereits 16 mal editiert, zuletzt von „Dideldum“ ()

      P.S. Wer will, kann die Display-Struktur um folgenden Eintrag erweitern:

      VB.NET-Quellcode

      1. Public BildschirmDiagonaleInch As Double


      dann die Sub "MonitorArrayAufbauen" um folgenden Eintrag erweitern:

      VB.NET-Quellcode

      1. displays(monitorNummer).BildschirmgrössePhysikalischMM = GetScreenSizeFromEDID(monitorNummer, displays(monitorNummer).PhysikalischeAuflösung, displays(monitorNummer).DpiX, displays(monitorNummer).DpiY, displays(monitorNummer).SkalierungMaximal, Berechnung, Hardware)
      2. ' Hier folgende Zeile einfügen
      3. displays(monitorNummer).BildschirmDiagonaleInch = Math.Round(Math.Sqrt(displays(monitorNummer).BildschirmgrössePhysikalischMM.Width ^ 2 + displays(monitorNummer).BildschirmgrössePhysikalischMM.Height ^ 2) / 25.4, 2)
      4. '
      5. displays(monitorNummer).Berechnung = Berechnung
      6. displays(monitorNummer).Hardware = Hardware


      und in der Sub "ButtonMonitor_DetailsAnzeigen" folgende Zeile erweitern:

      VB.NET-Quellcode

      1. monitor.MonitorNummer,
      2. logischeNummer,
      3. ' Hier erweiterte Zeile
      4. monitor.Hardware & " (" & monitor.BildschirmDiagonaleInch & " Zoll")",
      5. '
      6. monitor.MonitorName,
      7. art,


      Damit speichert der Monitor Display-Manager die Bildschirmdiagonale (in Zoll) in der Struktur "Displays" und zeigt in der Infozeile mit Monitorhersteller, Produkt-Nummer und S/N zusätzlich die Diagonale des Monitors an.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dideldum“ ()