C++操作Windows WIFI

5 篇文章 0 订阅
1 篇文章 0 订阅
本文转自:http://blog.csdn.net/freeape/article/details/45954309
实现功能
    无线网卡列表
    无线热点扫面
    无线连接(有密码,配置文件连接方式)
    无线断开
    重命名本地无线名(两种方式)
    删除无线配置文件
    开启和关闭无线网卡
Native Wifi 简介
    是提供给软件开发者来开发windows 无线管理的一系列API。编程人员可以通过这些函数来进行相关的无线管理,当然我们还可以通过netsh终端命令来管理,这对于非编程人员就可以简单的实现,具体可以查阅相关资料去了解。
    API如下:

无线的连接相关知识


    从windows的无线网络属性设置窗口来对比,在API编程中,同样有个配置文件来设置这些属性的,那就是profile文件,通过编写xml文件来设置相关属性。

WLAN_profile Schema Elements [xml配置文件编写格式]:

    

Wireless Profile Samples[无线配置文件例程]

    例如常见的路由器,安全类型为WPA2-PSK的xml配置文件如下(有密码):
    
<?xml version="1.0" encoding="US-ASCII"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
    <name>SampleWPA2PSK</name>
    <SSIDConfig>
        <SSID>
            <name>SampleWPA2PSK</name>
        </SSID>
    </SSIDConfig>
    <connectionType>ESS</connectionType>
    <connectionMode>auto</connectionMode>
    <autoSwitch>false</autoSwitch>
    <MSM>
        <security>
            <authEncryption>
                <authentication>WPA2PSK</authentication>
                <encryption>AES</encryption>
                <useOneX>false</useOneX>
            </authEncryption>
<sharedKey>
    <keyType>passPhrase</keyType>
    <protected>false</protected>
    <keyMaterial> <!-- insert key here --> </keyMaterial>
</sharedKey>
        </security>
    </MSM>
</WLANProfile>
    注:
    【加密类型设置】
<encryption>AES</encryption>
    【安全类型设置】
<authentication>WPAPSK</authentication>
           
           
ValueDescription
openOpen 802.11 authentication.
sharedShared 802.11 authentication.
WPAWPA-Enterprise 802.11 authentication.
WPAPSKWPA-Personal 802.11 authentication.
WPA2WPA2-Enterprise 802.11 authentication.
WPA2PSKWPA2-Personal 802.11 authentication.
具体功能编程实现(QTCtreator 5.xx)
     .pro文件
    LIBS+=$$quote(E:/qt/2015-4-9/WlanGetProfileTest/WlanGetProfileTest/lib/wlanapi.lib)
    LIBS+=$$quote(E:/qt/2015-4-9/WlanGetProfileTest/WlanGetProfileTest/lib/OLE32.lib)
    包含头文件
    #include<windows.h>
    #include<wlanapi.h>

