
11 Januar 2009, 15:56 von
klaus_b3069 mal gelesen.Wer schon einmal versucht hat eine Windows Forms Anwendung in den Tray zu starten hat bestimmt schnell festgestellt, dass dem Problem mit dem üblichen Vorgehen wie etwa:
this.Hide();
this.Visible = false;
nicht beizukommen ist.
Hier bietet die Eigenschaft WindowState der Form-Klasse Abhilfe. Um die Form auch wirklich nur im Tray anzuzeigen muss noch die Eigenschaft ShowInTaskbar auf false gesetzt werden.
Da die Form wahrscheinlich nicht immer in den Tray gestartet werden soll, muss auch die Methode Main der zugehörigen Program-Klasse angepasst werden, da ja auf ein Argument geachtet werden soll. Der Konstruktor der Form-Klasse muss ebenfalls angepasst werden um von der Program-Klasse entsprechend gestartet werden zu können. Im folgenden Beispiel wird eine Form mit dem Namen MainForm verwendet in der ein NotifyIcon mit dem Namen trayIcon vorhanden ist. die Anwendung soll mit dem Argument min in den Tray gestartet werden. Also z.B. TestApp.exe min
Also muss zunächst die Klasse Program das Argument verarbeiten und an den Konstruktor der Klasse MainForm weiterreichen.
[STAThread]
static void Main(string[] args)
{
bool startminimized = false;
if (args.Length == 1)
{
if (args[0].ToUpperInvariant().Equals("MIN"))
{
startminimized = true;
}
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm(startminimized));
}Bis jetzt weis die Klasse MainForm, dass sie in den Tray starten soll, da der Konstruktor der Klasse einen Parameter vom Typ bool verarbeitet.
Es ist zu beachten, dass die Form erst minimiert wird, nachdem InitializeComponent() im Konstruktor aufgerufen wurde. Ich fasse gerne die UI-Relevanten Zuweisungen in einer eigenen Methode zusammen, um Änderungen und Anpassungen nur an einem Platz vornehmen zu müssen. Diese Methode wird im Konstruktor immer unmittelbar nach InitializeComponent() aufgerufen. In diesem Fall kann der Konstruktor-Parameter gleich weitergereicht werden.
public MainForm(bool minimize)
{
// hier andere Konstruktor-Code
// Komponenten und UI initialisieren
this.InitializeComponent();
this.InitializeUI(minimize);
}
private void InitializeUI(bool minimized)
{
// Form und trayIcon-Ressourcen zuweisen
this.Text = Resources.MainForm_Text;
this.trayIcon.Icon = Resources.trayIcon01;
this.trayIcon.Text = this.trayMessageText;
// prüfen ob in den Tray gestartet wird
if (minimized)
{
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
this.trayIcon.Visible = true;
this.isInTray = true;
}
}Jetzt wird bei Übergabe des Arguments min an die Anwendung diese komplett Initialisiert, anschließend ausgeblendet und statt dessen das NotifyIcon im Tray angezeigt. Die Anwendung ist jetzt weder in der Liste der aktiven Anwendungen (ALT+TAB) noch in Flip-3D (
+TAB) zu sehen.
Wenn die Form wieder auf dem Desktop angezeigt wird und in der Taskleiste sichtbar sein soll, darf natürlich nicht vergessen werden, die Eigenschaft ShowInTaskbar wieder auf true zu setzen. Hier bietet sich der Ereignishändler an, welcher die Form wieder aus dem Tray holt.
Zum Schluss noch ein Tipp zum debuggen der Anwendung. Um eine Übergabe des Arguments min beim debuggen zu simulieren, kann hier wunderbar die Eigenschaft IsAttached der Debugger-Klasse im Konstruktor der MainForm-Klasse verwendet werden.
public MainForm(bool minimize)
{
// prüfen ob die Anwendung in der IDE läuft
if (Debugger.IsAttached)
{
minimize = true;
}
// hier der Konstruktor-Code.
}Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitte "kicken" sie ihn.
