我正在开发“常规” C#WPF应用程序(没有UWP应用程序),并且我需要知道我是否在蜂窝连接上。蜂窝连接既可以在设备内部使用Simcard,也可以在手机中使用热点时使用。
我该如何实现?
背景: 由于该应用程序可能会下载大量数据,因此我希望用户可以选择是否要避免通过蜂窝网络下载)
其他SO问题: 我见过this question和this question,他们专注于UWP功能。还有this one,它只关注连接本身,而不是蜂窝连接。
答案 0 :(得分:1)
您可以使用System.Net.NetworkInformation来标识您的计算机网络适配器。
此外,您可以利用属性NetworkInterface.OperationalStatus来过滤当前连接的适配器,并利用NetworkInterfaceType来标识连接的类型。请查看下面的示例。
不幸的是,我的机器上没有蜂窝调制解调器来检查它是否返回了所需的结果,但是请尝试一下并让我们知道它是否可以工作。
NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (NetworkInterface adapter in interfaces)
{
//Check if it's connected
if (adapter.OperationalStatus == OperationalStatus.Up
//The network interface uses a mobile broadband interface for WiMax devices.
&& (adapter.NetworkInterfaceType == NetworkInterfaceType.Wman
//The network interface uses a mobile broadband interface for GSM-based devices.
|| adapter.NetworkInterfaceType == NetworkInterfaceType.Wwanpp
//The network interface uses a mobile broadband interface for CDMA-based devices.
|| adapter.NetworkInterfaceType == NetworkInterfaceType.Wwanpp2))
{
//adapter probably is cellular
}
}
答案 1 :(得分:1)
我尝试了UWP库,并能够使用UWP参考来解决它。
我添加了此引用:
C:\Program Files (x86)\Windows Kits\10\References\10.0.17763.0\Windows.Foundation.UniversalApiContract\7.0.0.0\Windows.Foundation.UniversalApiContract.winmd
并使用此代码检查计量连接:
private void CheckIsMetered()
{
var profile = Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile();
IsInternetAvailable = profile != null && profile.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess;
if (IsInternetAvailable)
IsMetered = profile.GetConnectionCost().NetworkCostType != Windows.Networking.Connectivity.NetworkCostType.Unrestricted;
}
我使用NetworkStatusChanged事件重新检查IsMetered。
CheckIsMetered();
NetworkInformation.NetworkStatusChanged += (s) => CheckIsMetered();
这在我的WPF应用程序中有效。