1

我正在编写一个应用程序(PocketPc 2003 上的 .NET Compact Framework 3.5)我正在尝试检测 cradle 事件,该事件已被检测到但非常不稳定。例如,在每次检测时,while 循环都会运行两次。这是因为 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;
        }
    }
}

So, follow this cycle: register event, detect the event raised, reset event yourself, unregister event. This way, the cradle detection logic has become very reliable.

于 2009-12-02T10:06:26.383 回答
1

我在 Windows CE 5 和 ActiveSync 中注意到了这一点。我不确定这是否是 ActiveSync 问题。您将必须有一个标志来指示它已被摇篮并忽略其他后续消息,直到您检测到从摇篮中移除然后将标志设置回 0 或 false。

于 2009-12-01T14:34:39.853 回答