Windows zeigt die Fenster der eigenen Application in einem Multiscreen-System nicht immer auf dem Bildschirm an, auf dem man es gern hätte. Oftmals liegt es daran, auf welchem Display man die Verknüpfung gelegt hat. Da wird eventuell die MDI-Form auf diesem Bildschirm geöffnet, aber Unterfenster eventuell auf dem Primaryscreen. Um diese Effekt zu vermeiden, kann man den Nutzer festlegen lassen, auf welchem Bildschirm alle Fenster der Anwendung angezeigt werden sollen. Damit das dann funktioniert, hat man ein wenig Programmierarbeit zur Vorbereitung. Die folgende Funktion kann dafür verwendet werden. Die Funktion locationSettingMultiscreen setze ich immer in Public Sub New() jeder Form meines Projekts ein. Voraussetzung dafür ist, dass am Beginn der Application entweder durch Wahl anhand einer Combobox oder eventuell durch einen Commandozeilenparameter o.ä. der gewünschte Bildschirm festgelegt werden kann. Diese Festlegung wird praktischerweise in einer Public-Variablen der Application gespeichert; möglicherweise auch in die Settings gespeichert. Dann kann die Funktion im New() aufgerufen werden. Hier erst mal der Code: Module Module1 ''' <summary> ''' Screen-Festlegung für eine Form bei Multiscreen-System ''' </summary> ''' <param name="theForm">die Form</param> ''' <param name="scrStr">der Screen-String für den ausgewählten Bildschirm</param> ''' <param name="formPos">die alte festgelegte FormStartPosition</param> ''' <param name="formLoc">eine spezielle Position der Form, wenn gewünscht</param> Public Sub locationSettingMultiscreen(ByVal theForm As Form, ByVal scrStr As String, _ ByVal formPos As FormStartPosition, ByVal formLoc As Point) Dim scp() As String, isx As Short If scrStr = "" Then Exit Sub If scrStr.Length = 1 Then isx = Val(scrStr) - 1 Else scp = Split(scrStr, ";") isx = Val(scp(1).Replace("DISPLAY", "")) - 1 ' der Index des Displays End If Dim standardPoint As Point = New Point(100, 100) ' eine Standard-Location With theForm Dim ws As FormWindowState = .WindowState ' speichern Original-Windowstate ' diese Einstellungen muss die Form haben, um auf einem bestimmten ' Bildschirm lokalisiert zu werden .WindowState = FormWindowState.Normal .StartPosition = FormStartPosition.Manual ' neue Position der Form anhand der voreingestellten FormStartPosition ' und der Bildschirmgröße neu berechnen Select Case formPos Case FormStartPosition.CenterScreen .Location = _ New Point(Screen.AllScreens(isx).Bounds.X + _ (Screen.AllScreens(isx).Bounds.Width - .Width) \ 2, _ (Screen.AllScreens(isx).Bounds.Y + _ (Screen.AllScreens(isx).Bounds.Height - .Height) \ 2)) Case FormStartPosition.WindowsDefaultLocation .Location = _ New Point(Screen.AllScreens(isx).Bounds.X + standardPoint.X, _ Screen.AllScreens(isx).Bounds.Y + standardPoint.Y) ' Case FormStartPosition.CenterParent ' Case FormStartPosition.Manual ' Case FormStartPosition.WindowsDefaultBounds End Select ' es ist spezielle Location für die Form angegeben If Not formLoc.Equals(New Point(0, 0)) Then If formLoc.X < 0 Then ' Form horizontal zentriert .Location = _ New Point(Screen.AllScreens(isx).Bounds.X + _ (Screen.AllScreens(isx).Bounds.Width - .Width) \ 2, _ Screen.AllScreens(isx).Bounds.Y + formLoc.Y) Else .Location = _ New Point(Screen.AllScreens(isx).Bounds.X + _ formLoc.X, Screen.AllScreens(isx).Bounds.Y + formLoc.Y) End If End If ' zurückstellen auf Original-WindowState If Not .WindowState.Equals(ws) Then .WindowState = ws End With End Sub End Module
Eine Besonderheit in der Funktion ist vielleicht, die Zwischenspeicherung des FormWindowState. Das ist notwendig, wenn dieser nämlich Maximized ist, kann die Form nicht programmatisch postioniert werden, der WindowState muss so zu sagen zwischenzeitlich mal kurz auf Normal eingestellt werden. Aufruf: locationSettingMultiscreen(Me, screenDefineStr, FormStartPosition.CenterScreen, Nothing) mit screenDefineStr = "2" |