
はじめに
例えばチーム内でのファイルの受渡しを、特定のファイルサーバや共有フォルダで行うようにしている場合、ファイル数の増減を把握したくなります。いつもフォルダの変更を監視しているわけではないので、実際にフォルダを開いてみないとファイルの増減は分かりません。そこで、特定のフォルダの変更を監視し、フォルダ内のファイルの増減があると、自動的に通知してくれるアプリケーションを作成してみました。
情報の通知は、今行っている作業の邪魔にならないように、Windowsのタスクバーエリアに表示させます。これには、NetAdvantage for Windows FormsのWinDesktopAlert
コントロールを使用します。アラートにはリンクを設定し、アラート表示文字をクリックするとそのフォルダを開くようにします。
対象読者
Visual Basic .NETやC#を使ってプログラムを作ったことのある人。
必要な環境
Visual Basic 2005またはVisual C#2005、Visual Studio 2005でプログラムが作れる環境。
なお、本プログラムはWindows Vista上で動作するVisual Studioを使用して作成し、Windows Vistaにて動作確認を行っています。Windows XP、Windows 2000では、フォルダの表示などで記事と多少違った動作をする可能性があります。
プログラム実行時の注意事項
アプリケーションを正常に動作させるためには、次のファイルをインストールする必要があります。
- Infragistics2.Win.Misc.v7.2.dll
WinDesktopAlertコンポーネントを含む .NET アセンブリ。
- Infragistics2.Shared.v7.2.dll
.NET 用の Infragistics Shared サポート アセンブリ
- Infragistics2.Win.v7.2.dll
.NET 用の Infragistics Windows Forms サポート アセンブリ
これらのファイルを、プログラムを実行するBinフォルダに格納します。
.NET Framework 2.0から追加されたクラスやメンバを使用しているので、.NET Framework 2.0がインストールされていることが必須条件です。
コンポーネントのインストール
初めてNetAdvantage for Windows Formsを使用する方は、プロジェクトにNetAdvantage for Windows Formsをインストールする必要があります。
インストーラは、インフラジスティックス社のWebページからダウンロードできますので、ここからダウンロードしてインストールしてください。製品ページ左側の[ダウンロード]をクリックし、[NetAdvantage for .NET 2007.2 Full [CLR 2.0]]をクリックします(お試し版のインストールには、アカウント登録が必要です)。
ファイルはZIP形式で圧縮されています。有償のコンポーネントですが、プロダクトキーを入力せずにインストールすることで、お試し版として使用できます。制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コントロールの追加
NetAdvantage for Windows Formsは、自動でVisual Studio 2005のツールボックスにタブを作成しコントロールを登録します。
スタートメニューから、[Infragistics]-[NetAdvantage for .NET 2007.2 FullCLR 2.0]-[NetAdvantage for .NETツール]-[Visual Studio ツールボックス タブの作成]を選び、タブユーティリティを実行します。このユーティリティを実行すると、Visual Studio .NETにWindowsフォームツール用の新しいツールボックス タブと、別に ASP.NET ツール用のタブが作成されます。次に、Visual Studio .NET のそれぞれのタブに NetAdvantage for .NET ツールキットにある使用可能なすべてのツールが追加されます。


WinDesktopAlertについて
WinDesktopAlertコンポーネントは、デスクトップに小さなアラートウィンドウを表示するコンポーネントです。
メッセージボックスのように画面の中央などにポップアップするのではなく、タスクバーの通知領域に表示されます(表示位置はデフォルトではデスクトップの右下ですが、プロパティによって表示位置を指定できます)。アラートは、徐々に表示されるアニメーション効果を持っており、タイトルと メッセージ、アラートボタンを表示できます。
このコンポーネントは、2つのスタイルを選ぶことができます。1つはOutlook 2007(デフォルト)スタイルで、もう1つはWindowsLiveMessengerスタイルです。また、アニメーションの速度や動作スタイルなどを設定でき、いずれもフォームデザイン時はタスクトレイで設定を行います。

メッセージテキストは、デフォルトでハイパーリンクが設定されるようになっており、クリックするとWinDesktopAlertコンポーネントにDesktopAlertLinkClicked
イベントが発生し、このイベントハンドラで処理を実行させることができます。
アラートボタンも、クリックするとAlertButtonClickedイ
ベントが発生し、このイベントハンドラで処理を実行させることができます。アラートを表示させるには、Show
メソッドを実行するだけです。
GUIの設定
GUIはとても簡単で、フォームにUltraDesktopAlert
とTimer
コントロールを配置し、フォームのWindowsState
を「Minimized」に設定するだけです。
ただし、このままでは動作チェックなどがしにくくなりますので、機能を実装するまではフォームにボタンとラベルを配置し、動作を確認しながら開発するようにします。
なお、UltraDesktopAlert
コントロールはユーザーとの対話機能は持たす、プロセスだけを提供するコントロールなので、フォームの外に配置されます。

UltraDesktopAlert
コントロールにアラートボタンを組み込むには、プロパティウィンドウでAlertButtons
プロパティをクリックし、コレクションエディタでボタンを追加します。
ボタンにイメージを組み込むには、エディタのImage
プロパティをクリックし、イメージファイルを設定します。
コードの作成
今回作成したプログラムは、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]をダブルクリックします。
![プロパティウィンドウの[DesktopAlertLinkClicked]をダブルクリック プロパティウィンドウの[DesktopAlertLinkClicked]をダブルクリック](http://cz-cdn.shoeisha.jp/static/images/article/2625/Image8.gif)
また、アラートボタンがクリックされると、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; }
まとめ
デスクトップアラートは、 メッセージボックスと違いデスクトップ下部に表示されるので、作業中でも邪魔することなくメッセージを表示させることができます。リンクやアラートボタンを使うことで、デスクトップアラートから次の処理を実行させることもできます。
使い方もとても簡単ですから、ユーザーに情報を通知するアイテムとしていろいろな使い方ができるのではないでしょうか。