PPC Windows Mobile判斷網絡(gprs)鏈接與否代碼

轉載

在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

相關文章
相關標籤/搜索