C# Programming

Image

簡単なモバイルアプリケーション開発3
電源モニター

開発環境: Visual Studio 2005 

1.目次

1.目次
2.目的
3.参考書
4.作り方
5.ダウンロード
6.ソースコード
7.さいごに

2.目的

Microsoft.WindowsMobile.Status名前空間に多くの状態取得のクラスが用意されており、これを利用することにより、たとえば電源の状態を知ることができ、またバッテリーの状態が外部電源から、バッテリーに切り替わったことを簡単に知ることができます。ここでは、バッテリーの状態を例にとり、どのように利用するのか説明したいと思います。

Image

3.参考書

  1. C#研究室.Live Space / W-ZERO3
  2. MSDN .NET Compact Framework 向けの表示方向切り替え対応および高dpi対応アプリケーションの開発
  3. MSDN Windows Mobile 5.0 の開発者向け新機能
  4. MSDN Microsoft.Windows.Moble.SystemState Properties

4.作り方

 

4.1 Microsoft.WindowsMobile.Status 名前空間

Microsoft.WindowsMobile.Status Namespace の中には、Windows Mobile関連の名前空間が多数含まれています。参考文献(4)のSystemState プロパティを見てください。うんざりするほど出てきます。大きく分けると、アプリケーション関連、ActiveSync、カレンダー、モデムや無線などの接続状況、デバイス(カメラ、クレドール、ヘッドセット、キーボード)の有無、現在の日時、縦横状態、メディアプレーヤー関連情報、メール関連情報、オーナー情報、電話関連、電源バッテリー関連、タスク関連があります。どんなことができそうなのか、一度のぞいておくと良いかもしれません。

まずは、電源とバッテリー関連に絞っていくと、次のようになります。

BatteryLevel 現在のバッテリーレベルの取得や、レベルが変化になった時の通知が可能。

バッテリーレベル

状態 バッテリーレベル
VeryHigh 81-100%
High 61-80%
Low 21-40%
Medium 41-60%
VeryLow 0-20%

注意: W-Zero3 の電源アイコンの3段階の表示とは異なっています。実際どのぐらい正確なのかはわかりません。

BatteryState 現在のバッテリー状態の取得や、状態が変化になった時の通知が可能。

バッテリーの状態

状態 説明
Charging 充電中
Critical クリティカル
Low ロー
Normal バッテリーで動作中
NotPresent 存在しない

ただし、W-Zero3の場合、バッテリーパックなしで外部電源だけだと動作しないようなので、充電中とバッテリーで動作中しか検証していません。

4.2 基本動作

基本的な動作は次のようになります。

  1. バッテリーレベルを知るだけであれば、次のように SystemState.PowerBatteryState プロパティにアクセスするだけでOKです。

    SystemState.PowerBatteryStrength;

    System.Stateでインテリセンスをきかせてみると、次のようにすごく多くのプロパティが提供されていることがわかると思います。これらに、プロパティだけでアクセスできますので、とても楽です。

    Image
     

  2. SystemStateの Changed イベント
    SystemStateには Changed イベントがあり、SystemStateが変化したときに通知してくれるという便利な機能があります。

    使い方としては、SystemStateコンストラクタに、SystemProperty でPowerBatteryStrengthを渡してあげることにより、BatteryStrengthインスタンス作ります。

    SystemState batteryStrength = new SystemState(SystemProperty.PowerBatteryStrength);

    次に、このBatteryStrengthインスタンスのChangedイベントを追加してあげると、バッテリーレベルが変化した場合にイベントハンドラーを呼び出してくれますので、タイマーでSystemState.PowerBatteryState プロパティを定期的に監視している必要はありません。

    batteryStrength.Changed += new ChangeEventHandler(batteryStrength_Changed);

    このイベントハンドラーで、バッテリーの表示を実装してあげれば、バッテリーの状態変化に対してリアルタイムで表示を変更することができます。

    private void BatteryLevelChanged(BatteryLevel batteryLevel)
    {
       
    switch (batteryLevel)
        {
           
    case BatteryLevel.VeryHigh:
                ...
                break;
           
    case BatteryLevel.High:
                ...
                break;
           
    case BatteryLevel.Medium:
                ...
                break;
           
    case BatteryLevel.Low:
                ...
                break;
           
    case BatteryLevel.VeryLow:
                ...
                break;
        }
    }

