2011-06-03 44 views
3

我不得不將一些軟件從Windows Mobile 6.5移植到Windows CE 5.0,軟件當前檢測到設備在基本單元中時(ActiveSync正在運行)。WIN CE 5.0 ActiveSync連接/斷開?

我需要知道ActiveSync何時在設備上運行,以便我可以準備設備以發送和接收文件。

我發現了一篇關於如何使用PINVOKE方法的文章,比如CeRunAppAtEvent,但我對這種方式的工作無能爲力。

bool terminateDeviceEventThreads = false; 
    IntPtr handleActiveSyncEndEvent; 

    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, 0); 

       // 

       NativeMethods.ResetEvent (handleActiveSyncEndEvent); 
       if (!NativeMethods.CeRunAppAtEvent ("\\\\.\\Notifications\\NamedEvents\\EventActiveSync", 
           (int) NOTIFICATION_EVENT.NOTIFICATION_EVENT_NONE)) 
        { 
        break; 
        } 
       handleActiveSyncEndEvent = IntPtr.Zero; 
       } 
      } 
     } 
+0

那麼,什麼是這裏的問題?您發佈的代碼會在設備處於掛起狀態時設置一個命名事件,因此您大概可以在應用程序的其他地方等待它。 – ctacke 2011-06-03 14:07:41

+0

嗨,這是問題所在,我不明白我找到的代碼,我需要的是一個觸發器,當單元被放入支架並被取出時觸發,非常類似WM6中的SystemState – 2011-06-03 14:15:38

回答

4

你的代碼這裏是等待系統通知NOTIFICATION_EVENT_RS232_DETECTED。通過使用CeRunAppAtEvent(有點用詞不當,因爲它不會運行應用程序,而是設置一個事件),他們已經註冊了一個名爲「EventActiveSync」的命名系統事件,以便在發生通知時進行設置。

實質上,當設備停靠時,指定的系統事件將被設置。

你的代碼已經得到了一些等待代碼,但並不完全 - 它調用WaitForSingleObject,但從不查看結果,然後解除事件。我認爲它會看起來更像這個

event EventHandler OnConnect = delegate{}; 

void ListenerThreadProc() 
{ 
    var eventName = "OnConnect"; 

    // create an event to wait on 
    IntPtr @event = NativeMethods.CreateEvent (IntPtr.Zero, true, false, eventName); 

    // register for the notification 
    NativeMethods.CeRunAppAtEvent (
      string.Format("\\\\.\\Notifications\\NamedEvents\\{0}", eventName), 
      (int) NOTIFICATION_EVENT.NOTIFICATION_EVENT_RS232_DETECTED); 

    while(!m_shutdown) 
    { 
     // wait for the event to be set 
     // use a 1s timeout so we don't prevent thread shutdown 
     if(NativeMethods.WaitForSingleObject(@event, 1000) == 0) 
     { 
      // raise an event 
      OnConnect(this, EventArgs.Empty); 
     } 
    } 

    // unregister the notification 
    NativeMethods.CeRunAppAtEvent (
      string.Format("\\\\.\\Notifications\\NamedEvents\\{0}", eventName), 
      (int) NOTIFICATION_EVENT.NOTIFICATION_EVENT_NONE); 

    // clean up the event handle 
    NativeMethods.CloseHandle(@event); 
} 

你的應用程序將創建在啓動時及導線上的事件處理程序中爲onConnect事件使用此PROC一個線程。

FWIW,自衛隊有這個already done,所以它會在你的代碼是這樣的:

DeviceManagement.SerialDeviceDetected += DeviceConnected; 
... 
void DeviceConnected() 
{ 
    // handle connection 
} 
+0

很好的解釋,我設法觸發連接上的事件。 – 2011-06-03 15:30:27

1

Here's MSDN上的ActiveSync文檔。有點老了,但應該仍然相關。也看看this

至於CeRunAppAtEvent你需要創建一個包裝的本機方法如下

[DllImport("coredll.dll", EntryPoint="CeRunAppAtEvent", SetLastError=true)] 
private static extern bool CeRunAppAtEvent(string pwszAppName, int lWhichEvent); 

你可以找到PInvode資源hereMSDN

+0

我已經下了這條路線,我有代碼來捕獲斷開連接,但麻煩是我不明白代碼,我會用我發現的問題來擴展上面的問題。 – 2011-06-03 13:56:29