Как уже упоминалось в комментарии выше, вам нужно использовать диспетчер списка сетей, как объяснено там
Для этого сначала добавьте ссылку на него, как показано на скриншоте ниже.
Щелкните правой кнопкой мыши по вашему проекту в решении Visual Studio. Выберите Add> Reference ... Перейдите в COM и найдите запись «Библиотека типов Network List Manager 1.0», используя окно поиска.
Это сгенерирует Interop DLL для этого COM-интерфейса в вашей двоичной папке вывода. Эта DLL-библиотека называется Interop.NETWORKLIST.dll.
В обозревателе решений вы можете щелкнуть правой кнопкой мыши ссылку на только что добавленную ссылку NETWORKLIST и выбрать «Просмотр в обозревателе объектов», чтобы проверить интерфейсы, к которым вы получаете доступ.
Здесь вы можете реализовать класс Network Manager, как показано ниже, для подписки на события изменения подключения.
using System;
using System.Runtime.InteropServices.ComTypes;
using System.Diagnostics;
using NETWORKLIST;
namespace SharpDisplayManager
{
public class NetworkManager: INetworkListManagerEvents, IDisposable
{
public delegate void OnConnectivityChangedDelegate(NetworkManager aNetworkManager, NLM_CONNECTIVITY aConnectivity);
public event OnConnectivityChangedDelegate OnConnectivityChanged;
private int iCookie = 0;
private IConnectionPoint iConnectionPoint;
private INetworkListManager iNetworkListManager;
public NetworkManager()
{
iNetworkListManager = new NetworkListManager();
ConnectToNetworkListManagerEvents();
}
public void Dispose()
{
//Not sure why this is not working form here
//Possibly because something is doing automatically before we get there
//DisconnectFromNetworkListManagerEvents();
}
public INetworkListManager NetworkListManager
{
get { return iNetworkListManager; }
}
public void ConnectivityChanged(NLM_CONNECTIVITY newConnectivity)
{
//Fire our event
OnConnectivityChanged(this, newConnectivity);
}
public void ConnectToNetworkListManagerEvents()
{
Debug.WriteLine("Subscribing to INetworkListManagerEvents");
IConnectionPointContainer icpc = (IConnectionPointContainer)iNetworkListManager;
//similar event subscription can be used for INetworkEvents and INetworkConnectionEvents
Guid tempGuid = typeof(INetworkListManagerEvents).GUID;
icpc.FindConnectionPoint(ref tempGuid, out iConnectionPoint);
iConnectionPoint.Advise(this, out iCookie);
}
public void DisconnectFromNetworkListManagerEvents()
{
Debug.WriteLine("Un-subscribing to INetworkListManagerEvents");
iConnectionPoint.Unadvise(iCookie);
}
}
}
Вы можете создать экземпляр своего Network Manager следующим образом:
iNetworkManager = new NetworkManager();
iNetworkManager.OnConnectivityChanged += OnConnectivityChanged;
После получения событий изменения подключения вы можете проверить атрибуты IsConnectedToInternet и IsConnected, как показано ниже:
public void OnConnectivityChanged(NetworkManager aNetwork, NLM_CONNECTIVITY newConnectivity)
{
//Update network status
UpdateNetworkStatus();
}
/// <summary>
/// Update our Network Status
/// </summary>
private void UpdateNetworkStatus()
{
//TODO: Test the following functions to get network and Internet status
//iNetworkManager.NetworkListManager.IsConnectedToInternet
//iNetworkManager.NetworkListManager.IsConnected
}
Вот связанный вопрос:
INetworkConnectionEvents Поддерживает что?