0

フォームのシステム メニューのエントリをクリックして、プログラムをシステム トレイに最小化したいと考えています。まず、通知アイコンとコンテキスト メニューを作成しました。

private void InitializeComponent()
{
  this.components = new Container();
  ...
  this.notifyIcon = new NotifyIcon();
  this.contextMenu = new ContextMenu();
  this.contextMenuItem1 = new MenuItem();
  this.contextMenuItem2 = new MenuItem();
  this.SuspendLayout();

  this.notifyIcon.ContextMenu = this.contextMenu;
  this.notifyIcon.Text = "Test";

  this.contextMenu.Name = "contextMenu";
  this.contextMenu.MenuItems.AddRange(new MenuItem[]
  {
    this.contextMenuItem1,
    this.contextMenuItem2
  });

  this.contextMenuItem1.Name = "contextMenuItem1";
  this.contextMenuItem1.Text = "&Show";
  this.contextMenuItem1.Click += new EventHandler(this.contextMenuItem1_Click);

  this.contextMenuItem2.Name = "contextMenuItem2";
  this.contextMenuItem2.Text = "&Exit";
  this.contextMenuItem2.Click += new EventHandler(this.contextMenuItem2_Click);
}

次に、システム メニューを拡張しました。

private void Form_Load(object sender, EventArgs e)
{
  int hmenu = GetSystemMenu(Handle, 0);
  AppendMenu(hmenu, 0xA00, 0, null);
  AppendMenu(hmenu, 0, 111, "M&inimize to system tray");
}

このメニュー項目をクリックすると、メイン ウィンドウがフェードアウトします。

protected override void WndProc(ref Message m)
{
  base.WndProc(ref m);
  if (m.Msg == 0x112)
  {
    if (m.WParam.ToInt32() == 111)
    {
      Visible = false;
      Hide();
      notifyIcon.Visible = true;
    }
  }
}

コンテキスト メニューをクリックすると、プログラム ウィンドウを再表示するか、アプリケーション全体を閉じる必要があります。

private void contextMenuItem1_Click(object sender, EventArgs e)
{
  notifyIcon.Visible = false;
  Show();
  Visible = true;
}

private void contextMenuItem2_Click(object sender, EventArgs e)
{
  Close();
}

私の問題は次のとおりです。新しいエントリをクリックして最小化すると、WndProc メソッドが正常に実行され、フォームは非表示になりますが、システム トレイに「Test」というキャプションを持つアイテムは表示されません。そして、別のウィンドウも表示されます。これは .NET によるものだと思いますが、ウィンドウが完全に空なのでわかりません。通常、プログラムを起動する Windows エクスプローラーの exe ファイルにフォールバックする必要がありますね。

前もって感謝します!

+++ 編集 +++

アプリケーションの背後にある空のウィンドウがコンソール ウィンドウであることがわかりました。winexe パラメータを使用してプロジェクトをコンパイルするのを忘れただけです。

4

0 に答える 0