4.3 プロジェクトの作成

  1. プロジェクトの新規作成
    VS2005のメニューからプロジェクトの新規作成で、プロジェクトの種類で [スマートデバイス] → [デバイスアプリケーション] を選択します。
     
  2. ターゲットデバイスの設定
    エミュレータでも可能ですが、エミュレータではレスポンスが悪く、かったるいです。そこで、Windows Mobile 5.0 Pocket PC Deviceを指定して、実機上で開発します。
     
  3. Formの [FormFactor]プロパティ
    [Windows Mobile 5.0 Pocket PC VGA] を指定します。
     
  4. 参照の追加
    Microsoft.WindowsMobileとMicrosoft.WindowsMobile.Statusが必要です。参照の追加より、この2つを追加します。

    Image
     

4.4 バッテリーレベルの実装

  1. 画像パーツの作成
    簡単なモバイルアプリケーション開発2で説明したように、適当に画像パーツを作ります。あとは、あなたのデザインセンスと、アイデア次第ですw。
     
  2. ImageListの追加
    簡単なモバイルアプリケーション開発2で説明したように、ImageListをToolBoxより追加します。ここに、バッテリーのレベルに応じて表示する画像を追加します。ここでは、次のようにPPTで作成したものから、スクリーンキャプチャを取り、そこからさら1つ1つ切りだしました。
    Image
     
  3. 背景の設定
    Form1の背景を黒にします。
     
  4. PictureBoxの貼り付け
    PictureBox を4つ貼り付けます。pictureBoxの名前は、pictureBoxStateLabel, pictureBoxLevelLabel, pictureBoxBatteryState, pictureBoxBatteryLevel などと適当に付けます。

    Image
     
  5. BatteryStrengthのインスタンスの追加。
    次の行を追加し、バッテリーレベルのインスタンスを追加します。

    SystemState batteryStrength = new SystemState(SystemProperty.PowerBatteryStrength);
     
  6. FormのLoadイベントの処理を追加
    Form の Loadイベントで、フォームがロードしたときに画面の初期状態を表示する必要があります。そのために、BatteryStateChangedとBatteryLevelChangedを呼び出してあげます。

    private
    void Form1_Load(object sender, EventArgs e)
    {
        DrawBatteryLevel();
    }
     
  7. BatteryLevelChangedの実装
    バッテリーレベルを描画します。このとき、Activate()を呼び出して、画面をアクティベートするようにしてあげると、バッテリーの状態が変わった時にウィンドウを最前面に表示することができます。

    private void DrawBatteryLevel()
    {
        Activate();

        if
    (pictureBoxBatteryLevel.Image != null)
            pictureBoxBatteryLevel.Image.Dispose();

        switch (SystemState.PowerBatteryStrength)
        {
           
    case BatteryLevel.VeryHigh:
                pictureBoxLevelLabel.Image = imageListLevel.Images[0];
               
    break;
           
    case BatteryLevel.High:
                pictureBoxLevelLabel.Image = imageListLevel.Images[1];
               
    break;
            ....
        }
    }
     

  8. Changedイベントの追加
    FormのLoadイベントハンドらに、バッテリーレベルが変化した場合の Changed イベントハンドラーを追加します。これで、バッテリーレベルが変化した場合に、DrawBatteryLevel()が呼び出され、状態を再描画してくれます。

    private void Form1_Load(object sender, EventArgs e)
    {
        DrawBatteryLevel();

        batteryStrength.Changed += new ChangeEventHandler(batteryStrength_Changed);
    }

    void
    batteryStrength_Changed(object sender, ChangeEventArgs args)
    {
        DrawBatteryLevel();
    }

     

  9. 動作の確認
    ここまでで、実行してみてください。無事動いたでしょうか?
     
  10. バッテリー状態の実装
    あとは、同様に、バッテリー状態の実装を行います。実装はバッテリーレベルとほとんど変わりません。

4.5 残りの作業

