InternetGetConnectedState
- 此函數獲取網絡狀態有延時,且對網卡傷害較大
- MSDN官方自己推薦不建議使用,不管是連網狀態下還是斷網情況下,獲取的網絡狀態都有不准確的案例,如下:
(BUG) InternetGetConnectedState API returns false result
Detecting LAN connection using InternetGetConnectedState API doesn't work
https://bbs.csdn.net/topics/340141699
在看下文之前,可以瀏覽MSDN:通過InternetGetConnectedState方法對網絡狀態的獲取
如上InternetGetConnectedState方法介紹中
- dwReversed必須設置為0
- 通過輸出值lpdwFlags可以獲取當前網絡連接的信息,通過拼裝對比可以得到當前連接的網絡類型,如撥號上網/局域網等
bool InternetGetConnectedState( out LPDWORD lpdwFlags, int dwReversed);
首先,添加非托管函數並調用,可以獲取網絡是否聯網
//聲明外部的函數 [DllImport("winInet.dll ")] private static extern bool InternetGetConnectedState(ref int flag,int dwReserved);
可以通過dwFlag判斷連網類型,撥號上網 or 局域網
1 [DllImport("winInet.dll ")] 2 private static extern bool InternetGetConnectedState(ref int flag, int dwReserved); 3 4 //調制解調器上網 5 private const int INTERNET_CONNECTION_MODEM = 1; 6 private const int INTERNET_CONNECTION_LAN = 2; 7 private const int INTERNET_CONNECTION_PROXY = 4; 8 private const int INTERNET_CONNECTION_MODEM_BUSY = 8; 9 10 public static bool InternetGetConnectedState() 11 { 12 var dwFlag = 0; 13 if (InternetGetConnectedState(ref dwFlag, 0)) 14 { 15 if ((dwFlag & INTERNET_CONNECTION_MODEM) != 0) 16 { 17 //采用調制解調器上網(撥號) 18 return true; 19 } 20 if ((dwFlag & INTERNET_CONNECTION_LAN) != 0) 21 { 22 //局域網 23 } 24 return true; 25 } 26 return false; 27 }
Demo 下載