在PPC的開發中有時須要判斷網絡何時鏈接,何時斷開,而且作出相應的處理。好比說TimeSyncPPC程序,就須要在網絡鏈接以後獲得消息而後去下載時間同步信息,所以就必需要一種方法讓TimeSyncPPC程序在PPC鏈接網絡以後獲得系統的消息。固然有人說能夠不斷去輪詢看系統是否鏈接到網絡了,但這絕對不是一個好方法。編程
在編程WM平臺的網絡應用程序時,須要判斷當前是否鏈接了網絡,方法有兩種:網絡
1. InternetGetConnectedState() less
參數具體看MSDN函數
這種方法不能實時檢測網絡。測試
2. 能夠實時檢測網絡this
其實Windows Mobile 5.0以後微軟已經提供了一個專門的函數來獲得網絡狀態變化的Notification,咱們要作的就是等待這個消息,函數以下:
HRESULT WINAPI ConnMgrRegisterForStatusChangeNotification(
BOOL fEnable,
HWND hWnd
);
這個函數是通知系統將網絡狀態變化的Notification發給指定的窗口,返回值有三個:
S_OK The function call was successful.
E_HANDLE The supplied window handle is invalid.
E_ACCESSDENIED The calling process does not have sufficient privileges to use this function.
當網絡鏈接或者斷開時,ConnMgrRegisterForStatusChangeNotification函數會發送 CONNMGR_STATUS_CHANGE_NOTIFICATION_MSG的消息給窗口,可是其實看 CONNMGR_STATUS_CHANGE_NOTIFICATION_MSG的定義,它並非一個消息,只是一個字符串:
#define CONNMGR_STATUS_CHANGE_NOTIFICATION_MSG TEXT("CONNMGR_STATUS_CHANGE_NOTIFICATION_MSG")
因此使用這個消息以前還須要註冊這個消息:
m_ConnectMsg = RegisterWindowMessage(CONNMGR_STATUS_CHANGE_NOTIFICATION_MSG);
返回值m_ConnectMsg就是傳遞到窗口的消息。
收到CONNMGR_STATUS_CHANGE_NOTIFICATION_MSG 的消息以後能夠根據wParam來判斷是斷開仍是鏈接上網絡。測試發現,鏈接ActiveSync、GPRS(不管是cmwap或是cmnet)、 WIFI甚至打電話掛電話都會觸發這個消息,在實際使用時還須要注意。
另外,微軟的文檔中有一個錯誤,常常把函數 ConnMgrRegisterForStatusChangeNotification錯寫成 ConnMgrRegisterForStatusNotification,因此若是看到 ConnMgrRegisterForStatusNotification這個函數,其實就是指的 ConnMgrRegisterForStatusChangeNotification函數。
下面是一個實際的例子,若有疑問請在www.17feixiang.com留言:
#include "connmgr_status.h"
#include "connmgr.h"
#pragma comment(lib,"wininet.lib")
#pragma comment(lib,"cellcore.lib")
UINT m_ConnectMsg;
BOOL CXXXXDlg::OnInitDialog()
{
......
HRESULT ret = ConnMgrRegisterForStatusChangeNotification(TRUE, this-〉m_hWnd);
m_ConnectMsg = RegisterWindowMessage(CONNMGR_STATUS_CHANGE_NOTIFICATION_MSG);
return TRUE; // return TRUE unless you set the focus to a control
}
LRESULT CXXXXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if(message == m_ConnectMsg)
{
switch(wParam)
{
case CONNMGR_STATUS_CONNECTED :
MessageBox(_T("Connected"));
break;
case CONNMGR_STATUS_DISCONNECTED :
MessageBox(_T("DISCONNECTED"));
break;
default :
break;
}
}
return CDialog::WindowProc(message, wParam, lParam);
}code