[cpp]  view plain  copy
  1. 程序实现(终端打印信息)  
  2. #include<windows.h>  
  3. #include<wlanapi.h>  
  4. #include<string>  
  5. #include<stdio.h>  
  6.   
  7. //无线连接状态  
  8. intlistenStatus()  
  9. {  
  10. HANDLEhClient=NULL;  
  11. DWORDdwMaxClient=2;  
  12. DWORDdwCurVersion=0;  
  13. DWORDdwResult=0;  
  14. intiRet=0;  
  15. WCHARGuidString[39]={0};  
  16. //ListenthestatusoftheAPyouconnected.  
  17. while(1){  
  18. Sleep(5000);  
  19. PWLAN_INTERFACE_INFO_LISTpIfList=NULL;  
  20. PWLAN_INTERFACE_INFOpIfInfo=NULL;  
  21.   
  22. dwResult=WlanOpenHandle(dwMaxClient,NULL,&dwCurVersion,&hClient);  
  23. if(dwResult!=ERROR_SUCCESS){  
  24. wprintf(L"WlanOpenHandlefailedwitherror:%u\n",dwResult);  
  25. return1;  
  26. }  
  27. //获取无线网卡列表  
  28. dwResult=WlanEnumInterfaces(hClient,NULL,&pIfList);  
  29. if(dwResult!=ERROR_SUCCESS){  
  30. wprintf(L"WlanEnumInterfacesfailedwitherror:%u\n",dwResult);  
  31. return1;  
  32. }else{  
  33. wprintf(L"NumEntries:%lu\n",pIfList->dwNumberOfItems);  
  34. wprintf(L"CurrentIndex:%lu\n\n",pIfList->dwIndex);  
  35. inti;  
  36. for(i=0;i<(int)pIfList->dwNumberOfItems;i++){  
  37. pIfInfo=(WLAN_INTERFACE_INFO*)&pIfList->InterfaceInfo[i];  
  38. wprintf(L"InterfaceIndex[%u]:\t%lu\n",i,i);  
  39. iRet=StringFromGUID2(pIfInfo->InterfaceGuid,(LPOLESTR)&GuidString,  
  40. sizeof(GuidString)/sizeof(*GuidString));  
  41. if(iRet==0)  
  42. wprintf(L"StringFromGUID2failed\n");  
  43. else{  
  44. wprintf(L"InterfaceGUID[%d]:%S\n",i,GuidString);  
  45. }  
  46. wprintf(L"InterfaceDescription[%d]:%S",i,  
  47. pIfInfo->strInterfaceDescription);  
  48. wprintf(L"\n");  
  49. wprintf(L"InterfaceState[%d]:\t",i);  
  50. switch(pIfInfo->isState){  
  51. casewlan_interface_state_not_ready:  
  52. wprintf(L"Notready\n");  
  53. break;  
  54. casewlan_interface_state_connected:  
  55. wprintf(L"Connected\n");  
  56. break;  
  57. casewlan_interface_state_ad_hoc_network_formed:  
  58. wprintf(L"Firstnodeinaadhocnetwork\n");  
  59. break;  
  60. casewlan_interface_state_disconnecting:  
  61. wprintf(L"Disconnecting\n");  
  62. break;  
  63. casewlan_interface_state_disconnected:  
  64. wprintf(L"Notconnected\n");  
  65. break;  
  66. casewlan_interface_state_associating:  
  67. wprintf(L"Attemptingtoassociatewithanetwork\n");  
  68. break;  
  69. casewlan_interface_state_discovering:  
  70. wprintf(L"Autoconfigurationisdiscoveringsettingsforthenetwork\n");  
  71. break;  
  72. casewlan_interface_state_authenticating:  
  73. wprintf(L"Inprocessofauthenticating\n");  
  74. break;  
  75. default:  
  76. wprintf(L"Unknownstate%ld\n",pIfInfo->isState);  
  77. break;  
  78. }  
  79. }  
  80. }  
  81. }  
  82. }  
  83. intmain()  
  84. {  
  85. HANDLEhClient=NULL;  
  86. DWORDdwMaxClient=2;  
  87. DWORDdwCurVersion=0;  
  88. DWORDdwResult=0;  
  89. PWLAN_INTERFACE_INFO_LISTpIfList=NULL;  
  90. //opensaconnectiontotheserver.  
  91. dwResult=WlanOpenHandle(dwMaxClient,NULL,&dwCurVersion,&hClient);  
  92. if(dwResult!=ERROR_SUCCESS){  
  93. wprintf(L"WlanOpenHandlefailedwitherror:%u\n",dwResult);  
  94. return1;  
  95. }  
  96. //enumeratesallofthewirelessLANinterfacescurrentlyenabledonthelocalcomputer.  
  97. dwResult=WlanEnumInterfaces(hClient,NULL,&pIfList);  
  98. if(dwResult!=ERROR_SUCCESS){  
  99. wprintf(L"WlanEnumInterfacesfailedwitherror:%u\n",dwResult);  
  100. return1;  
  101. }else{  
  102. //disconnectsaninterfacefromitscurrentnetwork.  
  103. dwResult=WlanDisconnect(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid,NULL);//DISCONNECTFIRST  
  104. if(dwResult!=ERROR_SUCCESS)  
  105. {  
  106. printf("WlanDisconnectfailedwitherror:%lu\n",dwResult);  
  107. return-1;  
  108. }  
  109. //retrievethelistofavailablenetworksonawirelessLANinterface.  
  110. PWLAN_AVAILABLE_NETWORK_LISTpWLAN_AVAILABLE_NETWORK_LIST=NULL;  
  111. dwResult=WlanGetAvailableNetworkList(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid,  
  112. 0,  
  113. NULL,&pWLAN_AVAILABLE_NETWORK_LIST);  
  114. if(dwResult!=ERROR_SUCCESS)  
  115. {  
  116. printf("WlanGetAvailableNetworkListfailedwitherror:%lu\n",dwResult);  
  117. WlanFreeMemory(pWLAN_AVAILABLE_NETWORK_LIST);  
  118. return-1;  
  119. }  
  120. //connectawlan  
  121. LPCWSTRprofileXml;  
  122. std::wstringstrHead=  
  123. L"<?xmlversion=\"1.0\"encoding=\"US-ASCII\"?>\  
  124. <WLANProfilexmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\">\  
  125. <name>SampleWPA2PSK</name>\  
  126. <SSIDConfig>\  
  127. <SSID>\  
  128. <name>CJLU</name>\  
  129. </SSID>\  
  130. </SSIDConfig>\  
  131. <connectionType>ESS</connectionType>\  
  132. <connectionMode>auto</connectionMode>\  
  133. <autoSwitch>false</autoSwitch>\  
  134. <MSM>\  
  135. <security>\  
  136. <authEncryption>\  
  137. <authentication>WPA2PSK</authentication>\  
  138. <encryption>AES</encryption>\  
  139. <useOneX>false</useOneX>\  
  140. </authEncryption>\  
  141. <sharedKey>\  
  142. <keyType>passPhrase</keyType>\  
  143. <protected>false</protected>\  
  144. <keyMaterial>5566778899</keyMaterial>\  
  145. </sharedKey>\  
  146. </security>\  
  147. </MSM>\  
  148. </WLANProfile>";  
  149. profileXml=strHead.c_str();  
  150. WLAN_REASON_CODEWlanreason;  
  151. //如果<connectionMode>auto</connectionMode>,为自动连接,则下面的一步可以连接上无线  
  152. dwResult=WlanSetProfile(hClient,  
  153. &(pIfList->InterfaceInfo[0].InterfaceGuid),  
  154. 0,profileXml,NULL,TRUE,NULL,&Wlanreason);  
  155. if(ERROR_SUCCESS!=dwResult)  
  156. {  
  157. printf("wlansetprofilefailed%lu.\r\n",dwResult);  
  158. }  
  159. //删除无线配置文件  
  160. /* 
  161. LPCWSTRprofileName; 
  162. LPCWSTRnewProfileName; 
  163. std::wstringstrprofileName=L"SampleWPA2PSK"; 
  164. std::wstringstrNewProfileName=L"test"; 
  165. profileName=strprofileName.c_str(); 
  166. newProfileName=strNewProfileName.c_str(); 
  167. dwResult=WlanDeleteProfile(hClient, 
  168. &(pIfList->InterfaceInfo[0].InterfaceGuid), 
  169. profileName,NULL); 
  170. if(ERROR_SUCCESS!=dwResult) 
  171. { 
  172. printf("wlandeleteprofilefailed%lu.\r\n",dwResult); 
  173. } 
  174. */  
  175. /* 
  176. //重命名无线配置文件,其实只是新建了一个配置文件,并无重命名(更改了wlanapi.h,将此函数换了条件编译位置) 
  177. dwResult=WlanRenameProfile(hClient, 
  178. &(pIfList->InterfaceInfo[0].InterfaceGuid), 
  179. profileName, 
  180. newProfileName, 
  181. NULL 
  182. ); 
  183. if(ERROR_SUCCESS!=dwResult) 
  184. { 
  185. printf("wlanRenameprofilefailed%lu.\r\n",dwResult); 
  186. } 
  187. */  
  188. //网卡关闭和开启(关闭了,就开不了了,除非获取了InterfaceGuid  
  189. //然后可以关闭再开启。用fn+F2手动开启)  
  190. WLAN_PHY_RADIO_STATEstate;  
  191. state.dwPhyIndex=0;  
  192. state.dot11SoftwareRadioState=dot11_radio_state_on;  
  193. PVOIDpData=&state;  
  194. dwResult=WlanSetInterface(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid,  
  195. wlan_intf_opcode_radio_state,sizeof(WLAN_PHY_RADIO_STATE),pData,NULL);  
  196. if(dwResult!=ERROR_SUCCESS)  
  197. {  
  198. wprintf(L"setstatefailed!erris%d\n",dwResult);  
  199. }  
  200. }  
  201. dwResult=WlanCloseHandle(hClient,NULL);  
  202. if(dwResult!=ERROR_SUCCESS)  
  203. {  
  204. wprintf(L"WlanCloseHandlefailed%lu.\r\n",dwResult);  
  205. }  
  206. listenStatus();  
  207. if(pIfList!=NULL){  
  208. WlanFreeMemory(pIfList);  
  209. pIfList=NULL;  
  210. }  
  211. return0;  
  212. }  
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 首先,你需要使用 Windows 应用程序开发工具,如 Visual Studio 来创建 C 语言程序。 接下来,你需要在代码中包含 Windows 头文件 "wlanapi.h",并调用 WlanOpenHandle 函数来打开 WLAN API 句柄。 然后,你可以使用 WlanEnumInterfaces 函数来获取系统中可用的 WLAN 接口列表。 接着,你可以遍历每个接口,并使用 WlanSetInterface function 设置 WLAN_INTF_OPCODE_HIDDEN_NETWORK 标志来隐藏该接口。 最后,你需要调用 WlanCloseHandle 函数来关闭 WLAN API 句柄。 以上是一种使用 C 语言隐藏 Windows WiFi 列表的方法。你还可以使用其他方法,如使用 Windows Management Instrumentation (WMI) 或者直接调用 Windows 内部函数。但是需要注意,有些方法可能需要你在代码中包含特定的头文件或者链接特定的库文件,或者在系统中具有特定的权限。 ### 回答2: 在C语言中,要隐藏Windows WiFi列表,可以通过修改Windows的注册表来实现。 首先,需要使用C语言中的Windows API函数来访问和修改注册表。可以使用RegOpenKeyEx函数打开注册表项,使用RegSetValueEx函数来修改注册表项的值,以及使用RegCloseKey函数关闭注册表项。 要隐藏WiFi列表,需要将下面这个注册表项的值设置为1: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Control Panel\Settings\Network\HideScanAssociations 在C语言中,可以使用以下代码片段来实现这个功能: #include <stdio.h> #include <windows.h> int main() { HKEY hKey; DWORD dwData = 1; // 打开注册表项 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Settings\\Network", 0, KEY_SET_VALUE, &hKey) != ERROR_SUCCESS) { printf("Failed to open registry key\n"); return 1; } // 修改注册表项的值 if (RegSetValueEx(hKey, "HideScanAssociations", 0, REG_DWORD, (BYTE*)&dwData, sizeof(dwData)) != ERROR_SUCCESS) { printf("Failed to set registry value\n"); RegCloseKey(hKey); return 1; } // 关闭注册表项 RegCloseKey(hKey); printf("Successfully hid WiFi list\n"); return 0; } 上述代码片段可以将WiFi列表隐藏,使其不再显示。通过以上操作,我们可以在C语言中使用Windows API函数来隐藏Windows WiFi列表。 ### 回答3: 要隐藏WindowsWiFi列表可以使用C语言来编写一个小程序来实现。具体实现的步骤如下: 1. 使用C语言编写一个Windows应用程序。你可以使用C语言中的WinAPI来处理Windows的网络设置。 2. 使用WinAPI中的函数来获取WiFi列表。可以使用函数`WlanEnumInterfaces`来获取当前系统中的无线网络接口列表。该函数需要调用头文件`wlanapi.h`并且要链接`wlanapi.lib`库文件。 3. 遍历WiFi列表,找到所需隐藏的WiFi网络。使用函数`WlanGetNetworkBssList`来获取当前无线网络接口的BSS(基础服务集)列表,然后遍历列表中的每一个BSS,通过比较SSID(服务设备标识符)来找到需要隐藏的WiFi网络。 4. 使用`WlanSetProfile`函数将需要隐藏的WiFi网络的配置文件从可见状态改为隐藏状态。可以创建一个XML格式的配置文件,然后通过函数`WlanSetProfile`来修改该配置文件中的`<connectionType>`节点的值为`hidden`。最后使用函数`WlanConnect`来更新网络连接。 5. 将编写好的C代码进行编译和构建,生成可执行文件。 6. 运行生成的可执行文件,即可隐藏WindowsWiFi列表。 需要注意的是,编写这样一个功能的程序需要具备一定的C语言编程Windows网络编程的知识,并且要了解WinAPI中相关的函数和数据结构。还需要确保程序有足够的权限来进行网络设置的修改。同时,对网络设置的修改也可能会造成一些不可预料的问题,建议在操作前备份重要数据以免造成损失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值