作者:faaronzheng 转载请注明出处!

最近宿舍wifi不知道为什么不稳定,经常电脑会断开连接,需要手动重连。而我又会整夜开着电脑下东西,十分蛋疼。所以我就小小的学以致用一下,写了一个简单地wifi断网自动重连工具,并且可以设置在断网超过一定时间后会自动关机。开发环境为win8+vs2012,亲测win8下可以连接路由器和connectify。连接时请注意正确选择认证方式和加密方式。但是即使配置正确也有一定可能因为路由器问题无法连接。

这个程序的实现其实很简单,下面是主要代码的实现。

主要用到了wininet.dll、managedwifi.dll、c#操作cmd、c#操作xml文件和多线程的知识。

wininet.dll主要是获得当前网络的连接状态。使用方法如下先导入wininet.dll

//检测网络状态
        [DllImport("wininet.dll", EntryPoint = "InternetGetConnectedState")]
        public extern static bool InternetGetConnectedState(out int conState, int reder);       //使用时直接调用InternetGetConnectedState(out int conState, int reder)函数。

我的使用是先定义int Desc = 0;

然后判断 if (InternetGetConnectedState(out Desc, 0))       //如果有网络连接会返回true

managedwifi.dll主要是用来获取所有无线wifi和对特定wifi进行连接。

         #region 枚举所有无线设备接收到的SSIDpublic List<WIFISSID> ScanSSID()                    //获取所有可用wifi{List<WIFISSID> wifiName = new List<WIFISSID>();        //用来保存wifi信息WlanClient client = new WlanClient();foreach (WlanClient.WlanInterface wlanIface in client.Interfaces){Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0);foreach (Wlan.WlanAvailableNetwork network in networks){WIFISSID targetSSID = new WIFISSID();    targetSSID.wlanInterface = wlanIface;targetSSID.wlanSignalQuality = (int)network.wlanSignalQuality;targetSSID.SSID = GetStringForSSID(network.dot11Ssid);                targetSSID.dot11DefaultAuthAlgorithm = network.dot11DefaultAuthAlgorithm.ToString();targetSSID.dot11DefaultCipherAlgorithm = network.dot11DefaultCipherAlgorithm.ToString();wifiName.Add(targetSSID);}}return wifiName;} #endregion
        #region 连接到指定的SSIDpublic void ConnectToSSID(WIFISSID ssid,Boolean isSave)      //连接指定wifi{                    string profileXml = string.Format("<?xml version=\"1.0\" encoding=\"US-ASCII\"?> <WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig> <connectionType>ESS</connectionType><connectionMode>auto</connectionMode><autoSwitch>false</autoSwitch><MSM><security><authEncryption><authentication>{1}</authentication><encryption>{2}</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>{3}</keyMaterial></sharedKey></security></MSM></WLANProfile>",name,authen,encry, pswd);ssid.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);ssid.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any,name);               if (isSave)                                             //是否需要保存{//xml文件操作XmlDocument doc = new XmlDocument();doc.Load("setting.xml");XmlNodeList nodeList = doc.SelectSingleNode("setting").ChildNodes;foreach (XmlNode xn in nodeList){XmlElement xe = (XmlElement)xn;if (xe.GetAttribute("ssid").Equals(name)){isAdded = true;}}if (!isAdded)                                     //是否已经存在                            {XmlOP xml = new XmlOP();xml.addXml(name, pswd);                      //将wifi名和密码写入xml文件}}     }#endregion

上面这段代码中最重要的是profileXml,不同的网络格式也会不尽相同,具体请参考

http://msdn.microsoft.com/en-us/library/windows/desktop/aa369853%28v=vs.85%29.aspx

