1

コンテキストメニューが付いたシェルトレイアイコンがあります。私が抱えている問題は、コンテキストメニューのClickedハンドラーからShowDialog()を呼び出しても、モーダルダイアログが表示されないことです。

デフォルトのC#プロジェクトでこれを再現するのは簡単です。次のコードをForm1.csファイルに追加するだけです。

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    ToolStripMenuItem contextMenuShowMsg = new System.Windows.Forms.ToolStripMenuItem();
    contextMenuShowMsg.Name = "contextMenuShowMsg";
    contextMenuShowMsg.Text = "Show MessageBox...";
    contextMenuShowMsg.Click += new System.EventHandler(this.contextMenuShowMsg_Click);

    ContextMenuStrip contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components);
    contextMenuStrip.Items.Add(contextMenuShowMsg);

    NotifyIcon notifyIcon = new NotifyIcon();
    notifyIcon.Text = "DlgTest";
    notifyIcon.Icon = SystemIcons.Application;
    notifyIcon.Visible = true;
    notifyIcon.ContextMenuStrip = contextMenuStrip;
}

private void contextMenuShowMsg_Click(object sender, EventArgs e)
{
    MessageBox.Show(this, "Test MessageBox");
}

これを作成して実行すると、コンテキストメニュー項目を2回選択するだけで、画面に2つのメッセージボックスを表示できます。これはモーダルであるべきではありませんか?これを別のフォームのShowDialog()の呼び出しに置き換えると、同じ非モーダル動作になります。

私の推測では、NotifyIconは、通常のWindowsアプリケーションのように、フォームに特に関連付けられていません。しかし、私にはそれを行う方法がありません。

何か案は?助けてくれてありがとう!

4

2 に答える 2

0

モーダル メッセージ ボックスを表示する前に、次の 2 つのことを行うことをお勧めします。

  1. アイコンのオーナー ウィンドウを表示します。
  2. 焦点を当てます。

これが完了するとthis、MessageBox.Show 内の が正当な「モダリティの親」になります。

メッセージ ボックスが生成されたプログラムの上にメッセージ ボックスが表示される方が理にかなっていますね。そうすれば、ユーザーはメッセージ ボックスの内容についてある程度のコンテキストを持つことができます。

于 2009-04-19T07:41:56.793 に答える
0

システム トレイ メニューのアクティブ化を追跡し、ダイアログが開いているときに無効にする必要があります。

于 2009-04-19T08:49:10.843 に答える