【问题标题】:Trapping ActiveSyncEnd event:捕获 ActiveSyncEnd 事件:
【发布时间】:2010-12-06 17:54:57
【问题描述】:

我正在编写一个应用程序(PocketPc 2003 上的 .NET Compact Framework 3.5) 我正在尝试检测已检测到但非常不稳定的摇篮事件。 例如,在每次检测时,while 循环都会运行两次。 这是因为 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");
        }
    }

【问题讨论】:

    标签: c# compact-framework activesync


    【解决方案1】:

    我在 Windows CE 5 和 ActiveSync 中注意到了这一点。我不确定这是否是 ActiveSync 问题。您将必须有一个标志来表明它已被摇篮并忽略其他后续消息,直到您检测到从摇篮中移除然后将标志设置回 0 或 false。

    【讨论】:

      【解决方案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;
              }
          }
      }
      

      所以,遵循这个循环:注册事件,检测引发的事件,自己重置事件,取消注册事件。 这样,摇篮检测逻辑就变得非常可靠了。

      【讨论】:

        猜你喜欢
        • 2013-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多