これまで掲示板をいくつか作ってきました。
これらが更新されたらそれを知るためにはどうすればよいでしょうか? 誰かが書き込んだらメールで通知されるようにしているのですが、メールがきてもそれに気がつかなければそれまでです。そこでパソコンを起動している場合は内容が変更されたらすぐに気づくことができるようにする方法を考えます。
方法は簡単で定期的に内容を確認して変更されていたらメッセージボックスが表示されるようにするだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public partial class Form1 : Form { System.Net.Http.HttpClient _client = new System.Net.Http.HttpClient(); Timer _timer = new Timer(); string _oldString = ""; string _url = "監視したいページのurl"; public Form1() { InitializeComponent(); _timer.Interval = 60 * 1000; _timer.Tick += Timer_Tick; label1.Font = _fontOnNotUpdated; label1.Text = "停止中"; } } |
定期的にShowResultメソッドを呼び出して結果を表示させます。これは定期的にページにアクセスして、前回の調査で得られた文字列と比較し、変更があれば更新されている旨を表示します。引数つきのShowResultは後述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public partial class Form1 : Form { private void Timer_Tick(object sender, EventArgs e) { ShowResult(); } void ShowResult() { Task.Run(async () => { try { string str = await _client.GetStringAsync(_url); if (_oldString == "") { _oldString = str; ShowResult(false); } else if (_oldString != str) { _oldString = str; ShowResult(true); } else ShowResult(false); } catch { label1.Text = "データを取得できませんでした"; } }); } } |
ShowResultメソッドは引数がtrueなら現在時刻とともに更新された旨を表示します。このときフォームが最前面になっているとは限らないので最前面に表示させています。またフォームが最小化されていることも想定されるので、WindowStateプロパティを FormWindowState.Normalに設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public partial class Form1 : Form { Font _fontOnUpdated = new Font("MS UI Gothic", 18); Font _fontOnNotUpdated = new Font("MS UI Gothic", 12); void ShowResult(bool isUpddated) { if (isUpddated) { this.WindowState = FormWindowState.Normal; this.TopMost = true; label1.Font = _fontOnUpdated; label1.Text = $"更新確認:{DateTime.Now.ToLongTimeString()}"; } else { this.TopMost = false; label1.Font = _fontOnNotUpdated; label1.Text = $"最終確認:{DateTime.Now.ToLongTimeString()}"; } } } |
監視を開始するときと終了するときの処理を示します。
監視を開始するのであればタイマーをStartさせ、終了するときはタイマーをStopします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public partial class Form1 : Form { private void buttonStart_Click(object sender, EventArgs e) { _timer.Start(); ShowResult(); } private void buttonStop_Click(object sender, EventArgs e) { _timer.Stop(); label1.Font = _fontOnNotUpdated; label1.Text = "停止中"; } private void buttonOK_Click(object sender, EventArgs e) { ShowResult(false); } } |