2009-04-19 9 views
1

私は付属のコンテキストメニューのシェルトレイアイコンを持っています。私が抱えている問題は、コンテキストメニューClickedハンドラからShowDialog()を呼び出すと、モーダルダイアログが表示されないということです。NotifyIconコンテキストメニューからモーダルダイアログを取得するにはどうすればよいですか?

これは、デフォルトのC#プロジェクトで簡単に再現できます。あなたはこれをビルドして実行した場合、あなたは、単に二回コンテキストメニュー項目を選択することによって、画面上の2つのメッセージボックスを取得することができます

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

:単純にはForm1.csファイルに次のコードを追加します。これはモーダルではありませんか?これを別のフォームのShowDialog()の呼び出しに置き換えると、同じ非モーダル動作になります。

NotifyIconは、典型的なWindowsアプリケーションのように、NotifyIconが特にFormに関連付けられていないことを推測します。しかし私はそれをする方法を見ません。

アイデア?助けをあらかじめありがとう!

答えて

0

私はあなたがモーダルメッセージボックスを表示しようとする前に2つのことをやってお勧めします:

  1. あなたのアイコンの所有者・ウィンドウを表示してください。
  2. フォーカスを合わせます。

これを実行すると、MessageBox.Show内のthisが有効な「モダリティの親」になります。

ひどく、メッセージボックスが生成されたプログラムの上にメッセージボックスが表示されることさえあります。そうすれば、ユーザーはメッセージボックスの内容を把握できます。

+0

システムトレーのアイコンが隠れたウィンドウに裏打ちされているような理由は何種類もあります。システムトレイに複数のトレイがあると思います。 問題は、Shell_NotifyIcon API呼び出しでウィンドウ(フォーム)をシェルアイコンに関連付けているため、これはWindowsで通常処理されることです。モダリティが強制されます。 .NETでは、NotifyIconにフォームを関連付ける方法はありません。 –

+1

モーダルダイアログボックスは、単にアプリケーション内の別のウィンドウにフォーカスが移動されないようにするダイアログボックスです。あなたのウィンドウが隠れている場合、それは意味がありません。 「システム全体のモーダル」ダイアログボックスを作成しようとしていますか?彼がダイアログボックスを扱うまで、ユーザーが* anything * elseを実行できないようにする何か? – scraimer

0

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

関連する問題