C# 捕获ActiveSyncEnd事件:
我正在编写一个应用程序(.NET Compact Framework 3.5 on PocketPc 2003) 我正在尝试检测摇篮事件,它已检测到,但非常不稳定。 例如,每次检测时,while循环运行两次。 这是因为多次注册ActiveSyncEnd事件吗? 我如何纠正这个问题C# 捕获ActiveSyncEnd事件:,c#,compact-framework,activesync,C#,Compact Framework,Activesync,我正在编写一个应用程序(.NET Compact Framework 3.5 on PocketPc 2003) 我正在尝试检测摇篮事件,它已检测到,但非常不稳定。 例如,每次检测时,while循环运行两次。 这是因为多次注册ActiveSyncEnd事件吗? 我如何纠正这个问题 ///NOTIFICATION_EVENT_NONE = 0, ///NOTIFICATION_EVENT_TIME_CHANGE = 1, /
///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");
}
}
我在WindowsCE5和ActiveSync中注意到了这一点。我不确定这是否是ActiveSync问题。您必须有一个标志来指示它已被托管,并忽略其他后续消息,直到您检测到从托管中删除,然后将标志设置回0或false。谢谢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;
}
}
}
所以,遵循以下循环:注册事件、检测引发的事件、自行重置事件、注销事件。
这样,摇篮检测逻辑变得非常可靠