2

C# の既定の Windows フォーム アプリケーションから始めて、変更したのは Progam.cs だけでした。メイン関数から、変更しました

Application.Run(new Form1());

Application.Run(new MyCustomApplicationContext());

これは、プログラムを Windows フォームではなくシステム トレイ アイコンとして実行するカスタム クラス (MyCustomApplicationContext:ApplicationContext) を指します。コンストラクターには次のコードが含まれます。

private NotifyIcon trayIcon = new NotifyIcon();
trayIcon.ContextMenu = new ContextMenu(
    new MenuItem[] 
    {
        new MenuItem("Exit", Exit)
    });

これにより、ユーザーはアイコンを右クリックして、プログラムを閉じる機能を実行する「終了」オプションを含むコンテキスト メニューを表示できます。

MyCustomApplicationContext のコンストラクターの最後で、Update() というクラスの再帰関数を呼び出します。この関数は ping 関数を実行し、ping の遅延に応じてシステム トレイ アイコンを変更します。

残念ながら、再帰的であるため、他のコードを実行することは許可されていないため、右クリックのコンテキスト メニューは表示されません。System.Timers.Timer Elapsed イベントのように、イベントを通じて Update() 関数を呼び出したいと思います。イベントがどのように機能するか、またはコードをどこに配置するかがわかりません。

4

2 に答える 2

5

dmay が述べたように、Timer クラスを使用して更新関数を呼び出すことができます。ただし、説明を読むと、ここでもスレッドを考慮する必要があるようです。

...
aTimer = new System.Timers.Timer(10000);

// Hook up the Elapsed event for the timer.
aTimer.Elapsed += UpdateTimer;
aTimer.Interval = 2000;
aTimer.Enabled = true;
...

public delegate void delUpdate();  // This is your delegate. Put it in your MyCustomApplicationContext class.

// This method will invoke your delegate method.
public void UpdateTimer(object sender, ElapsedEventArgs e)
{
    this.Invoke((delUpdate)Update);
}

Invoke メソッドを使用する理由は、タイマーが別のスレッドから実行されるためです。ユーザー インターフェイスを更新するメソッドを呼び出す場合は、コントロールを呼び出す必要があります。そうしないと、タイマーが起動しているスレッドに属していないオブジェクトにアクセスしようとして、例外が生成されます。

于 2013-07-30T01:45:35.287 に答える
3

そうです、再帰呼び出しはアプリのメイン スレッドをブロックし、GUI での対話を停止します。フォーム Windows を使用したアプリケーションがある場合、「(応答なし)」とマークされます。

Timerクラスを使用できます

http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx

        var timer = new Timer(tick_milliseconds);
        timer.Elapsed += DoOnTimerClick;
        timer.Enabled = true;
于 2013-07-30T01:33:59.953 に答える