VC++玩转Native Wifi API 2---Wifi on与wifi off
有心栽花花不开,无心插柳柳成排。
今天要说的这个wifi on\off是在软件层面控制无线网卡的开和关。
问题听起来简单,调查起来复杂。但解决起来却也简单。关键函数便是Native wifi api中的WlanSetInterface。事实上这个API功能也是非
常强大的,我仅仅用到当中控制wifi radio state的功能。官网文档在此。
函数原型:
DWORD WINAPI WlanSetInterface(
_In_ HANDLE hClientHandle,
_In_ const GUID *pInterfaceGuid,
_In_ WLAN_INTF_OPCODE OpCode,
_In_ DWORD dwDataSize,
_In_ const PVOID pData,
_Reserved_ PVOID pReserved
);
重点说一下三个參数:
1. OpCode,指定要设置的參数。
我们选择wlan_intf_opcode_radio_state
2. DwDataSize,pData的size。传入时用sizeof得到。
3. pData,radio state相应的data是WLAN_PHY_RADIO_STATE。
看看这个state结构体:
typedef struct _WLAN_PHY_RADIO_STATE {
DWORD dwPhyIndex;
DOT11_RADIO_STATE dot11SoftwareRadioState;
DOT11_RADIO_STATE dot11HardwareRadioState;
} WLAN_PHY_RADIO_STATE, *PWLAN_PHY_RADIO_STATE;
Index设为0.
State设置例如以下:
typedef enum _DOT11_RADIO_STATE {
dot11_radio_state_unknown,
dot11_radio_state_on,
dot11_radio_state_off
} DOT11_RADIO_STATE, *PDOT11_RADIO_STATE;
与前几个API(比方wlanconnect)相比,这个函数的使用简单多了。所有源代码例如以下:
// ManageWirelessNetwork.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <shellapi.h>
#include <wlanapi.h> // Need to link with shell32.lib
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "wlanapi.lib") int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwResult = 0;
DWORD dwMaxClient = 2;
DWORD dwCurVersion = 0;
HANDLE hClient = NULL;
PWLAN_INTERFACE_INFO_LIST pIfList = NULL;
PWLAN_INTERFACE_INFO pIfInfo = NULL; dwResult = WlanOpenHandle(dwMaxClient, NULL, &dwCurVersion, &hClient);
if (dwResult != ERROR_SUCCESS) {
wprintf(L"WlanOpenHandle failed with error: %u\n", dwResult);
return false;
} dwResult = WlanEnumInterfaces(hClient, NULL, &pIfList);
if (dwResult != ERROR_SUCCESS) {
wprintf(L"WlanEnumInterfaces failed with error: %u\n", dwResult);
return false;
} WLAN_PHY_RADIO_STATE state;
state.dwPhyIndex = 0;
state.dot11SoftwareRadioState = dot11_radio_state_on;
PVOID pData = &state; dwResult = WlanSetInterface(hClient,&pIfList->InterfaceInfo[0].InterfaceGuid,
wlan_intf_opcode_radio_state,sizeof(WLAN_PHY_RADIO_STATE),pData,NULL); if(dwResult == ERROR_SUCCESS)
{
wprintf(L"set state success!\n");
}
else
{
wprintf(L"set state failed!err is %d\n",dwResult);
} return 0;
}
后记:
事实上几个月前就要实现windows上的wifi on和off,问了很多人。发了很多帖子。最后都不了了之。之后的日子里也发生了很多事。国内的
搜索无果。加上google的无法使用,都对调查添加了些许难度。
我们把重点先放到了native wifi api的几个方法。见上一篇玩转文章。但
那并非我想要的。
原以为windows也会想android一样,普通应用没有权限来控制wifi的开关呢,结果并非这样。这也宣告了之前我的推断失误。
直到今天,通过Bing发现了几条线索。那是通过C#调用native wifi api的问题,里面提及了之前并没有重视的wlansetinterface。
Interface,在这里我认为能够理解成无线网卡。类似的WlanEnumInterfaces中实现的功能是罗列出当前无线网卡。
无线网卡的设置。当中有一项是radio的状态。
果然,这一切都有了了断。
VC++玩转Native Wifi API 2---Wifi on与wifi off的更多相关文章
- Native Wifi API
原文链接地址:https://www.cnblogs.com/jackcin/p/3285357.html 在windows平台下,可以使用native wifi api来控制无线网卡,包括获取无线网 ...
- C#编程使用Managed Wifi API连接无线SSID
C#编程使用Managed Wifi API连接无线SSIDhttp://www.2cto.com/kf/201307/227623.html Managed Wifi API - Homehttp: ...
- Java JVM、JNI、Native Function Interface、Create New Process Native Function API Analysis
目录 . JAVA JVM . Java JNI: Java Native Interface . Java Create New Process Native Function API Analys ...
- Android WiFi开发教程(一)——WiFi热点的创建与关闭
相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机.平板电脑和笔记本电脑都支持Wi-Fi上网.因此,掌握基本的WiFI开发技术是非常必要的.本教程将围绕一个小D ...
- 漫谈可视化Prefuse(四)---被玩坏的Prefuse API
这个双12,别人都在抢红包.逛淘宝.上京东,我选择再续我的“漫谈可视化”系列(好了,不装了,其实是郎中羞涩...) 上篇<漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有 ...
- Jboss EAP:native management API学习
上一节已经学习了CLI命令行来控制JBOSS,如果想在程序中以编码方式来控制JBOSS,可以参考下面的代码,实际上在前面的文章,用代码控制Jboss上的DataSource,已经有所接触了,API与C ...
- 如何使用Native Messaging API 打开window程序
问 如何使用Native Messaging API 打开window程序 cmd javascript terminal chrome Tychio 2013年03月26日提问 关注 1 关注 收藏 ...
- node-webkit教程<>Native UI API 之Menu(菜单)
node-webkit教程(6)Native UI API 之Menu(菜单)1 前言... 2 6.1 Menu 概述... 3 6.2 menu api6 6.2.1 new Menu([o ...
- 360随身wifi怎样购买?360随身wifi怎样预约?
---恢复内容开始--- 360随身wifi怎样购买 想要购买360随身Wifi,可以登录360随身Wifi的官网wifi.360.cn,或者直接登陆京东商城进行购买,售价为19.9元,分黑.白两色. ...
随机推荐
- JQuery 使用.show()和.hide()做的可爱动画
只是最基本的东西,没啥稀奇的,只是今天看jquery教程的时候偶然看到show()和hide()是可以写两个参数的, 第一个参数是元素隐藏/显示的速度(单位:毫秒),另一个是一个function类型. ...
- 生成器模式(Builder)C++实现
意图:将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性:1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 2.当构建过程必须允许被构建的对象有 ...
- python--3、 可迭代对象、迭代器、生成器
可迭代对象 iterable 可直接作用于for循环的对象统称为可迭代对象. 有 list. dict.tuple.set.str等数据类型,还有 generator(包括生成器和带yield的gen ...
- 设计模式之桥接模式(Java语言描述)
桥接模式定义 將抽象部分与它的具体实现部分分离,使它们都可以独立地变化.它是一种对象结构型模式,又称为柄体模式或接口模式. Decouple an abstraction from its imple ...
- mysql 导入数据库时,报错1840的解决方法
1.现象 在mysql用sql文件导入数据库时,提示ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @ ...
- ★Java面向对象(一)——————————基本概念
package boll; /* 用Java语言对现实生活中的事物进行描述. 通过类的形式来体现, 怎么描述呢? 对于事物的描述通常只有两个方面,一个是属性,一个是行为. 只要明确该事物的行为和属性并 ...
- 复习java基础第二天(异常处理)
一.常见的异常类型: public class TestException { public static void main(String[] args) { int i = 10; //数学异常: ...
- ANN:DNN结构演进History—RNN
前言: CNN在图像处理领域的极大成功源于CNN的二维递进映射结构,通过训练多层卷积核来进行特征提取函数训练,在二维图像的稀疏表达和语义关联分析方面有天生的结构优势.而涉及时序问题的逻辑序列分析-边长 ...
- jquery的attr和prop
注意不同版本的attr和prop,attr适用于自定义dom值,prop适用于带有固有属性
- servlet_获取初始化参数
在web.xml的<servlet>标签中增添 <init-param> <param-name>XXX</param-name> <param- ...