2011-10-17 5 views
4

私はNotifyIconクラスを使用して、タスクトレイにアイコンを表示しています。このアイコンは2つの機能を実行します。ユーザーが左ボタンでシングルクリックするとウィンドウが表示され、右ボタンでシングルクリックするとコンテキストメニューが表示されます。これは、ユーザーがコンテキストメニューのオプションをクリックした後に表示されるウィンドウとは別に、うまく機能します。ここに私のコードだ:NotifyIcon ContextMenuと多すぎるクリックイベント

contextMenuItems = new List<MenuItem>(); 
contextMenuItems.Add(new MenuItem("Function A", new EventHandler(a_Clicked))); 
contextMenuItems.Add(new MenuItem("-")); 
contextMenuItems.Add(new MenuItem("Function B", new EventHandler(b_Clicked))); 
trayIcon = new System.Windows.Forms.NotifyIcon(); 
trayIcon.MouseClick += new MouseEventHandler(trayIcon_IconClicked); 
trayIcon.Icon = new Icon(GetType(), "Icon.ico"); 
trayIcon.ContextMenu = contextMenu; 
trayIcon.Visible = true; 

問題は、ユーザーが「機能A」または「機能B」を選択したときに、私のtrayIcon_IconClickedイベントが発生していることです。なぜそれが起こっているのだろうか?

おかげで、 J

答えて

3

NotifyIconコントロールにコンテキストメニューを割り当てることにより、それが自動的に右クリックをキャッチし、そこに割り当てられたコンテキストメニューを開きます。実際にコンテキストメニューを表示する前にロジックを実行する場合は、contextMenu.Popupイベントにデリゲートを割り当てます。ウィンドウがポップアップされたことは、あなたが開いているコンテキストメニューは、ターゲットコントロールとしてNotifyIconを使用しているので、あなたはそれをクリックしたときに、それはあなたが割り当てられたクリックハンドラを実行しているということである理由として

... 
contextMenu.Popup += new EventHandler(contextMenu_Popup); 
... 

private void trayIcon_IconClicked(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     //Do something here. 
    } 
    /* Only do this if you're not setting the trayIcon.ContextMenu property, 
    otherwise use the contextMenu.Popup event. 
    else if(e.Button == MouseButtons.Right) 
    { 
     //Show uses assigned controls Client location to set position, 
     //so must go from screen to client coords. 
     contextMenu.Show(this, this.PointToClient(Cursor.Position)); 
    } 
    */ 
} 

private void contextMenu_Popup(object sender, EventArgs e) 
{ 
    //Do something before showing the context menu. 
} 

私の推測NotifyIconに送信します。

編集:もう1つの選択肢として、ContextMenuStripを代わりに使用することが考えられます。 NotifyIconにはContextMenuStripプロパティもあり、それにはもっと多くの機能が関連付けられているようです(プログラマブルなことにもっと気付くことができます)。なんらかの理由で、うまく動作しない場合、そのショットを与えたいかもしれません。

+0

ありがとうございます。 NotifyIconをターゲットコントロールとして使用していますか?あるいは、メニューを手動でポップアップすることさえできますか?私はContextMenu.Show()を試みましたが、それはパラメータとしてコントロールを必要とし、Popupイベントを発生させないようです。 – JWood

+1

trayIcon_IconClickedイベントのクリックハンドラ内で右クリックを処理していますか?もしそうなら、しないでください。 ContextMenuプロパティを設定すると、コンテクストメニューに割り当てられているコントロールの右クリックイベントが自動的に処理されるため、これ以上処理する必要はありません。そのため、イベントを複製するだけなので、trayIcon_IconClickedイベントで省略されました。試してみてください。 – SPFiredrake

+0

私は手動でクリックを処理していませんでしたが、私はContextMenuプロパティを設定していましたが、コンテキストメニューから項目を選択したときに、trayIcon_IconClickedイベントを発生させる動作があります。上記の例は、 "this"がApplicationオブジェクトであるため動作しません。私はContextMenuStripを試してより良い結果が得られるかどうかを見ていきます。 – JWood

0

同じ問題が発生しました。私がいるContextMenuStripではなく、ユーザがactualy項目のいずれかをクリックしたときのあったときClickイベントが発生したContextMenuを変更したときにいるContextMenuStripにNotifyIconののContextMenuを変更する は(実際に問題を解決していません。問題の

私のソリューションを私は左クリックコンテキストメニューを表示するために使用するイベントを変更することである。その代わり、私はMouseUpイベントを使用し、マウス・ボタンがクリックされたのかを確認してクリックイベントハンドラを使用する。

NotifyIconの構築(notifyContextがSystem.Windows.Forms.ContextMenuStripです)

m_notifyIcon.MouseUp += new Forms.MouseEventHandler(m_notifyIcon_MouseUp); 
m_notifyIcon.ContextMenuStrip = notifyContext; 

Handling the left click event and show the main contextmenu: 

     void m_notifyIcon_MouseUp(object sender, Forms.MouseEventArgs e) 
     { 
      if (e.Button == Forms.MouseButtons.Left) 
      { 
       mainContext.IsOpen = ! mainContext.IsOpen; 
      } 
     } 
関連する問題