1

アプリ (PocketPc 2003 の .NET Compact Framework 3.5) を作成しています。クレードル イベントを検出しようとしていますが、これは検出されますが、非常に不安定です。たとえば、検出ごとに while ループが 2 回実行されます。これは、ActiveSyncEnd イベントに複数登録されているためでしょうか? これを修正するにはどうすればよいですか?

    ///NOTIFICATION_EVENT_NONE                =  0,
    ///NOTIFICATION_EVENT_TIME_CHANGE         =  1,
    ///NOTIFICATION_EVENT_SYNC_END            =  2,
    ///NOTIFICATION_EVENT_ON_AC_POWER         =  3,
    ///NOTIFICATION_EVENT_OFF_AC_POWER        =  4,
    ///NOTIFICATION_EVENT_NET_CONNECT         =  5,
    ///NOTIFICATION_EVENT_NET_DISCONNECT      =  6,
    ///NOTIFICATION_EVENT_DEVICE_CHANGE       =  7,
    ///NOTIFICATION_EVENT_IR_DISCOVERED       =  8,
    ///NOTIFICATION_EVENT_RS232_DETECTED      =  9,
    ///NOTIFICATION_EVENT_RESTORE_END         = 10,
    ///NOTIFICATION_EVENT_WAKEUP              = 11,
    ///NOTIFICATION_EVENT_TZ_CHANGE           = 12,
    ///NOTIFICATION_EVENT_MACHINE_NAME_CHANGE = 13      

// In DeviceEventManager       
public void ActiveSyncEndDetect()
{
    try
    {
        // Put 9 for cradle event, 2 for ActiveSyncEnd event, 0 for none. 
        handleActiveSyncEndEvent = NativeMethods.CreateEvent(IntPtr.Zero, false, false, "EventActiveSync");                
        while (!terminateDeviceEventThreads)
        {
            //NativeMethods.CeRunAppAtEvent("\\\\.\\Notifications\\NamedEvents\\EventActiveSync", 2);
            //NativeMethods.CeRunAppAtEvent("\\\\.\\Notifications\\NamedEvents\\EventActiveSync", 9);
            NativeMethods.CeRunAppAtEvent("\\\\.\\Notifications\\NamedEvents\\EventActiveSync", 2);                    
            NativeMethods.WaitForSingleObject(handleActiveSyncEndEvent, 0xFFFFFFFF);

            //MessageBox.Show("Activesync ended.");                
            //Do something here

            NativeMethods.CeRunAppAtEvent("\\\\.\\Notifications\\NamedEvents\\EventActiveSync", 0);
            }
        }
        catch (Exception e)
        {
            System.Windows.Forms.MessageBox.Show("Exception in ActiveSyncEndDetect method");
        }
    }
4

2 に答える 2

2

ありがとう surfrbum... (これに苦労しているのは私だけだと思いました。) あなたが提案したのは私の以前のアプローチでしたが、あまりきれいではありません。

とにかく、これは私が最終的にそれを解決する方法です:

while (!terminateDeviceEventThreads)
{
    handleActiveSyncEndEvent = NativeMethods.CreateEvent(IntPtr.Zero,
                                        true, false, "EventActiveSync");
    if (IntPtr.Zero != handleActiveSyncEndEvent)
    {
        if (NativeMethods.CeRunAppAtEvent("\\\\.\\Notifications\\NamedEvents\\EventActiveSync",
                     (int)NOTIFICATION_EVENT.NOTIFICATION_EVENT_RS232_DETECTED))
        {
            NativeMethods.WaitForSingleObject(handleActiveSyncEndEvent, 0xFFFFFFFF);
            if (activeSyncEndDelegateInstance != null)
            {
                OnActiveSyncEnd();
            }
            ResetEvent(handleActiveSyncEndEvent);
            if (!NativeMethods.CeRunAppAtEvent("\\\\.\\Notifications\\NamedEvents\\EventActiveSync",
                             (int)NOTIFICATION_EVENT.NOTIFICATION_EVENT_NONE))
            {
                break;
            }
            handleActiveSyncEndEvent = IntPtr.Zero;
        }
    }
}

したがって、このサイクルに従ってください: イベントを登録し、発生したイベントを検出し、自分でイベントをリセットし、イベントを登録解除します。このようにして、クレードル検出ロジックは非常に信頼できるものになりました。

于 2009-12-02T10:06:26.383 に答える
1

Windows CE 5 と ActiveSync でこれに気付きました。ActiveSync の問題かどうかはわかりません。クレードルからの取り外しを検出し、フラグを 0 または false に戻すまで、クレードルに取り付けられていることを示すフラグを設定し、後続の他のメッセージを無視する必要があります。

于 2009-12-01T14:34:39.853 に答える