ようこそ。睡眠不足なプログラマのチラ裏です。

.ActiveSyncの同期接続状態を検知するには

PDA側でActiveSyncの同期接続状態を検知するには、Microsoft.WindowsMobile以下の名前空間のクラス群を利用する。
SystemStateクラスを用い、クレードルのステータスの変更イベントを検知するようにする。
そのイベントが発生したら、そのタイミングでActiveSyncStatusの値を見てやるとよい。


ちなみにPC側でActiveSyncの同期接続状態を検知するには、
RAPIのCeRapiInitExでハンドルを取得し、APIのWaitForSingleObjectExでタイムアウトになるまで待機する。
タイムアウトとなった場合、接続が確立されていない。タイムアウトにならなかった場合でも、
接続が確立されていない可能性があるので、RAPIのCeGetVersionEx*1CeGetSystemPowerStatusExなど、
あたりさわりのない関数をつかって、正しく情報が取得できるかで判別する。
取得できれば接続されている。取得できなければ、接続が確立されていないと判定。


以下、PDA側でActiveSyncの同期接続状態を検知する雑なサンプル

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

namespace ActiveSyncConnect
{
    public partial class Form1 : Form
    {
        #region メンバ
        private SystemState cradlePresentStatus;
        #endregion

        #region コンストラクタ
        public Form1()
        {
            InitializeComponent();

            cradlePresentStatus = new SystemState(SystemProperty.CarKitPresent);
            cradlePresentStatus.Changed += new ChangeEventHandler(CradlePresent_Changed);
        }
        #endregion

        #region イベント

        private void Form1_Load(object sender, EventArgs e)
        {
            ActiveSyncStatus status = (ActiveSyncStatus)cradlePresentStatus.CurrentValue;
            this.lblStatus.Text = GetActiveSyncConnectStatus(status);
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void CradlePresent_Changed(object sender, ChangeEventArgs e)
        {
            ActiveSyncStatus status = (ActiveSyncStatus)e.NewValue;
            this.lblStatus.Text = GetActiveSyncConnectStatus(status);
        }
        #endregion

        #region メソッド
        private string GetActiveSyncConnectStatus(ActiveSyncStatus status)
        {

            switch (status)
            {
                case ActiveSyncStatus.Error:
                    return "接続エラー";
                case ActiveSyncStatus.None:
                    return "切断状態";
                case ActiveSyncStatus.Synchronizing:
                    return "接続状態";
                default:
                    return "予期せぬエラー";
            }
        }
        #endregion
    }
}

*1:RAPIのスレッド管理は不十分らしく、CeGetVersionExはスレッドセーフではないようなので、マルチスレッドなアプリで使用するとRAPI関数内部でエラーが発生してしまう模様。なので、CeGetSystemPowerStatusExを使った方がよさげ。