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

posted @ 2014-09-05 14:41  tommy.yu  阅读(1804)  评论(0编辑  收藏  举报