Winforms - почему "Show ()" после двойного щелчка в системном трее в моем приложении минимизируется? - PullRequest
2 голосов
/ 05 апреля 2010

Winforms - почему "Show ()" после двойного щелчка в системном трее в моем приложении минимизируется?

Как в случае двойного щелчка уведомить меня, что моя скрытая основная форма возвращается видимой как обычно, не свернутой (и не развернутой в этом отношении тоже)

Ответы [ 2 ]

3 голосов
/ 05 апреля 2010

Я полагаю, что вы положили свое приложение в трей с минимальным действием В этом случае Show просто восстанавливает видимость.

Попробуйте добавить form.WindowState = Normal перед Show ().

1 голос
/ 05 апреля 2010

Скрытие вашей формы с помощью NotifyIcon часто желательно, поэтому ваше приложение запускается прямо в трее.Вы можете предотвратить его появление, переопределив метод SetVisibleCore ().Вы также обычно хотите предотвратить его закрытие, когда пользователь нажимает кнопку X, переопределите метод OnFormClosing, чтобы скрыть форму.Вам понадобится контекстное меню, позволяющее пользователю действительно выйти из вашего приложения.

Добавьте NotifyIcon и ContextMenuStrip к вашей форме.Дайте CMS команды меню Show и Exit.Сделайте так, чтобы код формы выглядел так:

  public partial class Form1 : Form {
    bool mAllowClose;
    public Form1() {
      InitializeComponent();
      notifyIcon1.DoubleClick += notifyIcon1_DoubleClick;
      notifyIcon1.ContextMenuStrip = contextMenuStrip1;
      showToolStripMenuItem.Click += notifyIcon1_DoubleClick;
      exitToolStripMenuItem.Click += (o, e) => { mAllowClose = true; Close(); };
    }

    protected override void SetVisibleCore(bool value) {
      // Prevent form getting visible when started
      // Beware that the Load event won't run until it becomes visible
      if (!this.IsHandleCreated) {
        this.CreateHandle();
        value = false;
      }
      base.SetVisibleCore(value);
    }

    protected override void OnFormClosing(FormClosingEventArgs e) {
      if (!this.mAllowClose) {    // Just hide, unless the user used the ContextMenuStrip
        e.Cancel = true;
        this.Hide();
      }
    }

    void notifyIcon1_DoubleClick(object sender, EventArgs e) {
      this.WindowState = FormWindowState.Normal;  // Just in case...
      this.Show();
    }

  }
...