win32 API函數的做法:
要用的函數:InternetGetConnectedState
函數原形:BOOL InternetGetConnectedState(LPDWORD lpdwFlags,DWORD dwReserved);
參數lpdwFlags返回當前網絡狀態,參數dwReserved依然是保留參數,設置為0即可。
INTERNET_CONNECTION_MODEM 通過調治解調器連接網絡
INTERNET_CONNECTION_LAN 通過局域網連接網絡
這個函數的功能是很強的。它可以:
1. 判斷網絡連接是通過網卡還是通過調治解調器
2. 是否通過代理上網
3. 判斷連接是On Line還是Off Line
4. 判斷是否安裝“撥號網絡服務”
5. 判斷調治解調器是否正在使用
這個win32 API在系統system32文件夾中winInet.dll中
使用這個判斷的話,需要在類中這樣寫:
private const int INTERNET_CONNECTION_MODEM = 1; private const int INTERNET_CONNECTION_LAN = 2; [DllImport("winInet.dll")] private static extern bool InternetGetConnectedState(ref int dwFlag, int dwReserved ); //調用的方法(Winform為例,放一個按鈕,單擊即可): private void btn_network_Click(object sender, EventArgs e) { System.Int32 dwFlag = new int(); if (!InternetGetConnectedState(ref dwFlag, 0)) MessageBox.Show("未連網!"); else if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0) MessageBox.Show("采用調治解調器上網。"); else if ((dwFlag & INTERNET_CONNECTION_LAN) != 0) MessageBox.Show("采用網卡上網。"); }
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Net.NetworkInformation; namespace TestNetConnectWin32 { public class GetInternetConStatus { private const int INTERNET_CONNECTION_MODEM = 1; private const int INTERNET_CONNECTION_LAN = 2; [DllImport("winInet.dll")] private static extern bool InternetGetConnectedState( ref int dwFlag, int dwReserved ); /// <summary> /// 判斷網絡的連接狀態 /// </summary> /// <returns> /// 網絡狀態(1-->未聯網;2-->采用調治解調器上網;3-->采用網卡上網) ///</returns> public static int GetNetConStatus(string strNetAddress) { int iNetStatus = 0; System.Int32 dwFlag = new int(); if (!InternetGetConnectedState(ref dwFlag, 0)) { //沒有能連上互聯網 iNetStatus = 1; } else if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0) { //采用調治解調器上網,需要進一步判斷能否登錄具體網站 if (PingNetAddress(strNetAddress)) { //可以ping通給定的網址,網絡OK iNetStatus = 2; } else { //不可以ping通給定的網址,網絡不OK iNetStatus = 4; } } else if ((dwFlag & INTERNET_CONNECTION_LAN) != 0) { //采用網卡上網,需要進一步判斷能否登錄具體網站 if (PingNetAddress(strNetAddress)) { //可以ping通給定的網址,網絡OK iNetStatus = 3; } else { //不可以ping通給定的網址,網絡不OK iNetStatus = 5; } } return iNetStatus; } /// <summary> /// ping 具體的網址看能否ping通 /// </summary> /// <param name="strNetAdd"></param> /// <returns></returns> private static bool PingNetAddress(string strNetAdd) { bool Flage = false; Ping ping = new Ping(); try { PingReply pr = ping.Send(strNetAdd, 3000); if (pr.Status == IPStatus.TimedOut) { Flage = false; } if (pr.Status == IPStatus.Success) { Flage = true; } else { Flage = false; } } catch { Flage = false; } return Flage; } } } //判斷方法 private void btnJudge_Click(object sender, EventArgs e) { int iNetStatus = GetInternetConStatus.GetNetConStatus("baidu.com"); if (iNetStatus == 1) { lblNetStatus.Text = "網絡未連接"; } else if(iNetStatus==2) { lblNetStatus.Text = "采用調治解調器上網"; } else if (iNetStatus == 3) { lblNetStatus.Text = "采用網卡上網"; } else if (iNetStatus == 4) { lblNetStatus.Text = "采用調治解調器上網,但是聯不通指定網絡"; } else if (iNetStatus == 5) { lblNetStatus.Text = "采用網卡上網,但是聯不通指定網絡"; } }
轉 : https://www.cnblogs.com/kevinGao/archive/2011/10/31/2231521.html
https://www.cnblogs.com/kevinGao/archive/2011/11/18/2270750.html
