WIN CE 5.0 ActiveSync Подключать / Отключать? - PullRequest
3 голосов
/ 03 июня 2011

Мне нужно перенести портирование некоторого программного обеспечения с Windows Mobile 6.5 на Windows 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;
                }
            }
        }

Ответы [ 2 ]

4 голосов
/ 03 июня 2011

Код, который вы здесь видите, находится в системном уведомлении 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, в SDF это уже выполнено , поэтому в вашем коде это будет выглядеть примерно так:

DeviceManagement.SerialDeviceDetected += DeviceConnected;
...
void DeviceConnected()
{
    // handle connection
}
1 голос
/ 03 июня 2011

Вот документ ActiveSync на MSDN. Немного стар, но все еще должно быть актуально. Также взгляните на это

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

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

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

...