让Windows Mobile App在待机模式下运行

时间:2009-05-17 02:56:36

标签: windows-mobile

我有一个简单的Windows Mobile应用程序,可记录GPS坐标 每5分钟一次。问题是只要屏幕,应用程序工作正常 一旦手机进入待机模式,应用程序就会停止工作。 当我打开设备时,应用程序再次开始工作。

即使在待机模式下,我该怎么办才能让应用程序正常工作?

和Sandeep

3 个答案:

答案 0 :(得分:6)

我使用GPS的经验是需要一段时间来修复(至少在我的设备上),所以我认为你必须始终保持手机处于暂停状态。当我一直在玩我的设备时,我注意到我必须使用内置的音乐播放器在屏幕关闭时进行修复。正如ratchetr所指出的,PowerPolicyNotify(PPN_UNATTENDEDMODE,TRUE)似乎是阻止“音乐播放器要求”的正确方法。

编辑:似乎你必须在某些设备上使用SetPowerRequirement / ReleasePowerRequirement。

这是一个C#示例:

    public const int PPN_UNATTENDEDMODE = 0x0003;
    public const int POWER_NAME = 0x00000001;
    public const int POWER_FORCE = 0x00001000;

    [DllImport("coredll.dll")]
    public static extern bool PowerPolicyNotify(int dwMessage, bool dwData);

    [DllImport("coredll.dll", SetLastError = true)]
    public static extern IntPtr SetPowerRequirement(string pvDevice, CedevicePowerStateState deviceState, uint deviceFlags, string pvSystemState, ulong stateFlags);

    [DllImport("coredll.dll", SetLastError = true)]
    public static extern int ReleasePowerRequirement(IntPtr hPowerReq);

    public enum CedevicePowerStateState : int
    {
        PwrDeviceUnspecified = -1,
        D0 = 0,
        D1,
        D2,
        D3,
        D4,
    }

    //Keep the GPS and device alive:
    PowerPolicyNotify(PPN_UNATTENDEDMODE, true)
    IntPtr gpsPowerHandle = SetPowerRequirement("gpd0:", CedevicePowerStateState.D0, POWER_NAME | POWER_FORCE, null, 0);

    //Call before exiting your app:
    ReleasePowerRequirement(gpsPowerHandle);
    PowerPolicyNotify(PPN_UNATTENDEDMODE, false);

答案 1 :(得分:4)

查看CeRunAppAtTime函数。传递一个命名事件和您想要运行的时间。等待线程中的事件。您需要在唤醒时调用PowerPolicyNotify,否则设备可能会在您完成之前再次暂停。

代码看起来像这样

CeRunAppAtTime(eventName,now + 5 minutes)
while(!quit)
 WaitForSingleObject(event,timeout)
 PowerPolicyNotify(PPN_UNATTENDEDMODE,TRUE)
 DoGpsStuff()
 CeRunAppAtTime(eventName,now + 5 minutes)
 PowerPolicyNotify(PPN_UNATTENDEDMODE,FALSE)

答案 2 :(得分:2)

也许这个问题的答案是有帮助的:How can I run code on Windows Mobile while being suspended?它使用“无人值守”模式来保持应用程序在屏幕关闭时运行。