常見做法 Ping 或嘗試連線特定網站,但:ICMP 可能被防火牆封鎖、目標網站可能暫時不可用、無法區分「區域網路連通」與「網際網路可達」。Windows 提供 wininet.dll!InternetGetConnectedState 直接查詢系統網路連線狀態旗標,無需發送封包,回應極快,且能區分「離線模式」、「Proxy」、「LAN」等連線類型。
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool InternetGetConnectedState(out int lpdwFlags, int dwReserved);
lpdwFlags:輸出連線類型旗標組合(見下表)dwReserved:保留,必須為 0true = 系統判定有可用連線,false = 完全離線| 常數 | 值 | 含義 |
|---|---|---|
| 0x01 | 撥號調變解調器連線 | |
| 0x02 | 區域網路連線 | |
| 0x04 | 透過 Proxy 連線 | |
| 0x08 | 調變解調器忙碌(無新連線) | |
| 0x10 | 已安裝 RAS(遠端存取服務) | |
| 0x20 | 離線模式 | |
| 0x40 | 已設定連線(不一定目前連通) |
using System;
using System.Runtime.InteropServices;
public static class NetworkStatus
{
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool InternetGetConnectedState(out int flags, int reserved);
[Flags]
public enum ConnectionType : int
{
Modem = 0x01,
Lan = 0x02,
Proxy = 0x04,
ModemBusy = 0x08,
RasInstalled = 0x10,
Offline = 0x20,
Configured = 0x40
}
public static bool IsConnected()
{
return InternetGetConnectedState(out _, 0);
}
public static bool IsConnected(out ConnectionType type)
{
int flags;
bool result = InternetGetConnectedState(out flags, 0);
type = (ConnectionType)flags;
return result;
}
public static ConnectionType GetConnectionType()
{
InternetGetConnectedState(out int flags, 0);
return (ConnectionType)flags;
}
public static string GetConnectionDescription()
{
var type = GetConnectionType();
if (type == 0) return "離線 / 無連線";
return type.ToString(); // FlagsAttribute 會自動組合顯示多標記
}
}
// 簡單檢查
if (NetworkStatus.IsConnected())
Console.WriteLine("系統偵測到網路連線");
else
Console.WriteLine("系統處於離線狀態");
// 詳細類型
if (NetworkStatus.IsConnected(out var type))
{
Console.WriteLine($"連線類型:{type}");
if (type.HasFlag(NetworkStatus.ConnectionType.Lan)) Console.WriteLine("→ 區域網路");
if (type.HasFlag(NetworkStatus.ConnectionType.Proxy)) Console.WriteLine("→ 透過 Proxy");
if (type.HasFlag(NetworkStatus.ConnectionType.Offline)) Console.WriteLine("→ 離線模式啟用");
}
// 取得描述字串
Console.WriteLine(NetworkStatus.GetConnectionDescription());
using System.Net.NetworkInformation;
NetworkChange.NetworkAvailabilityChanged += (s, e) =>
{
Console.WriteLine($"網路可用性變更:{(e.IsAvailable ? "可用" : "不可用")}");
if (e.IsAvailable)
Console.WriteLine($"詳細:{NetworkStatus.GetConnectionDescription()}");
};
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable() 搭配實際連線測試InternetGetConnectedState 是 Windows 平台最輕量、最標準的「系統層網路狀態」查詢 API。封裝為靜態工具類後,可作為應用程式啟動檢查、離線模式切換、網路狀態圖示更新的基礎依據,**但不應作為業務層「能否呼叫 API」的唯一判斷**,最終仍需實際發送請求驗證。