PPC手机从待机到重启后网络重建问题

胡摩西 2009-08-04 10:31:11
PPC待机开机后网络连接会断开,必须重新激活网络,通常是怎样处理这个过程的呢?

激活网络->建立socket->工作->手机因某原因待机->网络断开->激活开机->怎样处理返回到第一步呢?
...全文
407 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
胡摩西 2009-08-05
  • 打赏
  • 举报
回复
谢谢nbcool
(载舟之水)
胡摩西 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 anglecloudy 的回复:]
待机重新唤醒问题,一直都是WM比较棘手的问题之一呀~~~~

帮顶了。

我以前的做法是用定时器监视电池状态(GetSystemPowerState),不过效果不理想
[/Quote]
我看MSN的监测做的比较好。那个过程会不会触发某个窗口事件呢?我有一半哦笨的方法就是做个timer不停的监测,但是不划算(哦,这个和你那个方法差不多)。
OenAuth.Core 2009-08-04
  • 打赏
  • 举报
回复
待机重新唤醒问题,一直都是WM比较棘手的问题之一呀~~~~

帮顶了。

我以前的做法是用定时器监视电池状态(GetSystemPowerState),不过效果不理想
载舟之水 2009-08-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 huke1987 的回复:]
貌似3楼的方法就是开一个线程不停的监测电源状况?
[/Quote]

严格地讲不能这么看,因为是你主动请求系统发PM消息到你的队列里,而你的程序只是不停读消息循环而不是轮询。

MSDN当然不会有什么Windows Mobile的资料,大家都是看Windows Mobile 6 Documentation.chm的
不然怎么开发。

#include <pm.h>
#include <msgqueue.h>
#include "windev.h"
胡摩西 2009-08-04
  • 打赏
  • 举报
回复
需要包含哪些头呢?msdn上面居然没有
胡摩西 2009-08-04
  • 打赏
  • 举报
回复
貌似3楼的方法就是开一个线程不停的监测电源状况?
sevenzhy 2009-08-04
  • 打赏
  • 举报
回复
收藏,学习了。
胡摩西 2009-08-04
  • 打赏
  • 举报
回复
3楼确实强悍,研究下....
OenAuth.Core 2009-08-04
  • 打赏
  • 举报
回复
楼上好强,研究一下
载舟之水 2009-08-04
  • 打赏
  • 举报
回复
系统唤醒当然会发消息,你要做的就是创建一个消息队列,然后等着系统发给你

