Переключение видимости формы при нажатии кнопки NotifyIcon и скрытие ее при нажатии в другом месте - PullRequest
1 голос
/ 05 сентября 2011

У меня есть приложение, которое находится в системном трее.Я хочу сделать его видимым, когда пользователь нажимает на notifyIcon, если он еще не виден.Если он уже виден, его следует скрыть.Также, когда пользователь щелкает где-либо еще, кроме формы, форма должна скрываться (если она видна).

Мой код выглядит следующим образом:

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);
        }
    }
}

Проблема с кодом заключается в том, что onDeactivated вызывается до вызова click, что скрывает форму и notifyIcon1_MouseClicked, а не просто повторный вызов.показывает это.Если бы я мог определить, был ли потерян фокус из-за нажатия на notifyIcon или в другом месте, это решило бы проблему.

Я провел исследование и обнаружил аналогичную нить, но решение просто обнаружил, еслиположение мыши над лотком, когда вызывается onDeactivated: * Переключение окна C # по щелчку NotifyIcon (значок на панели задач)

ОБНОВЛЕНИЕ: Размещенное мной решение обнаруживает, только если мышь пользователя находится надЗначки в трее на панели задач, поэтому если вы нажмете на любой другой трей, событие onDeactivated не будет запущено.Я хочу получить ту же функциональность, что и приложение системного тома.

1 Ответ

5 голосов
/ 05 сентября 2011

Просто следите за временем, когда окно было в последний раз скрыто. И игнорируйте щелчок мышью, если это произошло недавно. Как это:

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();
}

Повторное нажатие на значок теперь надежно переключает видимость окна.

...