Bildschirm Identifizieren

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Darf ich den Sinn nochmals hinterfragen?

    Veronesi schrieb:

    Für eine Anwendung muss ich Bildschirme identifizieren können.
    OK.
    Aber warum muss deine Reihenfolge unbedingt mit der Nummerierung in der Systemsteuerung übereinstimmen?

    Die "Identify"-Funktion dient ja lediglich zur Orientierungs innerhalb des Setup-GUI, z.B. um die gegenseitige Anordnung der Monitore korrigieren.
    Theoretisch könnte sie willkürlich und bei jedem Aufruf anders sein.
    Trotzdem würde das Setup funktionieren.

    Genauso solltest du mit deiner Anwendung verfahren.
    Nimm als Identifikation den Index von Screen.AllScreens
    So lange du innerhalb deiner Anwendung konsistent bleibst, ist doch alles OK.

    Was macht denn deine Anwendung, dass sie unbedingt eine Nummerierung der Bildschirme benötigt?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod.

    Du hast ja Grundsätzlich recht!

    Hier aber der Hintergrund:
    Ich muss auf jedem Bildschirm andere, speziell festgelegte Informationen darstellen.

    Grundsätzlich wäre es egal, auf welchem Bildschirm welche Information. Aber bei Support-Fällen muss der Benutzer angeben, auf WELCHEM Bildschirm der Fehler auftritt. Und was dort für Informationen stehen. Das macht er, indem er die Bildschirmnummer angibt, die per P-Touch auf dem Monitor angeklebt ist.
    Und diese Nummern wurden ursprünglich gemäß Windows Idetifizierung vergeben.

    Und bei so vielen PCs/Monitoren die P-Touch Kleber wechseln wollen wir eigentlich nicht.


    Wie wird denn AllScreens nummeriert?
    0 scheint leider nicht immer der Primäre zu sein habe ich gesehen.


    Notfalls mache ich es so, dass wir die Bildschirme einfach von oben links nach oben rechts und dann von oben nach unten nummerieren. Also wie beim lesen .

    Hat schon jemand eine intelligente Funktion geschrieben, die anhand von Left und Top, sowie (!) Width und Height die Reihenfolge zurückgeben kann?

    Veronesi schrieb:

    Wie wird denn AllScreens nummeriert?
    0 scheint leider nicht immer der Primäre zu sein habe ich gesehen.

    Der Primäre kann wechseln, ohne dass sich die Auflistung verändert.
    Der Index wird sich von Grafikkarte 1..n und deren tatsächlich belegten Ports durchnummerieren.
    Der Display-Name wird dasselbe Verfahren haben, aber die belegbaren Ports beinhalten.

    Für den Support-Fall würde ich ein kleines Programm zur Verfügung stellen, dass auf allen Bildschirmen die Information ausgibt, die du für die Fehlersuche tatsächlich benötigst.

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    So, ich habe nun mal eine Sortierfunktion geschrieben.
    Scheint bisher zu klappen.

    Dann verwende ich vermutlich das!

    VB.NET-Quellcode

    1. Private Function SortScreens() As List(Of System.Windows.Forms.Screen)
    2. 'Sort all Screens.
    3. 'Screen 1 is on Top Left position.
    4. 'Numbering is from Top Left to Bottom Right. (Like reading a book)
    5. Dim RemainingScreens As List(Of System.Windows.Forms.Screen) = Windows.Forms.Screen.AllScreens.ToList
    6. Dim RememberedScreen As Integer = 0
    7. Dim SortedScreens As New List(Of System.Windows.Forms.Screen)
    8. While RemainingScreens.Count > 0
    9. For i As Integer = 0 To RemainingScreens.Count - 1
    10. If RemainingScreens(i).Bounds.Y < RemainingScreens(RememberedScreen).Bounds.Y Then 'Y smaller => Remember this screen
    11. RememberedScreen = i
    12. ElseIf RemainingScreens(i).Bounds.Y = RemainingScreens(RememberedScreen).Bounds.Y Then 'Y equal => Check X for first screen
    13. If RemainingScreens(i).Bounds.X < RemainingScreens(RememberedScreen).Bounds.X Then
    14. RememberedScreen = i
    15. End If
    16. End If
    17. Next I
    18. 'Now we have the "first" screen index of the RemainingScreens List stored in RememberedScreen
    19. SortedScreens.Add(RemainingScreens(RememberedScreen)) 'Add this screen to the list
    20. RemainingScreens.RemoveAt(RememberedScreen) 'Remove this index
    21. RememberedScreen = 0
    22. End While
    23. Return SortedScreens
    24. End Function

    Veronesi schrieb:

    die Relation von AllScreens(x) zur Identifikation Nummer von Windows
    Du schiebst das Fenster auf den betreffenden Screen und liest die Position des Fensters aus (Button und abspeichern). Wenn Du da noch Deine private Screen-Nummerierung per TextBox eingibst, hast Du Deine Liste so wie Du sie brauchst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!