2009-10-14 60 views
1

我正在编写一个应用程序(PocketPc 2003上的.NET Compact Framework 3.5) 我试图检测到摇篮事件,它被检测到但非常不稳定。例如,在每次检测时while循环运行两次。 这是因为多次注册到ActiveSyncEnd事件? 我该如何纠正?诱捕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"); 
     } 
    } 

回答

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; 
     } 
    } 
} 

所以,按照这个周期:注册事件,发现引发事件,复位事件自己,注销事件。 这样,摇篮检测逻辑变得非常可靠。

1

我已经注意到了这一点与Windows CE 5和ActiveSync。我不确定它是否是ActiveSync问题。你将不得不有一个标志来表明它是cradled并忽略其他后续的消息,直到你检测到从摇篮中删除然后将标志设置为0或false。