Messagebox aus Thread in den Vordergrund bringen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Messagebox aus Thread in den Vordergrund bringen

    yo Leute,

    eigentlich eine banale Frage jedoch fällt mir dazu nicht wirklich eine Lösung ein.
    Hintergrund:

    Es werden im Hintergrund (in einem eigenen Thread) Daten gesichert. Dies geschieht im Normalfall in der Nacht. (Anzumerken ist, das Programm läuft im Tray)
    Gab es dabei jetzt irgendwelche Fehler will ich den User per Messagebox darüber informieren. Mach ich hier ein normales Messagbox.Show kommt das aber nicht in den Vordergrund.

    Hab ich das Programm im Vordergrund ist die Messagebox sichtbar jedoch nicht als modaler Dialog da diese ja nicht im GUI Thread aufpoppt.

    Wie kann ich dem Hauptthread aus einem anderen Thread mitteilen, dass er die Messagebox anzeigen soll? Geht das überhaupt?

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Da würde ich mir einen eigenen MessageBox-Dialog erstellen und diesen aufrufen.
    Allerdings wird der Thread bei einem modalen Aufruf blockiert!
    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!
    Das hab ich sogar schon probiert. Also in ganz simpler Form:
    Form erstellt und per ShowDialog aufgerufen. Hab sogar TopMost auf True gesetzt, jedoch zeigt er mit diese nur in der Taskleiste an. (Also wieder nicht im Vordergrund)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hab mal fix mit einem BGW getestet, das funktioniert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. BackgroundWorker1.RunWorkerAsync()
    3. End Sub
    4. Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    5. Using dlg As New Form2
    6. dlg.TopMost = True
    7. dlg.ShowDialog()
    8. End Using
    9. 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!
    So hat es bei mir auch funktioniert (wenn die Hauptform offen ist). Jedoch hatte man bei meinem Test die Möglichkeit trotz des ShowDialogs in die Hauptform klicksen zu können.
    Bei mir läuft das Programm aber im Tray und da erscheint nur ein Symbol in der Taskleiste. Das übersieht man jedoch ganz leicht.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    :?: :?: :?:
    Wenn ich das Hauptfenster vorher auf Visible = False setze, geht es auch.
    Kannst Du mal Deinen Globalablauf skizzieren?
    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!
    Mal im Pseudo:

    VB.NET-Quellcode

    1. dim t as new thread(adressof machwas)
    2. t.start
    3. Sub machwas()
    4. ' macht was
    5. ' Bei Fehler Messagebox
    6. End Sub


    Beim Programmstart bzw. will man das Programm per "X" schließen:

    VB.NET-Quellcode

    1. e.Cancel = True
    2. ntfMain.Visible = True
    3. Me.ShowInTaskbar = False
    4. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedToolWindow
    5. Me.Hide()
    6. Me.WindowState = FormWindowState.Minimized


    Somit ist das Programm im Tray und verrichtet brav seine Arbeit.
    Ich hab es eben auch mit Events versucht. dh Wenn ein Fehler war soll er mit RaiseEvent das auslösen. Abbonier ich das in der Form wird mir die Messagebox auch nur in der Taskleiste angezeigt...
    Also halt so ein Symbol und wenn man da draufklickst steht die Messagebox da.

    Ich denke, dass es aber nicht an dem Tray liegt. Denn mach ich nach dem Initialisieren (wo das Programm bereits im Tray liegt) eine Messagebox scheint diese ganz normal auf.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    @Artentus: Danke das wars! :thumbup:
    Dh wird die BeginInvoke Methode ohne Control aufgerufen, wird standardmässig die Klasse (in meinem Fall ja die Form) verwendet in der die Methode aufgerufen wird?

    Ich musste es zwar über einen Delegaten lösen, da vb 2008 diese Synthax noch nicht unterstützt aber ist ja der gleiche Effekt :)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten