.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を使った方がよさげ。