C# .NET Framework アプリケーションでダイヤルアップ ネットワーク接続を接続、切断、および再接続できる必要があります。電話帳で接続を作成することも有用/必要な場合があります。
C# または .NET 用に記述された、このすべての機能を適切にラップするクラスまたはライブラリはありますか? 喜んで共有したいコードを持っている人はいますか?
注: アプリケーションはキオスクのように無人であるため、ユーザーの操作を要求することは受け入れられません。
CodePlex.comでDotRasプロジェクトをチェックしてください。これにより、API全体が完成します。
これを行う 1 つの方法は、RAS の相互運用機能を使用することです。RasDialDlg() を使用すると、ダイアログ ボックスを表示せずにダイヤルアップ ネットワーク接続を開くことができます。RasHangUp() を使用して切断します。
RasEnumConnections() を使用して、使用可能な接続を一覧表示できます。
dll は Rasapi32.dll です。ヘッダーは ras.h と raserror.h にあります。
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace MenelGameAuto.Internet
{
class RAS
{
#region <Fields>
private int rasConnectionsAmount; // ilość struktur typu RASCONN
#endregion
[DllImport("wininet.dll", CharSet = CharSet.Auto)]
static extern bool InternetGetConnectedState(
ref int lpdwFlags,
int dwReserved);
const int MAX_PATH = 260;
const int RAS_MaxDeviceType = 16;
const int RAS_MaxPhoneNumber = 128;
const int RAS_MaxEntryName = 256;
const int RAS_MaxDeviceName = 128;
const int RAS_Connected = 0x2000;
/// <summary>
/// Wykazuje wszystkie połączenia RAS.
/// </summary>
[DllImport("rasapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int RasEnumConnections([In, Out] RASCONN[] lprasconn, ref int lpcb,ref int lpcConnections);
[DllImport("rasapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint RasHangUp(IntPtr hRasConn);
[DllImport("RASAPI32", SetLastError = true, CharSet = CharSet.Auto)]
static extern int RasGetConnectStatus(IntPtr hrasconn, ref RASCONNSTATUS lprasconnstatus);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
struct RASCONN
{
public int dwSize;
public IntPtr hrasconn;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxEntryName + 1)]
public string szEntryName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)]
public string szDeviceType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)]
public string szDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)]
public string szPhonebook;
public int dwSubEntry;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
struct RASCONNSTATUS
{
public int dwSize;
public int rasconnstate;
public int dwError;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceType + 1)]
public string szDeviceType;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxDeviceName + 1)]
public string szDeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = RAS_MaxPhoneNumber + 1)]
public string szPhoneNumber;
}
/// <summary>
/// Pobranie wszystkich połączeń RAS.
/// </summary>
/// <returns>Struktury połączeń RAS</returns>
private RASCONN[] GetRasConnections()
{
// Stworzenie tablicy, którą później należy przekazać funkcjom
int rasEnumReturn;
RASCONN[] rasconnStructs = new RASCONN[256];
rasconnStructs.Initialize(); // inicjalizacja wszystkich pól struktury
rasconnStructs[0].dwSize = Marshal.SizeOf(typeof(RASCONN)); // inicjalizacja pierwszego pola pierwszej struktury na wartość wielkości tej struktury
int sizeOfRasconnStruct = rasconnStructs[0].dwSize * rasconnStructs.Length; // wielkość pojedynczej struktury * ilosc
// Wywołanie RasEnumConnections do zdobycia wszystkich aktywnych połączeń RAS
rasEnumReturn = RasEnumConnections(rasconnStructs, ref sizeOfRasconnStruct, ref rasConnectionsAmount);
// jeżeli RasEnumConnections nie zwróciło ERROR_SUCCESS
if (rasEnumReturn != 0) throw new Win32Exception(rasEnumReturn);
return rasconnStructs;
}
/// <summary>
/// Rozłącza internet.
/// </summary>
public void Disconnect()
{
RASCONN[] rasStructs = GetRasConnections();
// Przejście przez każdą strukturę RASCONN
for (int i = 0; i < rasConnectionsAmount; i++)
{
// Pobranie pojedynczej struktury
RASCONN rStruct = rasStructs[i];
// Jeżeli uchwyt do połączenia wynosi 0, to brak połączenia
if (rStruct.hrasconn == IntPtr.Zero) continue; // i następna struktura...
// Rozłączenie...
RasHangUp(rStruct.hrasconn);
}
}
public void Connect()
{
// TODO
}
public bool IsConnected()
{
RASCONN[] rasStructs = GetRasConnections();
RASCONNSTATUS rasConnStatus = new RASCONNSTATUS();
rasConnStatus.dwSize = Marshal.SizeOf(typeof(RASCONNSTATUS));
for (int i = 0; i < rasConnectionsAmount; ++i)
{
// Pobranie pojedynczej struktury
RASCONN rStruct = rasStructs[i];
int statusResult = RasGetConnectStatus(rStruct.hrasconn, ref rasConnStatus);
if (statusResult != 0) throw new Win32Exception(statusResult);
if(rasConnStatus.rasconnstate == RAS_Connected) return true;
}
return false;
}
}
}
これはいくつかの異なるクラスから切り出されているため (プライバシーの問題が発生する可能性があるため一部のコードは省略されています)、そのままのコピーでコンパイルできない場合があります。それが役に立てば幸い!
using System.Runtime.InteropServices;
[DllImport("wininet.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public extern static bool InternetGetConnectedState(
out int connectionDescription,
int reservedValue);
[DllImport("wininet.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.I4)]
public static extern int InternetAttemptConnect(int dwReserved);
public sealed class InternetConnection
{
private InternetConnection()
{ }
public static bool IsConnected()
{
int connectionDescription = 0;
return InternetGetConnectedState(out connectionDescription, 0);
}
public static int Connect()
{
return InternetAttemptConnect(0);
}
}