提供一个拨号类,原来这个类的雏形是在这里发现的,现在我把它扩充一下方便大家使用
实现功能:
扩充功能
1:拨号(改正win98拨号出现610错误的情况)
2:断开拨号
3:获得当前的拨号连接
4:断线事件
using System;
using System.Runtime.InteropServices;namespace Ras
{
//尊重知识产权,原类名空间名未作更改
public class RasManager
{
//拨号数据
public const int RAS_MaxEntryName = 256;
public const int RAS_MaxPhoneNumber = 128;
public const int UNLEN = 256;
public const int PWLEN = 256;
public const int DNLEN = 15;
public const int MAX_PATH = 261;
public const int RAS_MaxDeviceType = 16;
public const int RAS_MaxDeviceName = 128;
public const int RAS_MaxCallbackNumber = RAS_MaxPhoneNumber;
//回调函数
public delegate void Callback(uint unMsg,int rasconnstate,int dwError);
//断线事件数据
private bool Keep;
public System.Threading.Thread KeepRas;
public event RasDeconnect rasDecoonect;
public delegate void RasDeconnect(object render,ClassCon.RasDecoonectAgrs e); //拨号结构
[StructLayout(LayoutKind.Sequential,Pack=4,CharSet=CharSet.Auto)]
public struct RASDIALPARAMS
{
public int dwSize;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=RAS_MaxEntryName + 1)]
public string szEntryName;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=RAS_MaxPhoneNumber + 1)]
public string szPhoneNumber;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=RAS_MaxCallbackNumber+ 1)]
public string szCallbackNumber;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=UNLEN + 1)]
public string szUserName;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=PWLEN + 1)]
public string szPassword;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=DNLEN + 1)]
public string szDomain;
//win98下面,以下的两个变量去掉,否则产生610错误
public int dwSubEntry;
public int dwCallbackId;
} //拨号函数
[DllImport("Rasapi32.dll", CharSet=CharSet.Auto)]
public static extern int RasDial(int lpRasDialExtensions, string lpszPhonebook,ref RASDIALPARAMS lprasdialparams, int dwNotifierType,Callback lpvNotifier, ref int lphRasConn);
private RASDIALPARAMS RasDialParams;
//拨号连接句柄
private int Connection;
//断开拨号
[DllImport("Rasapi32.dll", CharSet=CharSet.Auto)]
public static extern int RasHangUp(long lphRasConn);
//获取当前拨号的数据
[StructLayout(LayoutKind.Sequential,Pack=4,CharSet=CharSet.Auto)]
public struct RASCONN
{
public int dwSize;
public int 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;
}
//获取当前拨号
[DllImport("Rasapi32.dll", CharSet=CharSet.Auto)]
public static extern int RasEnumConnections(ref RASCONN lprasconn,ref int lpcb,ref int lpcConnections);
//构造函数
public RasManager()
{
Connection = 0;
RasDialParams = new RASDIALPARAMS();
RasDialParams.dwSize = Marshal.SizeOf(RasDialParams);
} //属性区域
#region Properties
//注册姓名
public string UserName
{
get{return RasDialParams.szUserName;}
set{RasDialParams.szUserName = value;}
}
//注册密码
public string Password
{
get{return RasDialParams.szPassword;}
set{RasDialParams.szPassword = value;}
}
//拨号名
public string EntryName
{
get{return RasDialParams.szEntryName;}
set{RasDialParams.szEntryName = value;}
}
//拨号电话
public sting PhoneNumber
{
get{return RasDialParams.szPhoneNumber;}
set{RasDialParams.szPhoneNumber = value;}
}
#endregion //获取当前拨号,如果拨号唯一,返回1,并且赋值句柄,拨号不为一,返回拨号个数,出错则返回错误码
public int GetConnect()
{
RASCONN lpRasConn =new RASCONN();
int lpcb =0;
int lpcConnections =0;
lpRasConn.dwSize = Marshal.SizeOf(lpRasConn);
lpcb = lpRasConn.dwSize;
int nRet = RasEnumConnections(ref lpRasConn, ref lpcb, ref lpcConnections);
if(nRet == 0)
if(lpcConnections == 1)
{
Connection = lpRasConn.hrasconn;
return lpcConnections;
}
else
return lpcConnections;
else
return nRet;
} //同步拨号
public bool Connect()
{
Connection = 0;
//根据win自己的说明,要执行已有的拨号
//RasDialParams.szEntryName = 你的拨号连接的名字,并且保持RasDialParams.szPhoneNumber = "";
//如果要直接拨号
//RasDialParams.szEntryName = "";RasDialParams.szPhoneNumber = 电话号码。
//但是我没法检测,有小猫的朋友可以试试
RasDialParams.szEntryName += "\0";
RasDialParams.szPhoneNumber += "\0";
RasDialParams.szUserName += "\0";
RasDialParams.szPassword += "\0";
int result = RasDial(0,null,ref RasDialParams,0,null,ref Connection);
if(result == 0)
{
//拨号成功开始跟踪拨号情况
if(!Keep)
{
Keep = true;
KeepRas = new System.Threading.Thread(new System.Threading.ThreadStart(this.CheckRasEvent));
KeepRas.Start();
}
return true;
}
else
{
return false;
}
}
//异步拨号
Callback rasDialFunc = new Callback(RasManager.RasDialFunc);
RasDialParams.szEntryName += "\0";
RasDialParams.szPhoneNumber += "\0";
RasDialParams.szUserName += "\0";
RasDialParams.szPassword += "\0";
int result = RasDial (0, null, ref RasDialParams, 0, rasDialFunc, ref Connection);
return result;
} //断开拨号
public int DeConnect()
{
int result = RasHangUp(Connection);
Connection = 0;
Keep = false;
System.Threading.Thread.Sleep(3000);
return result;
} //异步拨号的回调函数
public static void RasDialFunc(uint unMsg, int rasconnstate, int dwError)
{
//rasconnstate 返回的是当前状态码
//有兴趣的朋友可以假如自己的代码,它是个枚举,在c++中的结构如下
/*
typedef enum _RASCONNSTATE {
RASCS_OpenPort = 0,
RASCS_PortOpened,
RASCS_ConnectDevice,
RASCS_DeviceConnected,
RASCS_AllDevicesConnected,
RASCS_Authenticate,
RASCS_AuthNotify,
RASCS_AuthRetry,
RASCS_AuthCallback,
RASCS_AuthChangePassword,
RASCS_AuthProject,
RASCS_AuthLinkSpeed,
RASCS_AuthAck,
RASCS_ReAuthenticate,
RASCS_Authenticated,
RASCS_PrepareForCallback,
RASCS_WaitForModemReset,
RASCS_WaitForCallback,
RASCS_Projected,
#if (WINVER >= 0x400)
RASCS_StartAuthentication, // Windows 95 only
RASCS_CallbackComplete, // Windows 95 only
RASCS_LogonNetwork, // Windows 95 only
#endif
RASCS_SubEntryConnected,
RASCS_SubEntryDisconnected,
RASCS_Interactive = RASCS_PAUSED,
RASCS_RetryAuthentication,
RASCS_CallbackSetByCaller,
RASCS_PasswordExpired,
#if (WINVER >= 0x500)
RASCS_InvokeEapUI,
#endif
RASCS_Connected = RASCS_DONE,
RASCS_Disconnected
}RASCONNSTATE;
*/
} //时时检测网络
private void CheckRasEvent()
{
int i;
while(Keep)
{
i = GetConnect();
if(i != 1)
if(rasDecoonect != null)
{
rasDecoonect(this,new ClassCon.RasDecoonectAgrs(i));
Keep = false;
}
}
}
} public class RasDecoonectAgrs : System.EventArgs
{
public RasDecoonectAgrs(int i)
{
RasMeg = i;
}
public readonly int RasMeg;
}
}例如:
RasM = new ClassCon.RasManager();
RasM.EntryName = "我的连接";
RasM.PhoneNumber = "";
RasM.UserName = "guest";
RasM.Password = "guest";
