c#操作cmd代码,这部分主要是实现关机和取消关机

        #region 调用Cmd  public void useCmd(string str){System.Diagnostics.Process process = new Process();//StartInfo获取或设置要传递给Process的Start方法的属性.为ProcessStartInfo类型process.StartInfo.FileName = "cmd.exe";//设置UseShellExecute以指定是否使用操作系统外壳程序启动进程process.StartInfo.UseShellExecute = false;//使进程从文件或其他设备获取输入process.StartInfo.RedirectStandardInput = true;//向文件或其他设备返回输出process.StartInfo.RedirectStandardOutput = true;process.StartInfo.CreateNoWindow = true;process.Start();//给命令行传入关机命令process.StandardInput.WriteLine(str);process.StandardInput.WriteLine("exit");process.Close();}#endregion

c#操作xml文件,xml文件主要是用来保存配置信息、wifi名和wifi密码。主要是因为我没用过xml所以就尝试一下。我觉得xml文件像一个树的结构。具体使用可以自行查找资料,还是十分简单的。

以下是我的实现代码.

    #region 创建xml文件public void creXml()    {XmlDocument doc = new XmlDocument();XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "gb2312", "yes");doc.AppendChild(dec);XmlElement elem1 = doc.CreateElement("", "setting", "");doc.AppendChild(elem1);XmlNode root = doc.SelectSingleNode("setting");XmlElement basic = doc.CreateElement("basic");basic.SetAttribute("timeout", "10");basic.SetAttribute("authen", "WPAPSK");basic.SetAttribute("encry", "AES");root.AppendChild(basic);           doc.Save("setting.xml");}#endregion
   #region 添加结点到xmlpublic void addXml(string SSID,string pswd)   {XmlDocument doc = new XmlDocument();doc.Load("setting.xml");XmlNode root = doc.SelectSingleNode("setting");XmlElement elem = doc.CreateElement(SSID);elem.SetAttribute("ssid", SSID);elem.SetAttribute("pswd", pswd);root.AppendChild(elem);doc.Save("setting.xml");}#endregion

这个程序也用到了多线程知识。除了主线程外还有重连线程、断网关机线程。

具体实现代码如下

    #region  重连线程public void AutoConThread(Boolean isSave){int Desc = 0;while (true){if (InternetGetConnectedState(out Desc, 0))       //有网络连接               {sw.Reset();                //重置时间continue;}else{AutoConFlag = true;sw.Start();                //开始计时Thread.Sleep(1000);}if (AutoConFlag){wifi.ConnectToSSID(targetSSID, isSave);             //连接wifiAutoConFlag = false;Thread.Sleep(60000);}Thread.Sleep(10000);}}#endregion
    #region 断网关机线程public void watchThread()                                        {while (true){if (Convert.ToInt32(sw.ElapsedMilliseconds) > time){timeout = true;}if (timeout){useCmd("shutdown -s -t 600");timeout = false;}Thread.Sleep(10000);}}#endregion

这些线程都是死循环一直运行的,这样的话启动后即使你关掉程序,但是线程还在继续工作,进程里还能看到程序在跑。一个很好地解决办法就是把这些线程设置为后台线程,这样的话关闭应用程序后线程也会结束。

  autoConnect = new Thread(()=>state.AutoConThread(isSave));autoConnect.IsBackground = true;                 //设置线程为后台进程//System.Environment.Exit(0); 也可以起到退出后程序完全关闭的效果autoConnect.Start();

源代码下载:

http://download.csdn.net/detail/faaronzheng/7250515

发现bug或有好的改进请告诉我,大家共同学习。

