代码之家  ›  专栏  ›  技术社区  ›  Niko Gamulin

在Windows Mobile 6中禁用睡眠模式

  •  7
  • Niko Gamulin  · 技术社区  · 16 年前

    有人知道如何在Windows Mobile上通过编程禁用/启用睡眠模式吗?

    谢谢!

    3 回复  |  直到 16 年前
        1
  •  8
  •   Shane Powell    16 年前

    如果您希望程序在运行时不进入睡眠状态,最好的方法是创建一个keepalive类型函数,该函数调用SystemIdleTimerReset、ShidleTimerReset并模拟按键触摸。然后你需要说很多,基本上到处都是。

    #include <windows.h>
    #include <commctrl.h>
    
    extern "C"
    {
        void WINAPI SHIdleTimerReset();
    };
    
    void KeepAlive()
    {
        static DWORD LastCallTime = 0;
        DWORD TickCount = GetTickCount();
        if ((TickCount - LastCallTime) > 1000 || TickCount < LastCallTime) // watch for wraparound
        {
            SystemIdleTimerReset();
            SHIdleTimerReset();
            keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);
            keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);
            LastCallTime = TickCount;
        }
    }
    

    此方法仅在用户手动启动应用程序时有效。

    如果您的应用程序是通过通知启动的(即设备挂起时),那么您需要执行更多操作,否则您的应用程序将在很短的时间后挂起,直到用户将设备从挂起模式供电。要处理此问题,需要将设备置于无人值守电源模式。

    if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, TRUE))
    {
        // handle error
    }
    
    // do long running process
    
    if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, FALSE))
    {
        // handle error
    }
    

    在无人值守模式使用期间,您仍然需要大量调用keep alive,您可以使用一个单独的线程来休眠x毫秒并调用keep alive函数。

    请注意,无人值守模式不会使其脱离睡眠模式,它会使设备处于奇怪的半醒状态。

    因此,如果在设备处于挂起模式时启动无人值守模式,它将不会唤醒屏幕或任何东西。所有无人参与模式都会阻止WM挂起您的应用程序。另外一个问题是它不能在所有设备上工作,一些设备的电源管理不是很好,不管你做什么,它都会挂起你。

        2
  •  6
  •   ctacke    16 年前

    修改 the Power Manager registry setting 这会影响您想要的特定睡眠条件(超时、电池、交流电源等)和一个名为“PowerManager/ReloadActivityTimeouts”的命名系统事件上的setEvent,告诉操作系统重新加载设置。

        3
  •  1
  •   VonC    16 年前

    可能通过将“系统电源状态”修改为 described here (但在C)

    这篇文章还描述了一种防止移动设备睡眠的方法(这不是您可能想要的),方法是定期调用本机函数SystemIdleTimerReset()(以防止设备断电)。