c# 如何使用wlanapi连接电脑到wifi

http://www.codeproject.com/Articles/72105/Manage-WiFi-with-Native-API-WIFI-on-Windows-XP-SP

 

Introduction

This article will demonstrate the ability to establish and operate a WiFi connection from a C# program using the Wireless LAN API on a Windows XP Embedded SP2 \ Windows XP Pro SP2.

Step 1

The first step was to create a function that returns the WiFi networks available for connection. Using the WLANOpenHandle, you create the client to use for the session:

Wlan.WlanOpenHandle( 

Wlan.WLAN_CLIENT_VERSION_XP_SP2, <--- (Wireless LAN API for Windows XP with SP2) 

IntPtr.Zero, 

ref negotiatedVersion, 

ref clientHandle)

  

Step 2

Then list all the wireless LAN interfaces visible from our PC:

Wlan.WlanEnumInterfaces( 

clientHandle, <--- (clientHandle precedentemente istanziato) 

IntPtr.Zero, 

ref pInterfaceList) 

  

Step 3

Using the pointer to the list of available interfaces, we will populate the structure that will contain all Wlan.WLAN_INTERFACE_INFO_LIST NIC interface information:

Wlan.WLAN_INTERFACE_INFO_LIST interfaceList = 

		new Wlan.WLAN_INTERFACE_INFO_LIST(pInterfaceList); 

  

Step 4

What we are still missing at this point and guidance of our interface to be passed to the function Wlan.WlanGetAvailableNetworkList, we get through this passage:

Guid InterfaceGuid = 

	((Wlan.WLAN_INTERFACE_INFO)interfaceList.InterfaceInfo[0]).InterfaceGuid; 

 

Step 5

Now we have all the elements to call the API Wlan.WlanGetAvailableNetworkList; declare that we will return the pointer function and proceed:

IntPtr pAvailableNetworkList = IntPtr.Zero; 

Wlan.WlanGetAvailableNetworkList( clientHandle, 

                                  InterfaceGuid, 

                                  Wlan.WlanGetAvailableNetworkFlags.

				IncludeAllManualHiddenProfiles,

                                  IntPtr.Zero, 

                                  out ppAvailableNetworkList)

Scroll through the list of connections:

Wlan.WLAN_AVAILABLE_NETWORK_LIST wlanAvailableNetworkList = 

    new Wlan.WLAN_AVAILABLE_NETWORK_LIST(pAvailableNetworkList); 

Wlan.WlanFreeMemory(pAvailableNetworkList); 

for (int j = 0; j < wlanAvailableNetworkList.dwNumberOfItems; j++) 

{ 

   Wlan.WLAN_AVAILABLE_NETWORK network = wlanAvailableNetworkList.Networks[j]; 

   string SSId = GetStringForSSID(network.dot11Ssid); 

   if(ssid != "") 

   { 

      //Connessione 

      Wifi_SetProfile(network.dot11DefaultAuthAlgorithm, SSId); 

   }  

}

Depending on the type of connection configured for my Access Point imposed the correct profile and I connect:

static void Wifi_SetProfile(Wlan.DOT11_AUTH_ALGORITHM connType, string sNetSSId) 

{ 

   switch (connType) 

   { 

      //WEP - OPen 

      case Wlan.DOT11_AUTH_ALGORITHM.DOT11_AUTH_ALGO_80211_OPEN: 

      profileXml = string.Format(

          "<?xml version=\"1.0\"?>

          <WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">

          <name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig>

          <connectionType>ESS</connectionType><MSM><security><authEncryption>

          <authentication>open</authentication><encryption>WEP</encryption>

          <useOneX>false</useOneX></authEncryption><sharedKey>

          <keyType>networkKey</keyType><protected>false</protected>

          <keyMaterial>{1}</keyMaterial></sharedKey><keyIndex>0</keyIndex>

          </security></MSM></WLANProfile>", 

      profileName, key); 

 

      Wlan.WlanSetProfile( clientHandle, 

			InterfaceGuid, 

			Wlan.WlanProfileFlags.AllUser, 

			profileXml, 

			null, 

			true, 

			IntPtr.Zero, 

			out reasonCode); 

 

     if(reasonCode==Wlan.WlanReasonCode.Success) 

     { 

        //Connect!!! 

        ... 

     } 

     else 

     { 

        //Return usually 1168 – Error is on profile Xml or on key 

     } 

     break;

 

     //WPA_PSK 

     case Wlan.DOT11_AUTH_ALGORITHM.DOT11_AUTH_ALGO_WPA_PSK: 

     profileXml = string.Format("<?xml version=\"1.0\" encoding=\"US-ASCII\"?>

         <WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">

         <name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig>

         <connectionType>ESS</connectionType><connectionMode>auto</connectionMode>

         <autoSwitch>false</autoSwitch><MSM><security><authEncryption>

         <authentication>WPAPSK</authentication><encryption>TKIP</encryption>

         <useOneX>false</useOneX></authEncryption><sharedKey>

         <keyType>passPhrase</keyType><protected>false</protected>

         <keyMaterial>{1}</keyMaterial></sharedKey></security></MSM></WLANProfile>", 

         profileName, key);

 

 		 Wlan.WlanSetProfile( clientHandle, 

                          InterfaceGuid, 

                          Wlan.WlanProfileFlags.AllUser, 

                          profileXml, 

                          null, 

                          true, 

                          IntPtr.Zero, 

                          out reasonCode);

 

 		 if(reasonCode == Wlan.WlanReasonCode.Success) 

     { 

         //Connect!!! 

         ... 

     } 

     else 

     { 

        //Return usually 1168 – Error is on profile Xml or on key 

     } 

     break; 

} 

  

补充参考:

http://stackoverflow.com/questions/6318575/connect-to-a-wireless-network-in-c-sharp 

http://msdn.microsoft.com/en-us/library/windows/desktop/aa370032(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa369853(v=vs.85).aspx

你可能感兴趣的:(wifi)