2009-04-06 6 views
4

C# .NET Framework 응용 프로그램에서 전화 접속 네트워킹 연결을 연결, 연결 해제 및 다시 연결할 수 있어야합니다. 전화 번호부에 연결을 만드는 것도 유용 할 수도 있고 필요할 수도 있습니다.C#/.NET을 사용하는 Windows에서 전화 접속 (RAS) 연결을 사용하려면 어떻게해야합니까?

거기에 C# 또는 .NET 용으로 작성된 클래스 나 라이브러리가있어이 모든 기능을 멋지게 감쌀 수 있습니까? 누구나 공유 할 수있는 코드가 있습니까?

: 응용 프로그램은 키오스크처럼 무인, 따라서 사용자 조치를 요구하는 것은 받아 들일 수없는 것입니다.

답변

0

이것은 몇 가지 다른 클래스 (가능한 개인 정보 보호 문제로 인해 일부 코드 생략)에서 잘라 내기 때문에 직선 복사본으로 컴파일되지 않을 수 있습니다. 희망이 도움이됩니다!

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); 
    } 
} 
+0

흠 ... 난에서 WinInet 사용에 문제가 대화 상자가 전화 번호에 대한 프롬프트 팝업 원인이됩니다 따라서 인터넷 연결 설정의 물건을 사용하고 있다는 생각, 사용자 이름/암호 등 –

3

이 작업을 수행하는 한 가지 방법은 RAS 주변의 Interop을 사용하는 것입니다. 대화 상자를 표시하지 않고 RasDialDlg()를 사용하여 전화 접속 네트워킹 연결을 열 수 있습니다. 연결을 끊으려면 RasHangUp()을 사용하십시오.

RasEnumConnections()는 사용 가능한 연결을 나열하는 데 사용할 수 있습니다.

dll을

는 RASAPI32.DLL입니다 - 헤더 ras.h에 있고 CodePlex.com에 DotRas 프로젝트를

0
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; 
     } 
    } 
} 
+7

LOL @ Connect() 메서드 본문 : // TODO –

관련 문제