VB.NET-Tipp 0030: Programm ohne Form starten (nur Systray-Icon)
von Spatzenkanonier
Beschreibung
Application.Run() funktioniert auch ohne Form - aber wie gibt man dem Anwender die Möglichkeit eine solche fensterlose Anwendung wieder zu beenden? Eine Möglichkeit ist, ein NotifyIcon im Systray zu platzieren.
Beachten Sie: Bei einer normalen Windows Forms-Anwendung ist das NotifyIcon einfacher und sicherer im Form-Designer einzurichten (incl. Kontextmenu). Dabei erzeugt der Designer auch den erforderlichen Code für die Ressourcenbereinigung.
Schwierigkeitsgrad: | Framework-Version(en): .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 | .NET-Version(en): Visual Basic 2005, Visual Basic 2008 | Download: |
' Dieser Quellcode stammt von http://www.activevb.de ' und kann frei verwendet werden. Für eventuelle Schäden ' wird nicht gehaftet. ' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. ' Ansonsten viel Spaß und Erfolg mit diesem Source! ' Projektversion: Visual Studio 2005 ' Option Strict: Aus ' Option Explicit: An ' ' Referenzen: ' - System ' - System.Data ' - System.Drawing ' - System.Windows.Forms ' - System.Xml ' ' Imports: ' - Microsoft.VisualBasic ' - System ' - System.Collections ' - System.Data ' - System.Diagnostics ' ' ############################################################################## ' ################################ Dialog1.vb ################################## ' ############################################################################## Public Class Dialog1 'Im Designer gesetzten Eigenschaften: 'Form.AcceptButton = Ok_Button 'Form.CancelButton = Cancel_Button 'Ok_Button.DialogResult = DialogResult.Ok 'Cancel_Button.DialogResult = DialogResult.Cancel Private StartUpTime As TimeSpan Public Overloads Shared Sub ShowDialog(ByVal StartupTime As TimeSpan) Using D As New Dialog1 D.StartUpTime = StartupTime D.Timer1_Tick(Nothing, EventArgs.Empty) D.ShowDialog() End Using End Sub Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick Me.Label1.Text = String.Format("Seit Programmstart vergingen: {0:HH:mm:ss}", Now - StartUpTime) End Sub End Class ' ############################################################################## ' ################################ modMain.vb ################################## ' ############################################################################## Imports System.Windows.Forms Public Module modMain Private WithEvents _Notifyer As New NotifyIcon() Private WithEvents mnuHelloWorld As New MenuItem("Hello World!") Private WithEvents mnuBeenden As New MenuItem("Beenden") Private StartUpTime As TimeSpan Public Sub Main() With _Notifyer .Icon = My.Resources.FACE02 .Text = "Ein Icon im Systemtray, mit KontextMenü" .ContextMenu = New ContextMenu(New MenuItem() {mnuHelloWorld, mnuBeenden}) .Visible = True End With StartUpTime = Now - Date.MinValue ' Hier geht die Anwendung in eine Warteschleife ohne Rückkehr, da ' kein MainForm angegeben ist, dessen Schließen die Rückkehr auslösen würde Application.Run() End Sub Private Sub Menu_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles mnuHelloWorld.Click, mnuBeenden.Click Select Case True Case sender Is mnuHelloWorld MessageBox.Show("Hello World!") Case sender Is mnuBeenden 'Ressourcenfreigabe: ein polymorphes Array erstellen, mit allen Komponenten, die 'IDisposable implementieren - und die in der Schleife disposen For Each D As IDisposable In New IDisposable() { _ _Notifyer.ContextMenu, _Notifyer, mnuHelloWorld, mnuBeenden} D.Dispose() Next ' das "natürliche" Ende einer Anwendung, nach Schließen des MainForms, wird hier ' notgedrungen etwas forciert. Application.Exit() End Select End Sub Private Sub _Notifyer_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) _ Handles _Notifyer.DoubleClick Dialog1.ShowDialog(StartUpTime) End Sub End Module
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 6 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Martin am 09.08.2011 um 22:08
Hallo!
Funktioniert super!
Danke!
Martin
Kommentar von Thomas B am 09.08.2011 um 20:31
Ergänze den code folgendermaßen
'alle menüeinträge ergänzen (deklarieren)
Private WithEvents mnu_test As New MenuItem("Test")
...
Public Sub Main()
With _Notifyer
.Icon = My.Resources.Face
.Text = "Ein Icon im Systemtray, mit KontextMenü"
.ContextMenu = New ContextMenu(New MenuItem() {mnuHelloWorld, mnu_test, mnuBeenden})
.Visible = True
End With
'hier auch die "namen" eintragen...
Private Sub Menu_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles mnuHelloWorld.Click, mnu_test.Click, mnuBeenden.Click
Select Case True
Case sender Is mnuHelloWorld
MessageBox.Show("Hello World!")
Case sender Is mnu_test
MessageBox.Show("Test wurde betätigt")
Case sender Is mnuBeenden
'Ressourcenfreigabe: ein polymorphes Array erstellen, mit allen Komponenten, die
'IDisposable implementieren - und die in der Schleife disposen
For Each D As IDisposable In New IDisposable() { _
_Notifyer.ContextMenu, _Notifyer, mnuHelloWorld, mnu_test, mnuBeenden}
D.Dispose()
Next
' das "natürliche" Ende einer Anwendung, nach Schließen des MainForms, wird hier
' notgedrungen etwas forciert.
Application.Exit()
End Select
End Sub
'und hier dann die Abzweigungen (wo passiert was....)
einfach mal ein wenig experimentieren ... ;D
Kommentar von Martin am 04.08.2011 um 18:05
Hallo,
Gibt es auch eine Möglichkeit das Menü während der Laufzeit zu ändern?
Danke!
Martin
Kommentar von Philipp Stephani am 30.08.2006 um 22:17
@Dominic: Du musst nichts einbinden, es handelt sich nur um ein Beispiel zur Verwendung der NotifyIcon-Komponente, das nicht wiederverwertbar ist. Um ein Infobereichssymbol einzurichten, füg einfach deiner Form eine NotifyIcon-Komponente hinzu und leg die Eigenschaften entsprechend fest, du brauchst keine Zeile Code zu schreiben.
Kommentar von Dominic am 21.11.2004 um 18:02
Hi,
wie genau muss ich dieses modul einbinden damit meine forum in der tray erscheint?
mfg
Dominic
Kommentar von Andreas Baumüller am 24.03.2004 um 21:28
Man sollte natürlich ein "netlogo.ico" schon in seinem Verzeichnis haben.
Ein Hinweis wäre da nicht schlecht gewesen.