如何确定 Windows 7、8.1 和 10 上的带宽?
How can I determine bandwidth on Windows 7, 8.1 and 10?
到目前为止,我一直在努力让 MbnInterfaceManager
工作(参见 hresult from IMbnInterfaceManager::GetInterfaces when no MBN device exists), so instead I built and debugged an application with no problems from within Visual Studio 2015 that executed this WMI query in C# (see also the Win32_PerfFormattedData_Tcpip_NetworkInterface
documentation):
string query = "SELECT * FROM Win32_PerfRawData_Tcpip_NetworkInterface";
ManagementObjectSearcher moSearch = new ManagementObjectSearcher(query);
ManagementObjectCollection moCollection = moSearch.Get();
但是当我将应用程序部署到 Windows 8.1 时,每次执行查询时我都会收到此错误:
System.Management.ManagementException: Invalid query
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
有人对如何解决这个问题有什么建议吗?我如何部署应用程序以便它能够使用这样的查询?
更新:
请注意,我可以在 Visual Studio 2015 年 Windows 7 或 Windows 上构建和 运行 上述代码(作为更大的 WPF 应用程序的一部分) ] 8.1,我可以使用 ClickOnce 将相同的应用程序部署到 Windows 7 并成功 运行s。出于某种原因,当我使用 ClickOnce 将此应用程序部署到 Windows 8.1 时,我收到 Invalid query
消息。
我想我必须做的是确保 System.Management
引用设置为 "Copy Local" 但我现在无法测试它。如果大家有更好的想法欢迎告诉我。
更新:
无法像在 Windows 7 或 Windows 10 上那样在 Windows 8.1 上使用 System.Management.dll。
我发现要执行类似于我在 Windows 8.1 和 Windows 8 phone 问题中提到的操作,您需要获得 Windows 8.1 开发者许可证或 Windows 10 将您的计算机设置为 "Developer Mode" 以便您可以使用 Windows.Networking.Connectivity
命名空间:
string connectionProfileInfo = string.Empty;
ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile();
if (InternetConnectionProfile == null)
{
rootPage.NotifyUser("Not connected to Internet\n", NotifyType.StatusMessage);
}
else
{
connectionProfileInfo = GetConnectionProfile(InternetConnectionProfile);
OutputText.Text = connectionProfileInfo;
rootPage.NotifyUser("Success", NotifyType.StatusMessage);
}
// Which calls this function, that allows you to determine how strong the signal is and the associated bandwidth
string GetConnectionProfile(ConnectionProfile connectionProfile)
{
// ...
if (connectionProfile.GetSignalBars().HasValue)
{
connectionProfileInfo += "====================\n";
connectionProfileInfo += "Signal Bars: " + connectionProfile.GetSignalBars() + "\n";
}
// ...
}
请注意,您必须确保您的项目是 Window 8.1 PCL 或 Windows 8.1 应用才能引用命名空间。
详情请见https://code.msdn.microsoft.com/windowsapps/network-information-sample-63aaa201
更新 2:
为了能够在 Windows 7、8.1 和 10 上获得带宽,我最终使用了以下代码:
private int GetMaxBandwidth()
{
int maxBandwidth = 0;
NetworkInterface[] networkIntrInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (var networkInterface in networkIntrInterfaces)
{
IPv4InterfaceStatistics interfaceStats = networkInterface.GetIPv4Statistics();
int bytesSentSpeed = (int)(interfaceStats.BytesSent);
int bytesReceivedSpeed = (int)(interfaceStats.BytesReceived);
if (bytesSentSpeed + bytesReceivedSpeed > maxBandwidth)
{
maxBandwidth = bytesSentSpeed + bytesReceivedSpeed;
}
}
}
到目前为止,我一直在努力让 MbnInterfaceManager
工作(参见 hresult from IMbnInterfaceManager::GetInterfaces when no MBN device exists), so instead I built and debugged an application with no problems from within Visual Studio 2015 that executed this WMI query in C# (see also the Win32_PerfFormattedData_Tcpip_NetworkInterface
documentation):
string query = "SELECT * FROM Win32_PerfRawData_Tcpip_NetworkInterface";
ManagementObjectSearcher moSearch = new ManagementObjectSearcher(query);
ManagementObjectCollection moCollection = moSearch.Get();
但是当我将应用程序部署到 Windows 8.1 时,每次执行查询时我都会收到此错误:
System.Management.ManagementException: Invalid query
at System.Management.ManagementException.ThrowWithExtendedInfo(ManagementStatus errorCode)
at System.Management.ManagementObjectCollection.ManagementObjectEnumerator.MoveNext()
有人对如何解决这个问题有什么建议吗?我如何部署应用程序以便它能够使用这样的查询?
更新:
请注意,我可以在 Visual Studio 2015 年 Windows 7 或 Windows 上构建和 运行 上述代码(作为更大的 WPF 应用程序的一部分) ] 8.1,我可以使用 ClickOnce 将相同的应用程序部署到 Windows 7 并成功 运行s。出于某种原因,当我使用 ClickOnce 将此应用程序部署到 Windows 8.1 时,我收到 Invalid query
消息。
我想我必须做的是确保 System.Management
引用设置为 "Copy Local" 但我现在无法测试它。如果大家有更好的想法欢迎告诉我。
更新:
无法像在 Windows 7 或 Windows 10 上那样在 Windows 8.1 上使用 System.Management.dll。
我发现要执行类似于我在 Windows 8.1 和 Windows 8 phone 问题中提到的操作,您需要获得 Windows 8.1 开发者许可证或 Windows 10 将您的计算机设置为 "Developer Mode" 以便您可以使用 Windows.Networking.Connectivity
命名空间:
string connectionProfileInfo = string.Empty;
ConnectionProfile InternetConnectionProfile = NetworkInformation.GetInternetConnectionProfile();
if (InternetConnectionProfile == null)
{
rootPage.NotifyUser("Not connected to Internet\n", NotifyType.StatusMessage);
}
else
{
connectionProfileInfo = GetConnectionProfile(InternetConnectionProfile);
OutputText.Text = connectionProfileInfo;
rootPage.NotifyUser("Success", NotifyType.StatusMessage);
}
// Which calls this function, that allows you to determine how strong the signal is and the associated bandwidth
string GetConnectionProfile(ConnectionProfile connectionProfile)
{
// ...
if (connectionProfile.GetSignalBars().HasValue)
{
connectionProfileInfo += "====================\n";
connectionProfileInfo += "Signal Bars: " + connectionProfile.GetSignalBars() + "\n";
}
// ...
}
请注意,您必须确保您的项目是 Window 8.1 PCL 或 Windows 8.1 应用才能引用命名空间。
详情请见https://code.msdn.microsoft.com/windowsapps/network-information-sample-63aaa201
更新 2:
为了能够在 Windows 7、8.1 和 10 上获得带宽,我最终使用了以下代码:
private int GetMaxBandwidth()
{
int maxBandwidth = 0;
NetworkInterface[] networkIntrInterfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (var networkInterface in networkIntrInterfaces)
{
IPv4InterfaceStatistics interfaceStats = networkInterface.GetIPv4Statistics();
int bytesSentSpeed = (int)(interfaceStats.BytesSent);
int bytesReceivedSpeed = (int)(interfaceStats.BytesReceived);
if (bytesSentSpeed + bytesReceivedSpeed > maxBandwidth)
{
maxBandwidth = bytesSentSpeed + bytesReceivedSpeed;
}
}
}