简易WiFi热点设置程序

虚拟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

窗体上的两个输入框用来在更改和设置虚拟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);
        }
    }
}