Wifi断网自动重连相关推荐

  1. 电脑开机自动登录,断网自动重连以及桌面联网小程序

    对于需要拨号连接联网的公司企业和学校,每次开机都需要点一下弹出的连接对话框,才能让电脑联网,有没有什么方法无需用户进行任何操作就能自动联网呢?在远程办公时,办公室偶尔会出现断网的情况,远程软件也无法使 ...

  2. WIN10 电脑设置自动拨号联网任务,实现开机、断网自动重连

    1.打开"计算机管理" 使用组合键 win + X 唤出系统菜单,点击 计算机管理 . 2.打开"任务计划程序" 3.创建自动联网任务 ① 点击 创建基本任务 ...

  3. windows 任务管理器实现拨号断网自动重连

    windows 任务管理器实现拨号断网自动重连 打开任务管理器 测试任务执行情况 打开任务管理器 右键计算机->管理 任务计划程序->创建基本任务 名称和描述方便自己记忆即可 完成如图点击 ...

  4. 江西理工大学校园网开机自动连接,断网自动重连

    一.打开网页,但是先不登录 二.F12打开开发者工具,点击网络,勾选保留日志(防止日志丢失) 三.登录账号,观察连接后日志的变化 根据user_account及password的值可知,这是我们登录的 ...

  5. win10宽带连接断网自动重连

    文章目录 1. 断开网络连接,重命名网络连接 2. bat代码:检测到断线自动重连 3. 设置开机自动执行 3.1 方式一:任务计划程序 3.2 方式二:用vbs代码开机运行bat 1. 断开网络连接 ...

  6. windows 断网自动重拨

    原理 大家都喜欢用 ping IP 来检测网络是否连通,断网检测也是基于这个原理,通过返回的内容来判断是否断网,然后启动拨号程序就可以了. 代码 @echo off :start ping -n 2 ...

  7. 【软路由】openwrt 断网自动重连拨号

    实现原理 定时ping两个外网IP,如果连续N次都ping不通,则用 ifup wan 重启网卡重新拨号 文件及目录 ping检测脚本:/root/ping/ping.sh 守护脚本:/root/pi ...

  8. win11断网自动重启

    前言 远程办公需要. 办公电脑没密码,开机后会自动联网,所以每次断网后联一下重启一下就好了 . 除了要求没密码外,还需要要求电脑的电源设置为从不睡眠: 一. 批处理脚本 功能:电脑一直不关机,6~7点 ...

  9. openwrt 断网 自动重启网络

    路由器偶尔会自动断网,但是进去路由器发现网络正常,网上查找资料发现应该是运营商更新了,但是路由器没有更新,网上搜了个脚本能解决这个问题,做个备忘. #!/bin/sh tries=0 logger & ...

最新文章

  1. img 在video上面_HTML,img,video无法铺满屏幕解决方法,同视频做网页背景无法全屏的解决方法...
  2. Python【每日一问】36
  3. 乱乱乱!那些惨不忍睹的机房布线
  4. Linux学习之十二-Linux文件属性
  5. 微软HTTP API指南
  6. 如何给柱状图柱子添加阴影_【LeetCode日记】84. 柱状图中最大的矩形
  7. php调用接口搜索的网页源代码,PHP用户管理中常用接口调用实例及解析(含源码)...
  8. 【Python笔记】元组的用法
  9. java se下载完怎么启动_【Java SE】如何安装JDK以及配置Java运行环境
  10. 深入探索 Android 包体积优化(匠心制作)
  11. unity NOPI 创建word文档
  12. python自动化测试工程师面试题(转载师傅:上海悠悠)
  13. 进销存系统设计说明书
  14. 【Mongodb】常用的一些功能
  15. HBuilderX 打包问题
  16. Playfair Crack
  17. JINI学习笔记2-HelloWorld
  18. web前端框架——Vue的特性
  19. 商用密码产品及对应规范介绍
  20. SPARQL 使用教程

热门文章

  1. java异常和错误共有的超类为Throwable
  2. mysql安装时卡在starting server的解决方法
  3. 几种黑白相间的棋盘实现方法
  4. Windows驱动_WFP之三Callout驱动的操作
  5. DaoCloud道客:云原生多云应用利器-Karmada控制器
  6. 学校计算机的使用英语作文180字,我的梦想高中英语作文180字
  7. linux socket send函数和recv函数详解以及修改缓冲区大小
  8. Python--根据计算公式:BMI = 体重(kg) / 身高(m)^2判断身体状况
  9. 频繁项集挖掘算法在告警关联中的应用
  10. C++ 基础知识(二)变量 HINSTANCE、HWND、HDC