虚拟WiFi
从Windows 7开始,微软的操作系统内建了对虚拟WiFi的支持。一般来说,我们可以使用两种方式来开启该功能:命令提示符或者第三方软件。这两种方式各有优缺点,第三方软件比如Connectify,功能强大齐全,但是不知道为什么在我的联想Y470上反应非常慢。所以我一般使用第二种方式——命令提示符。
使用命令提示符来启动虚拟WiFi
在命令提示符下,开启虚拟WiFi的步骤可以分为:
1.使用管理员权限启动命令提示符cmd.exe
2.建立虚拟WiFi
netsh wlan set hostednetwork mode=allow ssid=NameString key=KeyString
其中mode=disallow可以禁用虚拟WiFi,ssid表示热点名称,key则为连接到热点的密码。
3.设置连接源
打开控制面板,按照 控制面板 => 网络和 Internet => 网络连接的顺序打开,你会发现多了一个Microsoft Virtual WiFi Miniport Adapter。按照你的信号源(如果连有线的就选本地连接,连无线的就选无线网络连接),右键属性 => 共享 勾选第一个选项,然后在下拉列表中选择那个多出来的无线网络连接。
4.开启虚拟WiFi
netsh wlan start hostednetwork
5.关闭虚拟WiFi
netsh wlan stop hostednetwork
可以想见,如果每次都要输入这么繁琐的命令真的比较麻烦,所以一个比较简单的方法是将上述命令分别写到bat文件中,用来批处理执行就好了。
窗体
总体来说桌面上放几个bat文件还是不美观的,所以写了一个简单的Windows Form窗体程序来包装这几个命令。程序的原理也比较简单,无非就是 cmd 的二次调用加上输入流、输出流和错误流的重定向而已。上一张图:
窗体上的两个输入框用来在更改和设置虚拟WiFi的SSID和连接密码。显示信息可以显示出连接的连接设备数目等信息。开启和关闭分别对应start和stop命令,禁用会删除虚拟的无线连接。最后说说这个输出面板,这是用来显示 cmd 中的输入信息,但是不能从这里输入。
源代码
Command.cs
接受一个命令字符串来对 cmd 进行二次调用。
using System.Collections.Generic;
using System.Diagnostics;
namespace VirtualWiFi
{
internal class Command
{
public static string RunCMD(List<string> commands)
{
var p = new Process();
//设定程序名;
p.StartInfo.FileName = "cmd.exe";
//关闭shell的使用;
p.StartInfo.UseShellExecute = false;
//cmd窗口不显示;
p.StartInfo.CreateNoWindow = true;
//重定向标准输入、输出、错误输出;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
foreach (string command in commands)
{
p.StandardInput.WriteLine(command);
}
p.StandardInput.WriteLine("exit");
//读取返回信息;
return p.StandardOutput.ReadToEnd();
}
}
}
Form1.cs
负责响应按钮事件。
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace VirtualWiFi
{
public partial class Form1 : Form
{
private readonly string allow;
private readonly string disallow;
private readonly string show;
private readonly string start;
private readonly string stop;
public Form1()
{
InitializeComponent();
show = @"netsh wlan show hostednetwork";
start = @"netsh wlan start hostednetwork";
stop = @"netsh wlan stop hostednetwork";
allow = @"netsh wlan set hostednetwork mode=allow";
disallow = @"netsh wlan set hostednetwork mode=disallow";
}
private void buttonOK_Click(object sender, EventArgs e)
{
if (textBox1.Text == null || textBox1.Text.Length == 0 ||
textBox2.Text == null || textBox2.Text.Length == 0)
{
MessageBox.Show("SSID以及密码不可为空!");
return;
}
string setting = allow + " ssid=" + textBox1.Text + " key=" + textBox2.Text;
var commands = new List<string>();
commands.Add(setting);
commands.Add(show);
Command.RunCMD(commands);
}
private void radioButtonStart_CheckedChanged(object sender, EventArgs e)
{
var commands = new List<string>();
commands.Add(start);
textBox3.Text = Command.RunCMD(commands);
}
private void radioButtonStop_CheckedChanged(object sender, EventArgs e)
{
var commands = new List<string>();
commands.Add(stop);
textBox3.Text = Command.RunCMD(commands);
}
private void buttonDisplay_Click(object sender, EventArgs e)
{
var commands = new List<string>();
commands.Add(show);
textBox3.Text = Command.RunCMD(commands);
}
private void buttonForbidden_Click(object sender, EventArgs e)
{
var commands = new List<string>();
commands.Add(disallow);
textBox3.Text = Command.RunCMD(commands);
}
}
}