次に、お決まりの次の作業を行えば、完成です。詳細は、参考文献(2)、(3)を参照してください。

  1. 縦型、横型レイアウトの調整
  2. メインメニューの実装
  3. アイコンの追加
  4. バージョン情報の表示
  5. インストーラの追加

4.6 動作の確認

  1. ACアダプターを接続して、充電状態にします。
  2. 次のこのアプリケーションを動かします。
  3. 状態が正しく CHARGING、Very High となっていることを確認します。
  4. 次に、他の ie などのアプリケーションを起動します。
  5. ACアダプターをはずします。
  6. 数秒すると、Power Monitor の画面が表示され、"Normal"、"Very High"というように表示されることを確認します。

バッテリーレベルは、その時の状態に応じて変わります。

5. ダウンロード

Version 1.0.0.0  2007/4/1 WZero3PowerMonitor.cab

6. ソースコード

主なソースコードです。

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsMobile.Status;

namespace Uchukamen.WZero3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void menuItemTerminate_Click
            (object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void menuItemAbout_Click
          (object sender, EventArgs e)
        {
            FormAbout formAbout = new FormAbout();
            formAbout.ShowDialog();
        }

        SystemState batteryState 
           = new SystemState(SystemProperty.PowerBatteryState);
        SystemState batteryStrength 
           = new SystemState(SystemProperty.PowerBatteryStrength);

        private void Form1_Load(object sender, EventArgs e)
        {
            DrawBatteryState();
            DrawBatteryLevel();

            batteryState.Changed 
               += new ChangeEventHandler(batteryState_Changed);
            batteryStrength.Changed 
               += new ChangeEventHandler(batteryStrength_Changed);
        }

        void batteryState_Changed
            (object sender, ChangeEventArgs args)
        {
            DrawBatteryState();
        }

        void batteryStrength_Changed
               (object sender, ChangeEventArgs args)
        {
            DrawBatteryLevel();
        }

        private void DrawBatteryState()
        {
            Activate();

            if (pictureBoxBatteryState.Image != null)
                pictureBoxBatteryState.Image.Dispose();

            switch (SystemState.PowerBatteryState)
            {
                case BatteryState.Charging:
                    pictureBoxBatteryState.Image 
                      = imageListState.Images[0];
                    break;
                case BatteryState.Critical:
                    pictureBoxBatteryState.Image 
                     = imageListState.Images[1];
                    break;
                case BatteryState.Low:
                    pictureBoxBatteryState.Image 
                     = imageListState.Images[2];
                    break;
                case BatteryState.Normal:
                    pictureBoxBatteryState.Image 
                     = imageListState.Images[3];
                    break;
                case BatteryState.NotPresent:
                    pictureBoxBatteryState.Image 
                     = imageListState.Images[4];
                    break;
            }
        }

        private void DrawBatteryLevel()
        {
            Activate();

            if (pictureBoxBatteryLevel.Image != null)
                pictureBoxBatteryLevel.Image.Dispose();

            switch (SystemState.PowerBatteryStrength)
            {
                case BatteryLevel.VeryHigh:
                    pictureBoxBatteryLevel.Image 
                     = imageListLevel.Images[0];
                    break;
                case BatteryLevel.High:
                    pictureBoxBatteryLevel.Image 
                     = imageListLevel.Images[1];
                    break;
                case BatteryLevel.Medium:
                    pictureBoxBatteryLevel.Image 
                     = imageListLevel.Images[2];
                    break;
                case BatteryLevel.Low:
                    pictureBoxBatteryLevel.Image 
                     = imageListLevel.Images[3];
                    break;
                case BatteryLevel.VeryLow:
                    pictureBoxBatteryLevel.Image 
                      = imageListLevel.Images[4];
                    break;
            }
        }
    }
}

 

7. さいごに

簡単なモバイルアプリケーション開発2、簡単なモバイルアプリケーション開発3とみてきましたが、この延長上に少し手を加えれば、W-Zero3の電源状態を監視して、バッテリーに切り替わってからの時間をカウントダウンすることにより、次のような表示もとても簡単にできます。ただし、CPUやメモリの制約が強く、あまり凝ったことをすると、メモリやCPUを食いつぶしてしまいますので、見た目と機能のバランスや、性能を考えた設計が必要になります。

Image Image 
※版権の関係で公開できません。