Я не могу вспомнить, если это доступно в .Net CF или нет:
System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
Другой вариант - просто попытаться использоватьвеб-сервис и обрабатывать исключения.Я обычно следую этому шаблону, есть ли причина, по которой он не работает в вашем случае?
Редактировать:
Класс монитора подключений:
public static class ConnectionMonitor
{
public static event EventHandler IsConnectedChanged;
private static SystemState _connectionState = null,
//_cellState = null,
_gprsState = null;
private static int _connectionCount = 0;
//_cellCount = 0;
private static bool _gprs = false;
private static bool _isConnected = true;
private static string _phoneCarrier = SystemState.PhoneOperatorName;
private const int POWER_FLAGS = 0x00000001; // default
private const string AXIM_WIFI_ADAPTER = "{98C5250D-C29A-4985-AE5F-AFE5367E5006}\\TIACXWLN1";
public static bool IsPhone
{
get { return !string.IsNullOrEmpty(_phoneCarrier); }
}
public static bool IsGPRSConnected
{
get { return _gprs; }
}
public static bool IsConnected
{
get { return _isConnected; }
set
{
if (_isConnected != value)
{
_isConnected = value;
if (IsConnectedChanged != null)
{
IsConnectedChanged(null, EventArgs.Empty);
}
if (!_isConnected && !IsPhone)
{
WifiOn();
}
}
}
}
private static void WifiOn()
{
Win32.CEDEVICE_POWER_STATE state = new Win32.CEDEVICE_POWER_STATE();
if (Win32.GetDevicePower(AXIM_WIFI_ADAPTER, POWER_FLAGS, ref state) == 0)
{
if (state != Win32.CEDEVICE_POWER_STATE.D0)
{
Win32.DevicePowerNotify(AXIM_WIFI_ADAPTER, Win32.CEDEVICE_POWER_STATE.D4, POWER_FLAGS);
Win32.SetDevicePower(AXIM_WIFI_ADAPTER, POWER_FLAGS, Win32.CEDEVICE_POWER_STATE.D0);
}
}
}
public static void Init()
{
if (_connectionState == null)
{
_connectionState = new SystemState(SystemProperty.ConnectionsCount);
_connectionCount = SystemState.ConnectionsCount;
_connectionState.Changed += new ChangeEventHandler(_state_Changed);
}
//if (_cellState == null)
//{
// _cellState = new SystemState(SystemProperty.ConnectionsCellularCount);
// _cellCount = SystemState.ConnectionsCellularCount;
// _cellState.Changed += new ChangeEventHandler(_state_Changed);
//}
if (_gprsState == null)
{
_gprsState = new SystemState(SystemProperty.PhoneGprsCoverage);
_gprs = SystemState.PhoneGprsCoverage;
_gprsState.Changed += new ChangeEventHandler(_state_Changed);
}
IsConnected = _connectionCount > 0 || _gprs;
}
private static void _state_Changed(object sender, ChangeEventArgs args)
{
//_cellCount = SystemState.ConnectionsCellularCount;
_connectionCount = SystemState.ConnectionsCount;
_gprs = SystemState.PhoneGprsCoverage;
IsConnected = _connectionCount > 0 || _gprs;
}
public static void Dispose()
{
if (_connectionState != null)
{
_connectionState.Changed -= new ChangeEventHandler(_state_Changed);
_connectionState.Dispose();
_connectionState = null;
}
//if (_cellState != null)
//{
// _cellState.Changed -= new ChangeEventHandler(_state_Changed);
// _cellState.Dispose();
// _cellState = null;
//}
if (_gprsState != null)
{
_gprsState.Changed -= new ChangeEventHandler(_state_Changed);
_gprsState.Dispose();
_gprsState = null;
}
}
}
В моем статическом классе Win32 было много вызовов (не связанных с вашими потребностями).Вот все, что, я думаю, вам нужно:
public enum CEDEVICE_POWER_STATE : int
{
PwrDeviceUnspecified = -1,
D0 = 0, // Full On: full power, full functionality
D1 = 1, // Low Power On: fully functional at low power/performance
D2 = 2, // Standby: partially powered with automatic wake
D3 = 3, // Sleep: partially powered with device initiated wake
D4 = 4, // Off: unpowered
PwrDeviceMaximum = 5
}
[DllImport("coredll.dll", SetLastError = true)]
public static extern int DevicePowerNotify(string name, CEDEVICE_POWER_STATE state, int flags);
[DllImport("coredll.dll", SetLastError = true)]
public static extern int SetDevicePower(string name, int flags, CEDEVICE_POWER_STATE state);
[DllImport("coredll.dll", SetLastError = true)]
public static extern int GetDevicePower(string name, int flags, ref CEDEVICE_POWER_STATE state);
Если я что-то пропустил, найдите их на pinvoke.net .