Ich möchte nur die Taskleiste Schaltfläche meiner Winforms-Anwendung durch ein Taskleistensymbol ersetzen. Das heißt, wenn der Benutzer mit der linken Maustaste auf das Symbol klickt, sollte das Formular aktiviert werden, wenn es nicht fokussiert wurde, andernfalls minimiert oder ausgeblendet.Korrekte Art, mein MainForm von einer NotifyIcon zu aktivieren, wenn es nicht bereits fokussiert war
Ich lese viele und viele Artikel über die ordnungsgemäße Verwendung eines NotifyIcon
, und es scheint, dass ich eine haschische Lösung akzeptieren muss. Also, was ist der richtige Weg?
Ich habe es meist zu laufen, aber jetzt bin ich fest auf erkennen, ob mein Formular bereits aktiv war - weil beim Klicken auf das Symbol, verliert das Formular den Fokus, so dass ich die Focused
Eigenschaft nicht überprüfen kann.
Der folgende Code löst dies noch nicht, also wenn das Formular nur von anderen Fenstern ausgeblendet wurde, müssen Sie zweimal klicken, weil der erste Klick minimiert.
Wie kann es verbessert werden?
private void FormMain_Resize(object sender, EventArgs e)
{
if (WindowState == FormWindowState.Minimized)
Hide();
}
private void notifyIcon_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
if (WindowState == FormWindowState.Minimized) {
WindowState = FormWindowState.Normal;
Show();
Activate();
}
else {
Hide();
WindowState = FormWindowState.Minimized;
}
}
(ich auch nicht verstehen, warum die Click
Ereignis ausgelöst wird auf der rechten Maustaste, die bereits über das Kontextmenü in meinem Fall öffnet ...)
(Und natürlich wäre es schön, zu habe eine richtige Minimierung Animation, aber es gibt andere Fragen hier, wo dies nicht wirklich gelöst wurde)
(Ich weiß, ich sagte Focused
, aber wenn das Formular bereits vollständig sichtbar war (aber vielleicht nicht fokussiert), und der Benutzer klickt auf das Tray-Icon, er möchte es wahrscheinlich ausblenden)
Sie müssen zu Hacks greifen seit dem Moment, bevor Sie auf NotifyIcon klicken, wird Ihr Formular deaktiviert. Viele Hacks versuchen, einen Timer im MouseMove-Ereignis zu starten und versuchen, ein MouseLeave-Ereignis zu erstellen, das mit diesem Symbol verbunden ist, aber keines davon ist zuverlässig, da Windows die Rechteckbegrenzungen Ihres Symbols nicht bereitstellt. – LarsTech
@LarsTech dann ist es vielleicht besser, einen Timer bei Deaktivierung des Formulars zu starten ... Aber das würde mir nicht gefallen. –