コードの作成
今回作成したプログラムは、Cドライブのルートにあるフォルダ「data」の変更の有無を、Timerコントロールと組み合わせて一定時間間隔でチェックし、変更があればデスクトップアラートで表示するものです。
フォルダには、作成日時以外に最終更新日時が設定されています。この日時は、フォルダ内のファイルが削除されたり追加されたりすると更新されます。そこで、この最終更新日時をチェックし、更新されていればデスクトップアラートを表示するようにします。
最終更新日時を取得するには、System.IO名前空間にあるFileInfo
クラスのLastWriteTime
プロパティを参照します。
デスクトップアラートでは、フォルダ内のファイルに変更があったというメッセージを表示し、この文字列をクリックすると「data」フォルダが開くようにします。
フォルダを開く処理は、System.Diagnostics名前空間にあるProcess
クラスのStart
メソッドを使用します。
プログラムのスタートアップ処理
フォルダが更新されているかどうかのチェックは、まずプログラム起動時にフォルダの最終更新日時を取得しておき、一定時間後にもう一度フォルダの最終更新日時を取得して、この値を比較します。最終更新日時が変わっていなければフォルダは更新されていませんので何もしません。最終更新日時が変わっていれば、フォルダは更新されていますので、デスクトップアラートを表示します。
そこで、まずフォームのLoadイベントハンドラで、FileInfo
クラスのLastWriteTime
プロパティからフォルダの最終更新日時を取得し変数basetime
に格納しておきます。
Imports System.IO Public Class Form1 Dim fname As String = "c:\data" Dim basetime As DateTime, nowtime As DateTime Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim fi As FileInfo = New FileInfo(fname) basetime = fi.LastWriteTime End Sub
using System.IO; namespace WinDesktopAlert_cs { public partial class Form1 : Form { String fname = "c:/data"; DateTime basetime , nowtime; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { FileInfo fi = new FileInfo(fname); basetime = fi.LastWriteTime; }
フォルダ内のファイルが変更された時の処理
次に、再度フォルダの最終更新日時を取得し、変数basetime
の値と比較します。プログラム完成品は、この処理をTimer
コントロールのTick
イベントハンドラに記述しますが、動作確認のためにボタンのクリックイベントハンドラにも記述しておきます。
もし、この2つの最終更新日時に差があれば、フォルダの最終更新日時が変更されたことになるので、デスクトップアラートを表示するために、UltraDesktopAlert
コントロールのShow
メソッドを実行します。Show
メソッドはオーバーロードで3つのメソッドがありますが、今回は2つの引数を持つメソッドを使用しました。最初の引数がタイトル文字列で、2番目の引数はメッセージ文字列を指定します。
アラートを表示したら、変数basetime
とnowtime
を同じ値にして、アラートの表示が出ないようにし、次の変更に備えます。また、ラベルには動作確認のため、2つの最終更新日時を表示しておきます。
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim fi As FileInfo = New FileInfo(fname) nowtime = fi.LastWriteTime If nowtime > basetime Then Me.UltraDesktopAlert1.Show( _ "アラートの表示", "フォルダ " & fname & _ "内のファイル数に変更が生じました : " & _ nowtime.ToString) End If basetime = nowtime Label1.Text = basetime Label2.Text = nowtime End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Timer1.Tick Dim fi As IO.FileInfo = New IO.FileInfo(fname) nowtime = fi.LastWriteTime If nowtime > basetime Then Me.UltraDesktopAlert1.Show( _ "アラートの表示", "フォルダ " & fname & _ "内のファイル数に変更が生じました : " & _ nowtime.ToString) End If basetime = nowtime End Sub
private void button1_Click(object sender, EventArgs e) { FileInfo fi = new FileInfo(fname); nowtime = fi.LastWriteTime; if(nowtime > basetime){ ultraDesktopAlert1.Show( "アラートの表示", "フォルダ " + fname + "内のファイル数に変更が生じました : " + nowtime); } basetime = nowtime; label1.Text = "" + basetime; label2.Text = "" + nowtime; } private void timer1_Tick(object sender, EventArgs e) { FileInfo fi = new FileInfo(fname); nowtime = fi.LastWriteTime; if (nowtime > basetime) { ultraDesktopAlert1.Show( "アラートの表示", "フォルダ " + fname + "内のファイル数に変更が生じました : " + nowtime); } basetime = nowtime; }
リンク文字列とアラートボタンがクリックされた時の処理
デスクトップアラートが表示されると、 メッセージの文字列にリンクが自動的に設定されます。デフォルトでは、クリックするとアラートを呼び出したアプリケーションにフォーカスが移動するだけですが、処理を実行させることもできます。
リンク文字列をクリックすると、UltraDesktopAlert
コントロールにはDesktopAlertLinkClicked
というイベントが発生しますので、このイベントハンドラに処理を作成します。
このイベントハンドラをコードに組み込むには、プロパティウィンドウの[イベント]ボタンをクリックしてイベントリストを表示し、[DesktopAlertLinkClicked]をダブルクリックします。
また、アラートボタンがクリックされると、UltraDesktopAlert
コントロールにはAlertButtonClicked
というイベントが発生しますので、このイベントハンドラに処理を作成します。イベントハンドラの作成方法は、DesktopAlertLinkClicked
イベントと同じです。
ここでは、監視しているフォルダを開く処理を組み込みます。これは、System.Diagnostics名前空間にある、Process
クラスのStart
メソッドを使用します。このメソッドを使うと、他のアプリケーションを起動することができます。Windows Vistaでは、フォルダの表示もインターネットエクスプローラを使っているので、これを起動します。最初の引数にアプリケーション名を、2番目の引数に表示させたいフォルダ名をフルパスで記述します。
Private Sub UltraDesktopAlert1_DesktopAlertLinkClicked( _ ByVal sender As System.Object, _ ByVal e As Infragistics.Win.Misc.DesktopAlertLinkClickedEventArgs) _ Handles UltraDesktopAlert1.DesktopAlertLinkClicked System.Diagnostics.Process.Start("IExplore.exe", fname) basetime = nowtime End Sub Private Sub UltraDesktopAlert1_AlertButtonClicked( _ ByVal sender As System.Object, _ ByVal e As Infragistics.Win.Misc.AlertButtonClickedEventArgs) _ Handles UltraDesktopAlert1.AlertButtonClicked System.Diagnostics.Process.Start("IExplore.exe", fname) basetime = nowtime End Sub
private void ultraDesktopAlert1_DesktopAlertLinkClicked( object sender, Infragistics.Win.Misc.DesktopAlertLinkClickedEventArgs e) { System.Diagnostics.Process.Start("IExplore.exe", fname); basetime = nowtime; } private void ultraDesktopAlert1_AlertButtonClicked(object sender, Infragistics.Win.Misc.AlertButtonClickedEventArgs e) { System.Diagnostics.Process.Start("IExplore.exe", fname); basetime = nowtime; }
まとめ
デスクトップアラートは、 メッセージボックスと違いデスクトップ下部に表示されるので、作業中でも邪魔することなくメッセージを表示させることができます。リンクやアラートボタンを使うことで、デスクトップアラートから次の処理を実行させることもできます。
使い方もとても簡単ですから、ユーザーに情報を通知するアイテムとしていろいろな使い方ができるのではないでしょうか。