DWORD ResumeMonThread(LPVOID)
{
MSGQUEUEOPTIONS msgOptions = {0};

while(!IsAPIReady(SH_SHELL) || !IsAPIReady(SH_WMGR) || !IsAPIReady(SH_GDI))
{
Sleep(250);
}

wprintf(_T("ResumeMonThread TID = 0x%x\r\n"), GetCurrentThreadId());

// Create a message queue for Power Manager notifications.
msgOptions.dwSize = sizeof(MSGQUEUEOPTIONS);
msgOptions.dwFlags = 0;
msgOptions.dwMaxMessages = 0;
msgOptions.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_NAMELEN;
msgOptions.bReadAccess = TRUE;

g_hPMReadMsgQ = CreateMsgQueue(NULL, &msgOptions);

if ( g_hPMReadMsgQ == NULL )
{
DEBUGMSG(1, (TEXT("PWM: CreateMsgQueue(Read): error %d\r\n"), GetLastError()));
g_FlagExitThrd = TRUE;
}
// Request Power notifications
g_hPMNotifications = RequestPowerNotifications(g_hPMReadMsgQ, POWER_NOTIFY_ALL);
if ( ! g_hPMNotifications )
{
DEBUGMSG(1, (TEXT("PWM: RequestPowerNotifications: error %d\r\n"), GetLastError()));
g_FlagExitThrd = TRUE;
}

DebugOut(TEXT("ResumeMonThread: create thread success!!!"));

while(!g_FlagExitThrd)
{
DWORD iBytesInQueue = 0;
DWORD dwFlags;
UCHAR buf[QUEUE_SIZE];

PPOWER_BROADCAST pB = (PPOWER_BROADCAST) buf;
memset(buf, 0, QUEUE_SIZE);

DEBUGMSG(0, (TEXT("PWM: Waiting for PM state transition notification\r\n")));

// Read message from queue.
if ( ! ReadMsgQueue(g_hPMReadMsgQ, buf, QUEUE_SIZE, &iBytesInQueue, INFINITE, &dwFlags) )
{
DEBUGMSG(1, (TEXT("PWM: ReadMsgQueue: ERROR:%d\r\n"), GetLastError()));
}
else if ( iBytesInQueue < sizeof(POWER_BROADCAST) )
{
DEBUGMSG(1, (TEXT("PWM: Received short message: %d bytes, expected: %d\r\n"),
iBytesInQueue, sizeof(POWER_BROADCAST)));
}
else
{
switch ( pB->Message )
{
case PBT_TRANSITION:

//RETAILMSG(1, (TEXT("PWM: PBT_TRANSITION to system power state [Flags: 0x%x]: '%s'\r\n"), pB->Flags, pB->SystemPowerState));

switch ( POWER_STATE(pB->Flags) )
{
case POWER_STATE_ON:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_ON\r\n")));
break;

case POWER_STATE_OFF:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_OFF\r\n")));
break;

case POWER_STATE_CRITICAL:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_CRITICAL\r\n")));
break;

case POWER_STATE_BOOT:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_BOOT\r\n")));
break;

case POWER_STATE_IDLE:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_IDLE\r\n")));
break;

case POWER_STATE_SUSPEND:
DebugOut(TEXT("POWER_STATE_SUSPEND for resume mon\r\n"));
break;

case POWER_STATE_RESET:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_RESET\r\n")));
break;

case POWER_STATE_PASSWORD:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_PASSWORD\r\n")));
break;
case POWER_STATE_UNATTENDED:
//DEBUGMSG(1, (TEXT("PWM: POWER_STATE_UNATTENDED\r\n")));
break;
case 0:
//DEBUGMSG(1,(TEXT("PWM: Power State Flags:0x%x\r\n"),pB->Flags));
break;

default:
//DEBUGMSG(1,(TEXT("PWM: Unknown Power State Flags:0x%x\r\n"),pB->Flags));
break;
}
break;
case PBT_RESUME:
{
DebugOut(TEXT("PBT_RESUME\r\n"));
if(g_hMainWnd != NULL)
{
ShowWindow(g_hMainWnd, SW_SHOWNORMAL);
SetForegroundWindow((HWND)((ULONG) g_hMainWnd | 0x00000001));

SendMessage(g_hMainWnd, WM_REFRESH_TIME, 0, 0);
}
break;
}
case PBT_POWERSTATUSCHANGE:
//DebugOut(TEXT("PWM: PBT_POWERSTATUSCHANGE\r\n"));
break;

case PBT_POWERINFOCHANGE:
{
PPOWER_BROADCAST_POWER_INFO ppbpi = (PPOWER_BROADCAST_POWER_INFO) pB->SystemPowerState;

// RETAILMSG(1, (TEXT("PWM: PBT_POWERINFOCHANGE\r\n")));
// RETAILMSG(1, (TEXT("PWM: \tAC line status %u, battery flag %u, backup flag %u, %d levels\r\n"),
// ppbpi->bACLineStatus, ppbpi->bBatteryFlag,
// ppbpi->bBackupBatteryFlag, ppbpi->dwNumLevels));
break;
}

default:
//DEBUGMSG(1, (TEXT("PWM: Unknown Message:%d\r\n"), pB->Message));
break;
}
}
}
// We shouldn't be here
if ( g_hPMNotifications )
{
StopPowerNotifications(g_hPMNotifications);
g_hPMNotifications = NULL;
}
if ( g_hPMReadMsgQ )
{
CloseMsgQueue(g_hPMReadMsgQ);
g_hPMReadMsgQ = NULL;
}

DebugOut(_T("ResumeMonThread Exit\r\n"));

return 0;
}

VOID ReleasePMThread(VOID)
{
g_FlagExitThrd = TRUE;

if ( g_hPMNotifications )
{
StopPowerNotifications(g_hPMNotifications);
g_hPMNotifications = NULL;
}
if ( g_hPMReadMsgQ )
{
CloseMsgQueue(g_hPMReadMsgQ);
g_hPMReadMsgQ = NULL;
}

return;
}

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