玩转VC++ 实现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++ 实现Wifi on与wifi off,布布扣,bubuko.com

时间: 2024-11-07 03:48:20

玩转VC++ 实现Wifi on与wifi off的相关文章

玩转VC++实现程序开机运行及注册表修改

 一.方案 要实现Windows程序开机运行,需要在注册表中相关位置加入键值.所谓的键可以是你程序的名称,值就是你程序的所在目录.所谓的相关位置有两处: 主键HKEY_LOCAL_MACHINE,Software\Microsoft\Windows\CurrentVersion\Run下. 主键HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Run下. 区别就是前者针对机器上所有用户,而后者只针对当前用户. 在编程中对

【智能家居篇】嵌入式WIFI与普通WIFI的区别

转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 既然我们这系列的文章名称为<智能家居篇>,那么我们有必要提出一个与智能家居相关的概念.曾经一次在TI的无线研讨会上,提及这个概念.究竟是TI提出的,还是其他无线厂家提出的,这个就不去深究了.这个概念就是嵌入式WIFI,也有叫WIFI的IoT(全称:Internet of Things)解决方案,那么它和普通的WIFI又有什么区别呢?请继续阅读下文.         1.嵌入式WIFI的来源 我们都知道笔记本.手

玩转VC++系统托盘程序(WIN8)

 WINDOWS系统托盘是一个特殊区域,通常在桌面的右下角,也就是任务栏的右边.系统常驻在托盘的程序有时钟,音量控制,输入法,网络状态等.第三方应用如QQ程序也是一个典型的托盘程序,当最小化时企鹅会乖乖的待在屏幕右下角等待主人的呼唤. 系统托盘的方便之处在于,程序在暂时不用时,将它放到托盘里,随用随叫,不必将其关闭.而QQ在接收到消息后,也会在托盘中闪动提示,十分人性化. 那么如何用VC++来开发托盘程序呢?下面会用一个例子来玩转WINDOWS托盘程序. 首先,定义一下需要的功能.(需求确定

玩转VC++实现CallBack

题目有点大,其实本文只是要DEMO一下用函数指针在VC++实现回调. 一.函数指针 那么什么是函数指针呢?说白了就是指向函数的指针,它是一个变量. 通常,函数会被编译为一段二进制机器码.每个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址. 可以把函数的这个首地址(入口地址)赋予一个指针变量,使该指针变量指向该函数. 那么就可以通过该指针变量就可以找到并且调用这个函数了. int (*p)();//声明一个指向返回值是整型的函数指针 void (*pf)();//声明一个指向返

esp8266-001 物联网/WiFi的概念/WiFi产生背景/

物联网的基本概念·英文名称:"lOT,The Internet of Things".由该名称可见,物联网就是"物物相连的互联网".定义:通过射频识别(RFID).红外感应器.全球定位系统.激光扫描仪等信息传感设备,按约定的协议,把任何物体与互联网相连接,进行信息交换和通信,以实现智能化识别.定位.跟踪.监控和管理的一种网络概念 WiFi简介: Wi-Fi的基本概念·Wi-Fi是一种可以将个人电脑.手持设备(如pad.手机)等终端以无线方式互相连接的技术,事实上它是

Android KitKat 4.4 Wifi移植之Wifi driver

本文讲述在Linux 3.10下Realek RTL8723A Linux Wifi 驱动的移植. Prerequisites 硬件平台:Atmel SAMA5 软件平台:Linux 3.10 + Android 4.4 Wifi模组:RTL8723AU (USB接口) Realtek RTL8723A Wi-Fi Software& Driver for Linux and Android RTL8723A_WiFi_linux_v4.1.6_7336.20130426_CCC02.zip 文

android wifi state and wifi ap state

/** * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if * it finishes successfully. * * @see #WIFI_STATE_CHANGED_ACTION * @see #getWifiState() */ public static final int WIFI_STATE_DISABLING = 0; /** * Wi-Fi

将小度WiFi改造为无线网卡(小度WiFi能够接收WiFi信号)

安装官方的小度WiFi的驱动器,只能让它当做无线信号的发射装置,但是我想通过小度WiFi让我的台式电脑能都接收无线信号,于是经过一番折腾终于成功了.我的是win7. 小度WiFi无法接受无线信号,不能像正常的无线网卡使用.于是就想出了一个办法:将小度WiFi改装成无线网卡.其实只要经过简单的修改就可以了. 1.安装官方的小度WiFi的驱动: 2.然后进入你的安装目录将drivers目录整个拷贝出来:drivers:链接: http://pan.baidu.com/s/1jIiCEdK 密码: 9

公共场所免费WIFI安全吗 WIFI密码隐患多

网络时代,很多人走进餐馆.咖啡厅第一件事就是询问WiFi密码.于是,"WiFi密探""WiFi伴侣""上网神器"等一批手机APP应运而生,号称出门在外不必询问密码,就能免费连上周围WiFi. 但真有白吃的"大餐"?虽然这类APP方便了大家在外上网,但业内专家提醒,使用这类APP面临着自家无线密码也被分享出去的风险,从而可能带来更多安全问题,且免费WiFi也是商家推送广告的一种手段,用户还需谨慎连接不明网络. 任何智能手机都可以