2011-06-03 2 views
3

Мне нужно вернуть порт с некоторым программным обеспечением от Windows Mobile 6.5 до Windows CE 5.0, программное обеспечение в настоящее время обнаруживает, когда устройство находится в базовом блоке (работает ActiveSync).WIN CE 5.0 ActiveSync Connect/Disconnect?

Мне нужно знать, когда 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

+0

Привет, это проблема, я не понимаю код, который я нашел, мне нужен триггер, который запускается, когда устройство помещается в подставку и когда оно вынимается, подобно SystemState в WM6 –

ответ

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.

FWIW, СПФ имеет этот already done, так что это будет что-то вроде этого в коде:

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

Отличное объяснение, мне удалось вызвать событие на подключении. –

1

Here's документ ActiveSync на MSDN. Немного старый, но все равно должен быть актуальным. Также обратите внимание на this

Что касается CeRunAppAtEvent вам необходимо создать оболочку для нативного метода, как показано ниже

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

Вы можете найти PInvode ресурсы here и на MSDN

+0

Я уже был на этом маршруте, у меня есть код для захвата разъединения, но проблема в том, что я не понимаю код, я продолжу вопрос выше с тем, что я нашел. –

Смежные вопросы