Windows Mobile で通話ログをインターセプトするためのイベント ハンドラーがあります。この問題は、Windows モバイルではなく、C# のイベント ハンドラーに固有のものです。初めてイベント ハンドラーをアタッチおよびデタッチできます。問題は次のとおりです。イベント ハンドラーを少なくとも 1 回切り離した後、イベント ハンドラーをアタッチできません。デタッチされて再度アタッチされた後、イベント ハンドラーが呼び出されないのはなぜですか?
以下は私のコードです:
private static SystemState stateIncoming = null;
private static SystemState stateOutgoing = null;
private static SystemState stateTalking = null;
public static void StartCallLogInterception()
{
if (stateIncoming == null && stateOutgoing == null && stateTalking == null)
{
stateIncoming = new SystemState(SystemProperty.PhoneIncomingCall);
stateIncoming.Changed += new ChangeEventHandler(stateIncoming_Changed);
stateOutgoing = new SystemState(SystemProperty.PhoneCallCalling);
stateOutgoing.Changed += new ChangeEventHandler(stateOutgoing_Changed);
stateTalking = new SystemState(SystemProperty.PhoneCallTalking);
stateTalking.Changed += new ChangeEventHandler(stateTalking_Changed);
}
}
public static void EndCallLogInterception()
{
if (stateIncoming != null && stateOutgoing != null && stateTalking != null)
{
stateIncoming.Changed -= new ChangeEventHandler(stateIncoming_Changed);
stateIncoming = null;
stateOutgoing.Changed -= new ChangeEventHandler(stateOutgoing_Changed);
stateOutgoing = null;
stateTalking.Changed -= new ChangeEventHandler(stateTalking_Changed);
stateTalking = null;
}
}
編集: クラス レベル変数を含めるようにコードを更新しました。また、以下の回答は互いに矛盾しています。オブジェクトを破棄する場合、イベント ハンドラーをアタッチする必要があるときにオブジェクトを再作成する必要があります。これは理にかなっていますか?
編集 2: 問題は、オブジェクトやイベント処理コードにはありません。OpenNETCF の LargeIntervalTimer を使用しています。LargeIntervalTimer を使用してタイマーを実行していると、イベント ハンドラーが正しくアタッチされません。LargeIntervalTimer がなければ、すべて正常に動作します。