Visual Basic Monitore eerkennen, und jesweils ein Form pro Monitor

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von MCSITK.

    Visual Basic Monitore eerkennen, und jesweils ein Form pro Monitor

    Hallo zusammen, nun wieder ma mit einer Frage, wie kann mein Programm erkennen on 2 Monitore da sind , und entsprechend Form1 auf Monitor 1 legt und Form2 auf Monitor 2

    bei mein schript werden noch weitere fragen offen sein aber mir gehts es gerade genau darum, hab schon gegoogelt, und auch hier im forum was gefunden,, aber es hat nicht funktioniert .

    hier mein schript

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Dialog As Form2
    4. Private Setting As UserControl1
    5. Dim Datei As String
    6. Dim File As String
    7. Private Sub BeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BeendenToolStripMenuItem.Click
    8. Dim Wert As Integer
    9. Wert = MsgBox("Wollen sie WebPrg wirklich beenden ?", vbOKCancel, "Beenden")
    10. If Wert = 1 Then
    11. Me.Close()
    12. End If
    13. End Sub
    14. Private Sub EinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EinstellungenToolStripMenuItem.Click
    15. Setting = New UserControl1
    16. Me.Setting.Show()
    17. End Sub
    18. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    19. Dim screen As Screen
    20. screen = Screen.AllScreens(0)
    21. Form2.StartPosition = FormStartPosition.Manual
    22. Form2.Location = screen.Bounds.Location + New Point(100, 100)
    23. Me.Dialog = New Form2
    24. Me.Dialog.Show(Me)
    25. End Sub
    26. Private Sub NeuToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles NeuToolStripMenuItem.Click
    27. If Me.RichTextBox1.Text <> "" Then
    28. Dim Wert As Integer
    29. Wert = MsgBox("Wollen sie das aktive Script speichern ?", vbYesNoCancel, "Neues Script")
    30. If Wert <> 2 Then
    31. If Wert = 6 Then
    32. Sichern()
    33. End If
    34. End If
    35. End If
    36. End Sub
    37. Private Sub Sichern()
    38. SaveFileDialog1.Filter = "HTML | *.htm*"
    39. SaveFileDialog1.ShowDialog()
    40. End Sub
    41. Private Sub RichTextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles RichTextBox1.KeyDown
    42. If (e.KeyCode = Keys.Enter) Then
    43. File = "C:\webprg\temp.html"
    44. Speichern()
    45. Dialog.MyText = RichTextBox1.Text
    46. If Me.Dialog Is Nothing OrElse Me.Dialog.IsDisposed Then
    47. Dialog = New Form2
    48. End If
    49. If Not Dialog.Visible Then
    50. Dialog.Show(Me)
    51. End If
    52. End If
    53. End Sub
    54. Private Sub ÖffnenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ÖffnenToolStripMenuItem.Click
    55. OpenFileDialog1.Multiselect = False
    56. OpenFileDialog1.Filter = "HTML | *.htm*"
    57. OpenFileDialog1.ShowDialog()
    58. Datei = OpenFileDialog1.FileName
    59. End Sub


    das von Form 2 lass ich mal aussen vor
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache
    Screen.AllScreens hat alle Monitore, daraus kannst du dir die X und Y Positionen für die "Forms" ableiten.


    Kannst du es bitte genauer erklären, wie du siehst hab ich es schon damit versucht aber will nicht so wie ich es will
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache

    VB.NET-Quellcode

    1. Dim s() As Screen = Screen.AllScreens
    2. For Each subS As Screen In s
    3. Debug.WriteLine(subS.WorkingArea.ToString())
    4. Dim nF As New Form2
    5. nF.Location = New Point(subS.Bounds.X + 10, subS.Bounds.Y + 10)
    6. nF.Show()
    7. Next

    Die zu erstellende Form muss auf StartPosition.Manual gesetzt werden!
    also im Test umfeld ging es allein , soweit wenn ich es versuche in mein script einzubauen
    dan taucht form2 nicht nur auf monitor 2 auf sondern auch monitor 1 und wenn ich eingabe mache kommt ne fehler meldung

    Mein ursprüngliches script :

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim screen As Screen
    3. screen = Screen.AllScreens(0)
    4. Form2.StartPosition = FormStartPosition.Manual
    5. Form2.Location = screen.Bounds.Location + New Point(100, 100)
    6. Me.Dialog = New Form2
    7. Me.Dialog.Show(Me)
    8. End Sub


    und das von dir mit eingebaute scriptteil

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim s() As Screen = Screen.AllScreens
    3. For Each subS As Screen In s
    4. Debug.WriteLine(subS.WorkingArea.ToString())
    5. Dim Dialog As New Form2
    6. Dialog.Location = New Point(subS.Bounds.X + 10, subS.Bounds.Y + 10)
    7. Dialog.Show()
    8. Next
    9. 'Me.Dialog = New Form2
    10. 'Me.Dialog.Show(Me)
    11. End Sub
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache
    Klar kommt das auf beiden Bildschirmen, steht ja auch so im Code von 3Angle ;)

    For Each subS As Screen In s
    Debug.WriteLine(subS.WorkingArea.ToString())
    Dim Dialog As New Form2
    Dialog.Location = New Point(subS.Bounds.X + 10, subS.Bounds.Y + 10)
    Dialog.Show()
    Next

    In der Schleife wird für jeden Screen ein neuer Dialog auf selbigem geöffnet...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    genau beim anpassen happerts win wenig ,
    bekomme drei formulare davon 2mal form 1 und 2 auf monitor 1 einen auf den 2. monitor einmaö form 2
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache
    @MCSITK Dann hast Du es ja genau richtig gemacht.
    Oder hast Du Dir das anders vorgestellt?
    Wenn ja, war Deine Aufgabenstellung falsch.
    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!
    Hier wurde Form2 instanziert, und mit der neuen Instanz "Dialog" gearbeitet:
    Dim Dialog As New Form2
    Dialog.Location = New Point(subS.Bounds.X + 10, subS.Bounds.Y + 10)
    Dialog.Show()
    Der Eigenschaft .Location von "Dialog" wurde die gewünschte Platzierung hinzugefügt.

    Du hingegen machst außer Anzeigen nix mit deiner Instanz:
    Form2.StartPosition = FormStartPosition.Manual
    Form2.Location = screen.Bounds.Location + New Point(100, 100)
    Me.Dialog = New Form2
    Me.Dialog.Show(Me)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    also wie bereits in den letzten themen gesagt, es gibt zwei form2 rechter monitoer will ich sehen was ich am linken direkt eintippoe(jeweils nach enter drücken)

    und im testlauf geht das schript von @'3Angle , nur wenn ich es bei mir versuche einzubinden dann hab ich 2 mal Form 2 und eine fehlermeldung nach demn eintippen.
    also hab ich bei dem Intrigiern des ganzen einen fehler drin den ich weder sehe noch geschweige den verstehe

    hier noch einmal das soweit von mir angepasste (fehlerhafte ) script

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim s() As Screen = Screen.AllScreens
    3. For Each subS As Screen In s
    4. Debug.WriteLine(subS.WorkingArea.ToString())
    5. 'Dim Dialog As New Form2
    6. Dialog.Location = New Point(subS.Bounds.X + 10, subS.Bounds.Y + 10)
    7. Dialog.Show()
    8. Next
    9. 'Me.Dialog = New Form2
    10. 'Me.Dialog.Show(Me)
    11. End Sub
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache
    Weißt du was das hier macht?

    For Each subS As Screen In s
    (...)
    Next
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    also wenn ich das script richtig verstehe, wird in s die anzahl der möglichen anzeigen angegeben
    dann schritt für schritt mit der for each schleife aufgerufen und entsprechen dann dieses diplaynur in der subs eingetragen
    hdann wird in dem DEBUG (wobei ich nicht verstehe warum gerade dieser begriff für den befehl) den displaybbereich bereitgestellt
    und in der Location wird die Form bereitgestellt
    und dann angezeicgt
    und nect halt nächsten wert holen
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache
    Naja lassen wir mal so stehen... Setzt dir doch mal einen Breakpoint und gehe Schritt für Schritt durch deinen Code, schau dir an was/wann passiert und welche Werte die Variablen haben...

    Tipp:
    Wenn du nicht möchtest das pro gefundenem Bildschirm ein neues Fenster angezeigt wird, sondern nur einmal auf dem 2. Bildschirm... Solltest du dann eine Schleife verwenden?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    ah ok denkfehler von mir verstanden , wed mal umüberlegen
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache
    @MCSITK Vielleicht siehst Du Dir mal diesen Post an.
    Du musst jeden Dialog einzeln instanziieren ohne eine frühere Instanz zu überschreiben:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. For Each s In Screen.AllScreens
    3. Dim dlg As New Form2 ' dies hier
    4. dlg.StartPosition = FormStartPosition.Manual
    5. Dim loc = s.Bounds.Location
    6. loc.Offset(50, 50)
    7. dlg.Location = loc
    8. dlg.Show(Me)
    9. Next
    10. End Sub
    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!
    Danke für eure Hilfe und besonders für eure Geduld, mit so einem Anfänger wie mit mir, nun klappt es so wie ich es mir vorgestellt hatte (zumindest diesen Teil :) )
    Nächster s Schritt ist beide Form1 und 2 jeweils auf Fullscreen zu setzen, aber das hoff ich das ich es selbst hinbekommen
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache
    @MCSITK Entweder im Designer oder im Code:

    VB.NET-Quellcode

    1. Me.WindowState = FormWindowState.Maximized
    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!
    Bei Form1 geht es bei Form2, maximiert es zwar auch aber springt dann wieder auf bildschirm 1

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. For Each s In Screen.AllScreens
    3. Dialog.StartPosition = FormStartPosition.Manual
    4. Dim loc = s.Bounds.Location
    5. loc.Offset(50, 50)
    6. Dialog.Location = loc
    7. Dialog.WindowState = FormWindowState.Maximized
    8. Dialog.Show()
    9. Next
    10. End Sub
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache
    Fehlt da nicht was vom Code? Leider sehe ich nicht wo du deine 2. Form instanzierst und anzeigst.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    So das ist der gesamte Code nun von Form1, also in Zeile 4 wird Form2 als Dialog Öffentlich zugewiesen und instanziert.

    der Rest ist dann ab zeile 22 im Form Load1, da Form 1 in Form_Load geladen wird, brauch ich nur noch Form2 (als Dialog) anzeigen lassen, soweit ich es bis jetzt nachvollzogen habe
    Dadurch das zuerst das instanzieren im in der Schleife war haben sich jeweils 2 Form2 Fenster geöffnet, und durch das auslagern nur noch ein Form2 , welches als Dialog angezeigt wird.

    Aber sobald ich den WindowsStatus des Dialoges ändere springt das Fenster wieder auf Bildschirm1

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Dim Dialog As New Form2
    4. Dim Datei As String
    5. Dim File As String
    6. Private Sub BeendenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BeendenToolStripMenuItem.Click
    7. Dim Wert As Integer
    8. Wert = MsgBox("Wollen sie WebPrg wirklich beenden ?", vbOKCancel, "Beenden")
    9. If Wert = 1 Then
    10. Me.Close()
    11. End If
    12. End Sub
    13. Private Sub EinstellungenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles EinstellungenToolStripMenuItem.Click
    14. 'Setting = New UserControl1
    15. 'Me.Setting.Show()
    16. End Sub
    17. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    18. For Each s In Screen.AllScreens
    19. Dialog.StartPosition = FormStartPosition.Manual
    20. Dialog.WindowState = FormWindowState.Maximized
    21. Dim loc = s.Bounds.Location
    22. loc.Offset(50, 50)
    23. Dialog.Location = loc
    24. Dialog.Show()
    25. Next
    26. End Sub
    27. Private Sub NeuToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles NeuToolStripMenuItem.Click
    28. If Me.RichTextBox1.Text <> "" Then
    29. Dim Wert As Integer
    30. MsgBox(Wert, vbOK)
    31. If Wert <> 2 Then
    32. If Wert = 6 Then
    33. Sichern()
    34. End If
    35. End If
    36. End If
    37. End Sub
    38. Private Sub Sichern()
    39. SaveFileDialog1.Filter = "HTML | *.htm*"
    40. SaveFileDialog1.ShowDialog()
    41. End Sub
    42. Private Sub RichTextBox1_KeyDown(sender As Object, e As KeyEventArgs) Handles RichTextBox1.KeyDown
    43. If (e.KeyCode = Keys.Enter) Then
    44. File = "C:\webprg\temp.html"
    45. Speichern()
    46. Dialog.MyText = RichTextBox1.Text
    47. If Me.Dialog Is Nothing OrElse Me.Dialog.IsDisposed Then
    48. Dialog = New Form2
    49. End If
    50. If Not Dialog.Visible Then
    51. Dialog.Show(Me)
    52. End If
    53. End If
    54. End Sub
    55. Private Sub ÖffnenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ÖffnenToolStripMenuItem.Click
    56. OpenFileDialog1.Multiselect = False
    57. OpenFileDialog1.Filter = "HTML | *.htm*"
    58. OpenFileDialog1.ShowDialog()
    59. Datei = OpenFileDialog1.FileName
    60. End Sub
    61. Private Sub SpeichernToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SpeichernToolStripMenuItem.Click
    62. If Datei <> "" Then
    63. Sichern()
    64. End If
    65. File = Datei
    66. Speichern()
    67. End Sub
    68. Private Sub SpeichernAlsToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SpeichernAlsToolStripMenuItem.Click
    69. Sichern()
    70. Datei = SaveFileDialog1.FileName
    71. File = Datei
    72. End Sub
    73. Private Sub Speichern()
    74. Dim fs As New FileStream(File, FileMode.Create)
    75. Dim sw As New StreamWriter(fs)
    76. sw.WriteLine(RichTextBox1.Text)
    77. sw.Close()
    78. End Sub
    79. End Class
    Ich bin, wie ich bin, in vielen sachen noch ein anfänger, auch wenn ich sachen schon seit jahren mache