Leeres Projekt nicht direkt schließen

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Hitch.

    Leeres Projekt nicht direkt schließen

    Hallo zusammen,

    mein Problem:
    Wie kann ich es verhindern, dass sich ein leeres Projekt direkt wieder schließt?


    Infos:

    Ich habe ein neues Leeres Projekt erstellt. Dieses Projekt hat das Modul „Base“.
    In diesem Modul wird nun ein NotificationIcon erstellt, das auch angezeigt wird, jedoch nur kurz, weil sich das Modul dann abgearbeitet hat und logischerweise beendet.
    Ich will diesem NotificationIcon nun aber noch ein Kontextmenü geben, um bestimmte Dinge ablaufen zu lassen.
    Weiter soll das Leere Projekt auch noch andere Funktionen ausführen. Da das Leere Projekt aber keine Benutzeroberfläche braucht und GUI etc. hier in anderen Klassenbibliotheken aufgerufen werden, ist es allerdings notwendig, das das Projekt/Programm am laufen bleibt, genau wie eine Form Anwendung.


    Viele Grüße,
    Hitch
    @Hitch:: Falls das eine Console-Applikation ist: Schmeiß sie weg und mach eine WinForm-App draus.
    Falls das eine WinForm-App ist: Pack das Notify-Objekt aus der Prozedur in die Klasse, dass es stehenbleiben kann und nicht bei Verlassen der Prozedur zerstört wird.
    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!
    Hi,

    vielen Dank für die Antwort.
    Also die Idee mit der Windows Forms-Anwendung ist mir auch schon gekommen.
    Allerdings, soll mein Programm keine GUI haben, sondern nur das NotificationIcon also es soll keine Form o.ä. angezeigt werden.

    Gruß,
    Hitch

    Lingo schrieb:

    Und das programm schliesst sich nicht.
    Ist allerdings auch nicht geeignet, ordentlich auf Events zu reagieren.
    @Hitch:: Du musst ja keine GUI anzeigen. Zur Programmentwicklung und zum Test ist sie aber sehr nützlich.
    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!
    @Lingo: Jetzt stellt sich nur die Frage, wie die Anwendung auf Klicks auf das NotifyIcon reagieren soll, wenn sie auf eine Benutzereingabe wartet (sprich: wenn sie hängt).

    Ich habe hier was getestet.
    Deaktiviere das Anwendungsframework wie hierbeschrieben und probiere mal das:

    VB.NET-Quellcode

    1. Public Shared Sub Main(Args As String())
    2. Application.EnableVisualStyles()
    3. Dim F As New Form
    4. 'F.ShowInTaskbar = False
    5. 'F.FormBorderStyle = FormBorderStyle.None
    6. 'F.TransparencyKey = Color.Magenta
    7. 'F.BackColor = Color.Magenta
    8. 'F.WindowState = FormWindowState.Minimized
    9. Dim Notifier As New NotifyIcon
    10. Notifier.Icon = SystemIcons.Hand 'Beispiel
    11. Notifier.Visible = True
    12. AddHandler Notifier.Click, AddressOf Foo
    13. Application.Run(F)
    14. Notifier.Dispose()
    15. End Sub
    16. Private Shared Sub Foo(sender As Object, e As EventArgs)
    17. MessageBox.Show("Hallo Welt")
    18. End Sub


    Die auskommentierten Teile sind meine Versuche, die Form zu verbergen. Das Problem ist nämlich, dass F.Visible = False unwirksam wird, sobald man Application.Run() aufruft.

    Eine andere Möglichkeit wäre, eine minimalistische Form-Klasse anzulegen:

    VB.NET-Quellcode

    1. Class InvisibleForm
    2. Inherits Form
    3. Public Sub New()
    4. Me.ShowInTaskbar = False
    5. Me.FormBorderStyle = FormBorderStyle.None
    6. Me.TransparencyKey = Color.Magenta
    7. Me.BackColor = Color.Magenta
    8. End Sub
    9. Protected Overrides Sub OnShown(e As System.EventArgs)
    10. Me.Visible = False
    11. MyBase.OnShown(e)
    12. End Sub
    13. End Class

    ShowInTaskbar muss sowieso auf False gesetzt werden. Ohne setzen des TransparencyKeys wird die Form beim Starten der Anwendung kurz angezeigt, bevor sie verschwindet. Dadurch wird das verhindert. Und sobald die OnShown-Methode ausgeführt wird, ist sie sowieso weg :)
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    @Niko
    Ja das funktioniert! Aber ist das nicht ein wenig unschön, trotz da ich keine GUI brauche eine Form generieren zu lassen und diese dann "auszublenden".
    Das wollte ich nämlich vermeiden.

    @ErfinderDesRades
    Das ist schon eleganter. Trotzdem wird hier eine GUI benötigt soweit ich Das verstehe.
    Aber hier wird die GUI am Anfang nicht aufgebaut. --> So wie ich's wollte.

    @Lingo
    Der Code:

    VB.NET-Quellcode

    1. Console.ReadLine()

    funktioniert nicht in diesem Zusammenhang. Vllt mache ich was falsch? Das Projekt schließt trotzdem sofort wieder.



    Ich werde es dann vermutlich wirklich mit dem Ausblenden der GUI umsetzen müssen.

    Gruß,
    Hitch

    Hitch schrieb:

    funktioniert nicht in diesem Zusammenhang.
    Console.ReadLine() ist eine Console-Applikation.
    Eine (un-)sichtbare Form ist eine WinForm-Applikation.
    Entscheide Dich für eines und dann sehen wir weiter.
    Ich empfehle Dir eine WinForm-Applikation, so ist diese App völlig unsichtbar:

    VB.NET-Quellcode

    1. Me.Opacity = 0
    2. Me.ShowInTaskbar = False
    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!
    @Hitch:
    Oh mann, die Lösung kann ja so einfach sein :D
    Einfach Application.Run() ohne Argumente aufrufen (und einfach keine Form generieren). Dann wird die Nachrichtenschleife gestartet (und diese ist nunmal nötig, um auf Mausaktionen zu reagieren). Und um das Programm zu beenden muss nur Application.Exit() aufgerufen werden. Dadurch wird die Nachrichtenschleife verlassen.
    Nicht vergessen, das NotifyIcon zu disposen. Sonst bleibt ein Geister-Icon im Infobereich, bis man mit der Maus drüberfährt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Hitch schrieb:

    Das ist schon eleganter. Trotzdem wird hier eine GUI benötigt soweit ich Das verstehe.
    Aber hier wird die GUI am Anfang nicht aufgebaut. --> So wie ich's wollte.

    nein, die Gui wird nicht benötigt - btw ein NotifyIcon ist ja ein Gui.
    Das Form ist eiglich nicht nötig, und habich auch nur widerstrebend reingemacht, weil wennman eh ein Form hat, dann kannmans einfacher mit Form+NotifyIcon machen, und das Form verbergen. (steht ja auch überm Tipp)

    Ganz ohne Gui geht so:

    VB.NET-Quellcode

    1. Application.Run()
    Aber dann sieht man ja nix.
    @Hitch:: Zu Testzwecken empfehle ich Dir dringend eine (ausschaltbare) GUI, sonst suchst Du Dich dumm und dämlich, wenn Fehler auftreten.
    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 an alle!
    Es sind sehr hilfreiche Beitrage die Ihr gepostet habt.

    Meine Lösung sieht nun wie folgt aus:
    1. Eine Windows-Forms-Anwendung erstellen
    2. Ein Modul hinzufügen mit folgendem Code:

      VB.NET-Quellcode

      1. Public Module base_modMain
      2. Public Sub Main()
      3. Dialog1.NotifyIcon1.Visible = True
      4. Application.Run()
      5. End Sub
      6. End Module
    3. Das Anwendungsframework deaktivieren
    4. Als Startobjekt das Modul (base_modMain) auswählen
    So habe ich noch eine Oberfläche in der ich das Kontextmenü und das NotificationIcon erstellen kann.

    Viele Grüße,
    Hitch