Windows mobile 如何在Windows Mobile上检测挂起?

Windows mobile 如何在Windows Mobile上检测挂起?,windows-mobile,windows-ce,suspend,Windows Mobile,Windows Ce,Suspend,我们在Windows Mobile上看到应用程序偶尔会丢失一些数据,我们怀疑当设备挂起时,一些缓冲数据没有被刷新到磁盘上。我们希望在设备即将挂起时手动将数据刷新到磁盘。在Windows上,我们通过捕获WM_POWERBROADCAST消息来执行此操作,但此消息在Windows Mobile上不可用。我在上面找到了一句两年前的话: 你需要意识到,在你再次醒来之前,不能保证你会收到暂停通知。也就是说,在重新唤醒设备之前,您可能不会收到通知。一般来说,您不应该因为这个限制(以及您在响应事件时所能做的限

我们在Windows Mobile上看到应用程序偶尔会丢失一些数据,我们怀疑当设备挂起时,一些缓冲数据没有被刷新到磁盘上。我们希望在设备即将挂起时手动将数据刷新到磁盘。在Windows上,我们通过捕获
WM_POWERBROADCAST
消息来执行此操作,但此消息在Windows Mobile上不可用。我在上面找到了一句两年前的话:

你需要意识到,在你再次醒来之前,不能保证你会收到暂停通知。也就是说,在重新唤醒设备之前,您可能不会收到通知。一般来说,您不应该因为这个限制(以及您在响应事件时所能做的限制)而尝试对挂起进行响应。
这(仍然)适用于所有设备吗?有什么方法可以做到这一点吗?

您是否尝试过使用OpenNETCF中公开的事件?我主要是一个WinCE bod,但我发现令人难以置信的是,任何人都会发布一个平台,而该平台没有可靠地通知您电源状态的变化,因为这是台式机和移动设备之间最重要的区别之一。

您是否尝试过使用OpenNETCF中公开的事件?我主要是一个WinCE bod,但我觉得令人难以置信的是,任何人都会发布一个平台,而该平台没有可靠地通知您电源状态的变化,因为这是台式机和移动设备之间最重要的区别之一。

这句话(听起来非常非常非常熟悉)仍然正确。保证能够在挂起之前完成其工作的唯一组件是驱动程序,它们也有一系列重要的限制

挂起背后的一般想法是对应用程序透明,而提前挂起通常不是一个好主意。

这句话(听起来非常非常熟悉)仍然是正确的。保证能够在挂起之前完成其工作的唯一组件是驱动程序,它们也有一系列重要的限制


挂起背后的一般想法是对应用程序透明,而提前处理通常不是一个好主意。

据我所知,您是正确的,您无法检测设备何时进入挂起模式,只有当它使用API出来时

解决此问题的更好方法是尝试防止设备在代码的关键部分挂起

根据应用程序的运行方式,有两种方法可以做到这一点。如果它作为用户交互的一部分运行,您需要调用一些API以确保设备永远不会进入挂起模式

您需要安排以下代码至少每10秒运行一次

    ::SystemIdleTimerReset ();
    ::SHIdleTimerReset();
    ::keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);
    ::keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);

如果您的应用程序是作为后台应用程序运行的,那么您需要在执行上述代码的同时,将代码放在无人参与的电源模式块周围。有关无人值守电源模式的更多详细信息,请参阅my。

据我所知,您是正确的,您无法检测设备何时进入挂起模式,只有当它使用API出来时

解决此问题的更好方法是尝试防止设备在代码的关键部分挂起

根据应用程序的运行方式,有两种方法可以做到这一点。如果它作为用户交互的一部分运行,您需要调用一些API以确保设备永远不会进入挂起模式

您需要安排以下代码至少每10秒运行一次

    ::SystemIdleTimerReset ();
    ::SHIdleTimerReset();
    ::keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);
    ::keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);
如果您的应用程序是作为后台应用程序运行的,那么您需要在执行上述代码的同时,将代码放在无人参与的电源模式块周围。有关无人值守电源模式的更多详细信息,请参阅my。

根据Windows Mobile上除电源状态挂起外,还有另一个电源状态电源状态无人值守

如果WM设备被挂起,您首先会使电源处于无人值守状态,然后再使电源处于挂起状态

使用::RequestPowerNotifications()API和PBT_转换过滤,可以同时处理到POWER_状态_挂起和POWER_状态_无人值守的转换

处理POWER\u STATE\u SUSPEND的问题在于,它通常在设备恢复后由您的代码处理。我在网上发现一个建议,对调用::ReadMsgQueue(…,INFINITE,…)并进行处理的线程使用实时优先级

为此,我们需要使用CE特定的::CeSetThreadPriority(),因为它允许设置实时优先级。我无耻地使用0优先级

一般来说,这样我就能够在无人值守的情况下可靠地处理电源状态,而电源状态挂起则不那么可靠,因为我的操作相当耗时(~2秒)

对于我的任务,我真正需要处理的是电源状态无人值守。

根据Windows Mobile上的“除电源状态挂起”之外,还有另一个电源状态“电源状态无人值守”

如果WM设备被挂起,您首先会使电源处于无人值守状态,然后再使电源处于挂起状态

使用::RequestPowerNotifications()API和PBT_转换过滤,可以同时处理到POWER_状态_挂起和POWER_状态_无人值守的转换

处理POWER\u STATE\u SUSPEND的问题在于,它通常在设备恢复后由您的代码处理。我在网上发现一个建议,对调用::ReadMsgQueue(…,INFINITE,…)并进行处理的线程使用实时优先级

为此,我们需要使用CE特定的::CeSetThreadPriority(),因为它允许设置实时优先级。我无耻地使用0优先级

一般来说,这样我就能够在无人值守的情况下可靠地处理电源状态,而电源状态挂起则不那么可靠,因为我的操作相当耗时(~2秒)

对于我的任务,我真正需要处理的是权力、状态和无人参与<