2009-10-14 22 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。