2016-08-24 44 views
1
class MainProgram 
{ 
    static NotifyIcon _notifyIcon; 

    public static void Main() 
    { 
     _notifyIcon = new NotifyIcon(); 
     _notifyIcon.Icon = new Icon("icon.ico"); 
     _notifyIcon.Click += NotifyIconInteracted; 
     _notifyIcon.Visible = true; 

     while(true) 
     { 
      Thread.Sleep(1000); 
     } 
    } 

    static void NotifyIconInteracted(object sender, EventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
} 

上記は最小の例です。何らかの理由で、NotifyIconInteractedメソッドが呼び出されることはありません。通知アイコンが表示され、複数回左/右クリックしてもイベントは起動しません。NotifyIconクリックイベントが発生しない

+0

(true)は消えなければなりません。 – LarsTech

+0

これはコンソールアプリケーションですか? –

+0

@EdPlunkettはいコンソールアプリケーション – Steve

答えて

1

でしばらく(真の)ブロックを交換してみ?タイマーを使用してもwhile()ループのようなプログラムはロックされません。

using System; 
using System.Timers; 
using System.Windows.Forms; 

namespace SONotify 
{ 
    class Program 
    { 
     private static System.Timers.Timer _timer; 
     private static NotifyIcon _notify; 

     static void Main(string[] args) 
     { 
      Console.WriteLine("Press enter to exit"); 
      SetIcon(); 
      SetTimer(); 

      Application.Run(); 

      Console.ReadLine(); 

      _timer.Stop(); 
      _timer.Dispose(); 
     } 

     private static void SetIcon() 
     { 
      _notify = new NotifyIcon(); 
      _notify.Icon = new System.Drawing.Icon("icon.ico"); 
      _notify.Click += NotifyIconInteracted; 
      _notify.Visible = true; 
     } 

     private static void SetTimer() 
     { 
      _timer = new System.Timers.Timer(2000); //Timer goes off every 2 seconds 
      _timer.Elapsed += Timer_Elapsed; 
      _timer.AutoReset = true; 
      _timer.Enabled = true; 
     } 

     private static void Timer_Elapsed(object sender, ElapsedEventArgs e) 
     { 
      Console.WriteLine("Timer fired"); 
     } 

     private static void NotifyIconInteracted(object sender, EventArgs e) 
     { 
      Console.WriteLine("Icon clicked"); 
     } 
    } 
} 
+0

これは投稿として素晴らしい作品。しかし、最初にfalseに設定してTimer_Elapsed内でtrueに設定すると、再び壊れました。 – Steve

+0

trueに設定すると、すぐにfalseに設定して問題を解決しました。しかし、それを取り除く方法があるなら、いいかもしれません。 – Steve

0

while(true)はメインスレッドをロックします。

あなただけの定期的なチェックをやっている場合は代わりにwhileループのタイマーを使用しないのはなぜ
Application.Run(); 
+0

これを行うと動作します。しかし主な考え方は、私は定期的に仕事をしていて、何か起きたときにいつもメッセージをポップするということです。だから、whileループは留まる必要があります。私は別のスレッドでwhileループを実行しようとし、Thread.Start()の後にApplication.Run()を呼び出しました。まだ動作しません – Steve

関連する問題