Dialoge auf Hauptmonitor zurückholen

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Dialoge auf Hauptmonitor zurückholen

    Hallo zusammen.

    Ich hab aktuell immer wieder das Problem, dass mir teilweise Dialoge auf einen nicht vorhandenen Monitor verschwinden und somit nicht sichtbar und benutzbar sind.
    Das Problem wird entstehen, weil ich mal mit mehreren (2 oder 3) und mal mit nur einem Monitor arbeite. Gibt's eine Möglichkeit die Dinger auf den Hauptmonitor (wo das Hauptfenster der Anwendung angezeigt wird) zurückzuholen?
    Tastenkombination oder kann man das Kontextmenu in der Taskleiste erweitern?

    Die gängigen Tastenkombis (WIN+Pfeiltasten) zeigen keine Wirkung - müsste dann denk ich Codeseitig gelöst werden.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    @tragl Wenn das Fenster den Fokus hat: Alt+Leertaste, da poppt ein Menü auf, ein mal Down, Enter und dann mit der Maus bewegen.
    Probiere das zunächst mit einem Fenster, was Du sehen kannst.
    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!
    Wäre es nicht sinnvoll beim Start der App nach angeschlossenen Monitoren zu schauen? Ich kann mir nicht so recht vorstellen das ein Fenster, Dialog oder was auch immer einfach so auf einen anderen Monitor, der nicht angeschlossen ist, verschwindet. Das hast du doch bestimmt auch Codeseitig vollzogen.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Wenn der Falsch-Monitor links vom aktuellen ist, die Maus also nach links aus dem aktuellen Bildschirm verschwinden kann, ist die Position Left-Property der App im Minusbereich.
    Wenn der Falsch-Monitor rechts vom aktuellen ist, die Maus also nach rechts aus dem aktuellen Bildschirm verschwinden kann, ist die Position Left-Property der App größer als Screen.PrimaryScreen.Bounds.Width
    Oben/unten vermutlich entsprechend mit Top
    Beides lässt sich ermitteln und auch ändern.
    Zugänglich sollten alle vermeintlich vorhandenen Bildschirmbereiche mit Screen.AllScreens sein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RodFromGermany: hatte ich schon probiert. Da die Anwendung je nach Situation über Citrix gestreamt wird funzt das leider nicht
    @Akanel: jain - ich stell mir da eher den Weg vor, den Monitor abzugreifen, wo das Hauptfenster geöffnet ist.

    Ich speichere und lade die Dialog-Positionen wie folgt:

    VB.NET-Quellcode

    1. Friend Sub getSetFormSizeAndLocation(frm As Form, StoreNewSizeAndPosition As Boolean)
    2. Dim settingName = $"FormSizeAndLocation"
    3. Dim rwSetting = GetAppSettingRow(settingName, frm.Name)
    4. If rwSetting Is Nothing Then rwSetting = Dts.AppSetting.AddAppSettingRow(User.UserRow, Environment.MachineName, settingName, frm.Name, "", 0, 0, False, $"{frm.Width},{frm.Height}#{frm.Location.X},{frm.Location.Y}")
    5. If StoreNewSizeAndPosition Then
    6. If Not frm.WindowState = FormWindowState.Maximized Then rwSetting.strSetting = $"{frm.Width},{frm.Height}#{frm.Location.X},{frm.Location.Y}"
    7. rwSetting.boolSetting = If(frm.WindowState = FormWindowState.Maximized, True, False)
    8. End If
    9. Dim sizeStr = rwSetting.strSetting.LeftCut("#"c)
    10. Dim locationStr = rwSetting.strSetting.RightCut("#"c)
    11. frm.Size = New Size With {.Width = ConvertToInteger(sizeStr.LeftCut(","c)), .Height = ConvertToInteger(sizeStr.RightCut(","c))}
    12. frm.Location = New Point With {.X = ConvertToInteger(locationStr.LeftCut(","c)), .Y = ConvertToInteger(locationStr.RightCut(","c))}
    13. If rwSetting.boolSetting Then frm.WindowState = FormWindowState.Maximized
    14. End Sub


    Ich müsste mal rausfinden, wie ich den Monitor des Hauptfensters rausbekomme, dann werd ich das vermutlich in Zeile 12 mit einbauen müssen, dass er die Position wiederherstellt - allerdings dann auf dem Monitor des Hauptfensters oder?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Hab's wohl hinbekommen.
    Ich nutz eine Public Shared Property, die den Screen meiner frmMain beinhaltet

    VB.NET-Quellcode

    1. Public Shared Property MainFormScreen As Screen = Nothing
    2. App.MainFormScreen = Screen.FromControl(Me)


    Dann hatte ich sowieso einen eigenen DialogHandler um einige Dinge für alle Dialog gleich zu halten.
    Da hab' ich jetzt im KeyDown-Event die F12-Taste eingebaut:
    Case Keys.F12 : dlg.Location = App.MainFormScreen.WorkingArea.Location

    Das holt mir alle Dialoge mit Druck auf F12 in die obere Linke Ecke der frmMain zurück ;)
    Ich bau' jetzt nur noch ein, dass die o.g. Property aktualisiert wird, wenn man frmMain auf nen anderen Monitor verschiebt dann sollte das passen
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: