3

一部のソフトウェアを Windows Mobile 6.5 から Windows CE 5.0 にバックポートする必要があります。ソフトウェアは現在、ユニットがベース ユニットにある (ActiveSync が実行されている) ことを検出します。

ユニットでファイルを送受信できるように、いつ ActiveSync が実行されているかを知る必要があります。

CeRunAppAtEvent などの PINVOKE メソッドの使用に関する記事を見つけましたが、それがどのように機能するかについてはわかりません。

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

2 に答える 2

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

アプリは、起動時にこの proc を使用するスレッドを作成し、OnConnect イベントのイベント ハンドラーを接続します。

FWIW、SDF はこれを既に行っているため、コードでは次のようになります。

DeviceManagement.SerialDeviceDetected += DeviceConnected;
...
void DeviceConnected()
{
    // handle connection
}
于 2011-06-03T14:50:53.113 に答える
1

MSDN の ActiveSync ドキュメントを次に示します。少し古いですが、まだ関連性があるはずです。こちらもご覧ください

CeRunAppAtEvent に関しては、以下のようにネイティブ メソッドへのラッパーを作成する必要があります。

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

ここMSDNでPInvode のリソースを見つけることができます。

于 2011-06-03T13:48:34.383 に答える