次の方法で共有


Coding4Fun - システム トレイのアラーム時計を作成する

システム トレイのアラーム時計を作成する

Arian Kulp

初期バージョンの Windows の頃からずっと、私にはアラーム時計が用意されていないのがいつも不思議でした。Outlook を使う場合はアラームがその役目を果たしますが、予定表のイベントを常に登録しておくわけにもいきません。システムのタスク スケジューラを使うこともできますが、単純なアラームには大げさすぎて、そのような目的での使用は困難です。理想的にはシステム時計にアラーム設定用のタブがあればよいのですが、ご存知のように、そのようなタブはありません。

このコラムでは、Visual Studio 2005 を使用して、システム トレイに隠れ、通知を表示し、オプションで音を鳴らす単純なアラーム時計を作成する方法を見ていくことにしました。アラームは時間が過ぎると翌日の同じ時刻に設定され、アラームを有効または無効にするためのチェック ボックスも用意しておく必要があります。ユーザー インターフェイスは、コントロールの数をできる限り減らしてわかりやすくしておく必要があります。ユーザー インターフェイス設計に関しては "少ないほうが機能的" であるというのが私の考えです。

アラーム時計の作成では、Visual Studio 2005 の新機能および改良された機能の両方を使うことができました。コード サンプルのハイライト部分は Visual Basic 2005 Express Edition を使用していますが、どの Visual Studio Express Edition を使用しても同様のサンプルを作成できます。各 Express Edition の Beta 2 は https://www.microsoft.com/japan/msdn/vstudio/2005/express/ でダウンロードできます。

設計の点では、システム トレイにアイコンを表示する必要がありました (システム時計の横のアイコンの列)。アラームは、メッセージ ボックスではなく、システム通知として表示します。システム通知は、フォーカスの移動や迅速な応答を要求せずにユーザーへの通知を可能にする Windows XP の優れた機能です。.NET 2.0 では通知をスナップにします。また、アラームの起動時に音を鳴らすことも考えました。この処理は Visual Basic では些細な作業で、C# では数行のコードが必要なだけです。これらを含むプロジェクトは順調に進行し、想像していたものを正確に実装できました。

まず、Visual Studio で Windows フォーム プロジェクトを作成します。これにより、1 つのブランク フォームを含む、ほとんど空のプロジェクトが作成されます。このフォームは設定ダイアログになるので、まずソリューション エクスプローラでフォームをハイライトし、F2 キーを押します。これによりファイル名が編集可能になります。"AlarmSettingsForm" などの単純な名前を付けます。サウンド ファイル名およびアラーム メッセージ用に、2 つのテキストボックス コントロールをドラッグします。アラームを有効または無効にするチェック ボックス、実際の時間を入力する DateTimePicker、[OK]、[Cancel]、ファイル参照用の各ボタン、および該当するラベルをドラッグします。

UI レイアウトが完成したら、システム トレイ アイコンを追加します。Win32 呼び出しは不要で、すべての機能は完全にマネージ コードで対応可能です。ツールボックスから、NotifyIcon コントロールをデザイン サーフェイスにドラッグします。このコントロールは本質的に非ビジュアル コントロールであるため、実際はフォームの下のサーフェイスに配置されます。通知の起動時に表示されるメッセージの 3 つの BalloonTip プロパティを設定します。

実行時に通知アイコンが常に視覚的に表示されるようにするため、アイコン ファイルを作成する必要があります。ソリューション エクスプローラから、[アイコン ファイル] タイプの新規アイテムを追加します。お好きなものを追加してください。おわかりのとおり、私自身はアーティストに程遠いのですが、これが何かの役に立つこともあるかと思います (念のためベルであることを申し上げます)。

ハリッハするよ拡大画像が表示され?す

(画像をクリックすると拡大表示されます。)

アイコン ファイルを NotifyIcon コントロールと関連付ける必要があります。また、コンテキスト メニューの作成も必要です。これは、トレイのアイコンを右クリックしたときに表示されるメニューです。システム時計を右クリックすると、[日付と時刻の調整]、[通知のカスタマイズ] などのツール バーのメニューが表示されます。同様のメニューを作成するには、ツールボックスから ContextMenuStrip をドラッグし、選択して編集を開始します。Settings、Enabled、および Exit のオプションを追加します。

アプリケーションでアラームを鳴らすには、指定した時間が経過するタイミングを把握する必要があります。指定の時間に直接通知を受け取ることはできませんが、多くのオーバーヘッドを抑えて自身でタイミングを判断できます。Timer コントロールをデザイン サーフェイスにドラッグし、間隔を 1000 に設定します。タイマ間隔はミリ秒単位で測定されるため、有効にすると、コントロールは毎秒起動します。Timer コントロールの Tick イベント ハンドラで、次のコードを追加します。

  
    if( DateTime.Now.CompareTo(alarmTime) >= 0 )
{
// 日にちを追加してアラームを翌日にリセットします。
    RolloverTime();
// 通知を 1 分以内で表示します。
// 通知終了後は元の状態に戻ります。
    AlarmNotifyIcon.BalloonTipText = 
        (alarmMessage.Length > 0?alarmMessage:"Attention!");
    AlarmNotifyIcon.ShowBalloonTip(60000);
// アラーム音を鳴らします。
    if( alarmSound.Length > 0 )
    {
        player.PlayLooping();
    }
}

最初に RolloverTime メソッドを呼び出しています。このメソッドはまだ定義していませんが、実世界のアラーム時計をシミュレートするには非常に重要です。アラームを午後 3 時に設定すると、内部で DateTime オブジェクトが特定の日の午後 3 時を反映します。いったんアラーム時間が経過すると、翌日の午後 3 時に変更する必要があります。AddDays メソッドを呼び出すよりも、コンストラクタを使用して DateTime の新しいインスタンスを作成するほうが、新しい時間を選択したときに現在の日付部分について余計な処理を行わずに済みます。次のコードでそれらの処理を行います。

  
    private void RolloverTime()
{
// ユーザーが既に過ぎた時間を選択した場合は、翌日に設定する必要があります。
    if( DateTime.Now.TimeOfDay.CompareTo(alarmTime.TimeOfDay) > 0 )
    {
        alarmTime = new DateTime(DateTime.Now.Year, 
            DateTime.Now.Month, DateTime.Now.Day + 1, 
            alarmTime.Hour, alarmTime.Minute, alarmTime.Second);
    }
// それ以外の場合は、今日に設定します。
    else
    {
        alarmTime = new DateTime(DateTime.Now.Year, 
            DateTime.Now.Month, DateTime.Now.Day, 
            alarmTime.Hour, alarmTime.Minute, alarmTime.Second);
    }
}

結論

Visual Studio 2005 では、通知、タイマ、トレイ アイコン、およびサウンドを簡単に操作できます。次のステップとして "再通知" 機能を追加することもできます。通知の閉じるボタン以外の場所をクリックすることにより、アラームを数分遅らせることも可能です。アラームが有効または無効な状態や、アラームが鳴っている状態に合わせて、トレイ アイコンを変えるのもよいでしょう。まだ手元になければ Visual C# 2005 Express Edition をダウンロードして、試してみてください。まずは、https://www.microsoft.com/japan/msdn/vstudio/2005/express/ から開始しましょう。

Arian Kulp は中西部在住のフリーのソフトウェア開発者です。彼は小学校 5 年生のとき以来、次々に異なるプラットフォームでコーディングを行ってきました。最近では .NET Framework に熱中しています。彼の Web サイトは、http://www.ariankulp.com/ (英語) からご覧になれます。