c # - Skift formularens synlighed på NotifyIcon Klik og gem det på klik andre steder

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en applikation, der er i systembakken. Jeg vil gøre det synligt, når brugeren klikker på notifyIcon, hvis den ikke er synlig allerede. Hvis den allerede er synlig, skal den være skjult. Også når brugeren klikker et andet sted undtagen på blanketten, skal formularen skjul (hvis det er synligt).


Min kode ser sådan ud:


protected override void OnDeactivated(EventArgs e)
{
    showForm(false);
}

public void showForm(bool show)
{
    if(show)
    {
        Show();
        Activate();
        WindowState = FormWindowState.Normal;
    }
    else
    {
        Hide();
        WindowState = FormWindowState.Minimized;
    }
}

private void notifyIcon1\_MouseClicked(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        if (WindowState != FormWindowState.Normal)
        {
            showForm(true);
        }
    }
}


Problemet med koden er, at onDeactivated bliver kaldt før klikopkaldet, som skjuler formularen og notifyIcon1\_MouseClicked end blot viser det igen. Hvis jeg kunne opdage, om fokuset var tabt på grund af et klik på notifyIcon eller andetsteds, ville det løse problemet.


Jeg har lavet min forskning og fundet en lignende tråd, men løsningen opdages bare, hvis musepositionen er over bakken, når onDeactivated bliver kaldt: C # bytte vindue ved at klikke NotifyIcon (proceslinjeikon)


UPDATE:
Løsningen, jeg posterede, registrerer kun, om brugerens mus er over ikonerne på bakken i proceslinjen, så hvis du klikker på en anden bakke, vil onDeactivated -hændelsen ikke blive fyret.
Jeg vil have samme funktionalitet som system volumen app.

Bedste reference


Du skal blot holde øje med den tid, hvor vinduet blev sidst gemt. Og ignorér musekliket, hvis det skete for nylig. Sådan her:


int lastDeactivateTick;
bool lastDeactivateValid;

protected override void OnDeactivate(EventArgs e) {
    base.OnDeactivate(e);
    lastDeactivateTick = Environment.TickCount;
    lastDeactivateValid = true;
    this.Hide();
}

private void notifyIcon1\_MouseClick(object sender, MouseEventArgs e) {
    if (lastDeactivateValid && Environment.TickCount - lastDeactivateTick < 1000) return;
    this.Show();
    this.Activate();
}


Når du klikker på ikonet gentagne gange, skifter vinduessigtet pålideligt.