WiFiAssistant 无线承载网络设置助手的开发历程(一)

2023-11-16

今年6月中旬,我曾经基于MFC写过一个WiFiHelper的小程序,开启和关闭虚拟WiFi,并且能够支持定时关机,当然,真正使用虚拟WiFi还需要手动设置共享。并且,由于我的是台式机,所以并没有去升级WiFiHelper。

估计是即将毕业的缘故,总想做出一些比较有意思的软件,让人看到我的水平,也就不停的Coding,每次给我妈打电话,也就是说在写代码,事实上,也是经常在写代码。

最开始写WiFiHelper 的时候,纯粹是为了帮助朋友们简便的开启和关闭WiFi,笔记本开启了WiFi,如果关机了,那么肯定就没有WiFi了,但是一直开着,笔记本也得休息一下不是,很多人使用计算机,只会简单的玩游戏登QQ,不要高估用户的操作能力,想想看Linux确实高估了。所以,很多人都不会使用shutdown设置定时关机,于是我便在WiFiHelper中添加了定时关机的功能,反正加起来都是支持封装命令(netsh shutdown),并使用管道获取信息输出。

9月份,那个时候Windows8.1出来了,很多人开始装8.1,我就决定写一个USB启动盘制作工具;以前发表过Blog:如何开发一款USB启动盘制作工具 被OSChina推荐过,那次写代码的经历让我学会了Win32 API的窗口编程的流程和细节,最早完全掌握Win32编程是利用超类化修改了Edit控件,因为默认的记事本的菜单不太习惯,所以就自己超了下,子类化因为没掌握好就没有使用。

1 WNDCLASSEX PreEditEx;
2  ZeroMemory(&PreEditEx,sizeof(PreEditEx));
3  PreEditEx.cbSize=sizeof(WNDCLASSEX);
4  GetClassInfoEx(0,L"EDIT",&PreEditEx);
5  OldEditWndProc=PreEditEx.lpfnWndProc;
6  PreEditEx.lpfnWndProc=PreEditExWndProc;
7  //PreEditEx.lpszMenuName=
8  PreEditEx.lpszClassName=L"PreEditControl";
9  RegisterClassEx(&PreEditEx);

OldEditWndProc是函数指针,用来保留老的窗口处理函数

1 LRESULT (CALLBACK* OldEditWndProc)(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
最后就是自己写窗口函数 
001 LRESULT CALLBACK PreEditExWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
002 {
003    //PAINTSTRUCT ps;
004    //HDC hdc;
005    //RECT rt;
006    //HGDIOBJ oldPen;
007    int mId,mEvent;
008    switch (uMsg)
009    {
026    case WM_COMMAND:
027        mId    = LOWORD(wParam);
028        mEvent = HIWORD(wParam);
029        switch(mId)
030        {
031        case IDM_EDIT_UNDO:
032            SendMessage(hWnd,EM_UNDO,0,0L);
033            break;
034        case IDM_EDIT_COPY:
035            SendMessage(hWnd,WM_COPY,0,0L);
036            break;
037        case IDM_EDIT_PASTE:
038            SendMessage(hWnd,WM_PASTE,0,0L);
039            break;
040        case IDM_EDIT_CUT:
041            SendMessage(hWnd,WM_CUT,0,0L);
042            break;
043        case IDM_EDIT_SELECTALL:
044            SendMessage(hWnd, EM_SETSEL, 0, -1);
045            SendMessage(hWnd,EM_SCROLLCARET,0,0L);
046            //SendMessage(hWnd,
047            break;
048        case IDM_EDIT_CLEAR:
049            SendMessage(hWnd,WM_CLEAR,0,0L);
050            break;
051        case IDR_SETTING:
052            DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_SETBOX), hWnd, OpenOpDlg);
053            break;
054        case IDR_UPDATA:
055            {
056                MessageBox(NULL,L"Alt+F2 is Update",L"Alt+F2",MB_OK);
057                //std::
058            }
059            break;
060        case IDM_CLEAR_UI:
061            {
062                SetWindowText(hWnd,L"");
063                //WCHAR IJI[5695222]=L"0";
064                //GetWindowText(hWnd,IJI,5695222);
065                //ClearCommandUI(L"PreEditControl",IJI);
066            }
067            break;
068        case IDI_RESTART:
069            RestartShell();
070            break;
071        case IDR_EXIT:
072            PostQuitMessage(0);
073            break;
074        default:
075            break;
076        }
077        break;
078    case WM_PAINT:
079        break;
080    case WM_RBUTTONUP:
081        {
082            //GetFocus
083            //RECT rect;
084            POINT pt;
085            GetCursorPos(&pt);
086            //rect.left=pt.x;rect.right=pt.y;
087            HMENU EditMenu=LoadMenu(GetModuleHandle(nullptr),MAKEINTRESOURCE(IDR_MENU_POPU));
088            HMENU PopuMenu=GetSubMenu(EditMenu,0);
089            if(SendMessage(hWnd,EM_CANUNDO,0,0))
090            {
091                EnableMenuItem(PopuMenu,IDM_EDIT_UNDO,MF_ENABLED);
092            }
093            else
094            {
095              EnableMenuItem(PopuMenu,IDM_EDIT_UNDO,MF_GRAYED);
096            }
097            long long n=0,m=0;
098            SendMessage(hWnd,EM_GETSEL,(WPARAM)&n,(LPARAM)&m);
099            if(n==m)
100            {
101                EnableMenuItem(PopuMenu,IDM_EDIT_CLEAR,MF_GRAYED);
102                EnableMenuItem(PopuMenu,IDM_EDIT_COPY,MF_GRAYED);
103                EnableMenuItem(PopuMenu,IDM_EDIT_CUT,MF_GRAYED);
104            }
105            else
106            {
107                EnableMenuItem(PopuMenu,IDM_EDIT_CLEAR,MF_ENABLED);
108                EnableMenuItem(PopuMenu,IDM_EDIT_COPY,MF_ENABLED);
109                EnableMenuItem(PopuMenu,IDM_EDIT_CUT,MF_ENABLED);
110            }
111                EnableMenuItem(PopuMenu,IDM_EDIT_SELECTALL,MF_BYCOMMAND|MF_ENABLED);
112            //wstring ClipText;
113            if(OpenClipboard(hWnd))
114            {
115                if(GetClipboardData(CF_TEXT))
116                {
117                    EnableMenuItem(PopuMenu,IDM_EDIT_PASTE,MF_ENABLED);
118                }
119                else
120                {
121                    EnableMenuItem(PopuMenu,IDM_EDIT_PASTE,MF_GRAYED);
122                }
123                CloseClipboard();
124            }
125            else
126            {
127                EnableMenuItem(PopuMenu,IDM_EDIT_PASTE,MF_GRAYED);
128                CloseClipboard();
129            }
130            if(GetWindowTextLength(hWnd)==0)
131            {
132                EnableMenuItem(PopuMenu,IDM_EDIT_SELECTALL,MF_GRAYED);
133            }
134            else
135            {
136                if(GetWindowTextLength(hWnd)==(m-n)||m-n==-1)
137                    EnableMenuItem(PopuMenu,IDM_EDIT_SELECTALL,MF_GRAYED);
138                else
139                    EnableMenuItem(PopuMenu,IDM_EDIT_SELECTALL,MF_ENABLED);
140            }
141            //HiliteMenuItem(hWnd,PopuMenu,IDI_RESTART,MF_BYCOMMAND|MF_HILITE);
142            //WCHAR st[10]={'0'};
143            //wsprintf(st,L"ST=: %d",x);
144            //MessageBox(NULL,st,L"Text Long",MB_OK);
145           //if(SendMessage(hWnd,WM_,CF_TEXT,0)
146            //InsertMenu(PopuMenu,IDR_SETTING,MF_ENABLED,IDM_ECUT,L"PASTE");
147            TrackPopupMenuEx(PopuMenu,TPM_RIGHTBUTTON,pt.x,pt.y,hWnd,NULL);
148        }
149        return 0;
150    case WM_SETFONT:
151        //MessageBox(NULL,L"Font",L"Setting Font",MB_OK);
152        UpdateWindow(hWnd);
153        break;
154    //case WM_CREATE:
155    case WM_SYSKEYDOWN:
156        switch(wParam)
157        {
158     case VK_F1:
159                if(GetKeyState(VK_MENU)<0)
160                     DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_SETBOX), hWnd, OpenOpDlg);
161                break;
162     case VK_F2:
163         if(GetKeyState(VK_MENU)<0)
164         {
165             //MessageBox(NULL,L"Alt+F2 is Update",L"Alt+F2",MB_OK);
166             SendMessage(hWnd,WM_COMMAND,IDR_UPDATA,0);
167         }
168         break;
169        case VK_F3:
170            if(GetKeyState(VK_MENU)<0)
171                RestartShell();
172                break;
173        default:
174            break;
175        }
176    case WM_KEYDOWN:
177        {
178            switch(wParam)
179            {
180            case 'A':
181                if(GetKeyState(VK_CONTROL)<0)
182                {
183                    //MessageBox(NULL,L"Select All",L"Ctrl+A",MB_OK);
184                    int start=0,end=0;
185                    SendMessage(hWnd,EM_GETSEL,(WPARAM)&start,(LPARAM)&end);
186                    if(GetWindowTextLength(hWnd)==(end-start)||end-start==-1)
187                            ;
188                        else
189                            SendMessage(hWnd,EM_SETSEL,0,-1);
190                }
191                break;
192            case VK_BACK:
193                MessageBeep(MB_OK);//Test
194                break;
195            default:
196                break;
197            }
198        }
199        break;
200    case WM_KEYUP:
201        {
202            switch(wParam)
203            {
204                /*http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx wParam Virtual Key Value! */
205            case VK_RETURN:
206            MessageBeep(MB_OK);
207            break;
208            default:
209                break;
210            }
211        }
212        break;
213       // break;
214 }
215 return CallWindowProc(OldEditWndProc,hWnd, uMsg, wParam, lParam);
216 }
一定不要忘记最后调用旧的窗口处理函数,特定消息必须截断不然会调用默认消息,你的努力就白费了。 

好吧说到这里有点偏了,这个超类化的经历与WiFiAssistant很重要,首先,用户面对的是一个界面,
以这个界面为例,我给用户提供了以下几个功能:
1.一键开启虚拟WiFi,这个会随机产生随机字符串作为用户名和密码,
2.关闭WiFi
3.开启WiFi
4.显示密码
5.取消定时关机
6.定时关机
7.获取管理员权限

如果要随机产生字符串,一般的方法是先设置一个常字符串数组,里面的字符一般是从a开始的ANSI字符,我的模板是:

1 const WCHAR* cstr= L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@#$%^&*()-=_+,./;\"'<>?~|";

再初始化随即种子srand((unsigned int) GetTickCount());
这里是选取的系统启动的毫秒数,最后使用随机rand()产生随机数,除以常字符串的大小取余,再获取常字符串cstr[i],这里i就是余数,因为C++ string更加好用,所以整个函数最终用string实现,如下:

01 bool GetRandStringUserOrPwd(PWSTR wstr, UINT Size)
02 {
03     const std::wstring templetstr= L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@#$%^&*()-=_+,./;\"'<>?~|";
04     UINT i, lstr;
05     UINT k;
06     std::wstring produce;
07     lstr = (UINT)templetstr.size();
08     srand((unsigned int) GetTickCount());
09     for (i = 1; i < Size; i++)
10     {
11         k = rand() % lstr;
12         produce += templetstr.substr(k,1);
13          
14     }
15     wcscpy_s(wstr, Size, produce.c_str());
16     //MessageBox(NULL, produce.c_str(), L"Test", MB_OK);
17     return true;
18 }
我习惯用MessageBox测试程序,当我运行GetRandStringUserOrPwd,开启MessageBox,用户名和密码随机产生获得不一样的结果,但是注释掉MessageBox后,二者的随机数值确是一样,虽然我们选取的是计算机的启动时间,以毫秒计,但是计算机的运行速度是非常快的,所以在产生用户名随机数后,我添加了一段代码: 
1 Sleep(500);
没错就是让它休息一下,500毫秒虽然能够感觉出来,但是对于随机生成的用户名和密码造成差异还是可取的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WiFiAssistant 无线承载网络设置助手的开发历程(一) 的相关文章

随机推荐

  • leetcode目录

    最近写的题目还没有填到本目录中 可以在去文章列表查看 本目录正在持续更新中 题目 考点 时间 分值 最大利润 贪心算法 2023 Q1 100 施肥问题 逻辑推理 2023 Q1 100 组装数组 深度优先搜索 2023 Q1 200 开租
  • android Button背景高度被拉伸问题--解决方案

    接入第三方SDK后 发现SDK提供的弹窗里 有两个按钮的高度呈被拉伸状态 而 第三方提供的demo内 这两个按钮均呈正常状态 对于第一次接触Android的菜鸟来说 这个问题颇为难解 第三方在尝试了几种方法之后 也宣告失败 这种奇葩问题 让
  • element项目中遇到的小问题总结

    在用element UI框架做项目时遇到的问题 现在总结记录下来 此文档持续更新中 1 日期选择器el date picker赋值后再次修改时页面不回显
  • JS逆向进阶案例

    前情回顾 有道翻译参数破解 百度翻译参数破解 之前 我们介绍了两种基础的JS逆向案例 今天 就继续来分享一个稍微复杂的JS逆向案例吧 目录 一 寻找加密源码 二 查漏补全JS代码 三 全部代码 爬取网址 某网站 本次爬取仅供学习 无任何商业
  • Mac上安装双系统

    写在前面 Mac用户在使用过程中 多少有的时候还会使用Windows 想装一个咋办 找某宝需要花钱150元 看这篇文章 十几分钟看明白 自己动手丰衣足食 所以本文将以图文教程教你如何安装双系统 开机随意选择 想用什么用什么 尽管我不是很喜欢
  • FFmpeg 采用源码安装 、环境配置、卸载

    https blog csdn net qq 36397240 article details 107745149 FFmpeg 采用源码安装 环境配置 卸载 验证了几种ffmpeg x264安装方法 这篇文章清晰简洁 特别是对环境配置介绍
  • AES(加密,填充,模式)新手小结

    本小结的密码学术语如填充 模式 等等 均以AES为例进行说明 举一反三 其他算法涉及的相同术语 大致也就理解是怎么回事了 吧 1 AES https nvlpubs nist gov nistpubs FIPS NIST FIPS 197
  • 【电子电路】五款单按键开关机电路图

    一 单按键开关机电路图 本例电路可实现通过按一次按键S1实现开机 再按一次S1实现关机的功能 整个电路的工作过程 电路中连接器P1是一个电源连接器 电源 从1 2脚输入 电源地从3 4脚输入 电路上电后 P MOS管Q1的G极和S极都是为高
  • Matatalab:编程只是大人的专利?这款儿童实物编程机器人了解一下

    转自 http www sohu com a 294483601 485557 创始人 https www tianyancha com brand b5813253827 CEO 苏荣星 MatataLab CEO 曾任职 mBot Ra
  • 基于入侵杂草算法的函数寻优算法

    文章目录 一 理论基础 1 算法简介 2 杂草特性 二 案例背景 1 问题描述 2 解题思路及步骤 1 初始化种群 2 繁殖 3 空间分布 4 竞争性排斥规则 3 算法流程 三 MATLAB程序实现 1 清空环境变量 2 问题设定 3 参数
  • 用matlab计算超调,怎样用matlab计算超调量、峰值时间

    2018 01 19 Intel Xeon E5 2697 v2的CPU的峰值计算能力和Intel Xeon E7 8870的CPU的峰值计算能力哪个强 必然Xeon E5 2697 v2运算能力强 首先 看核心数 Xeon E5 2697
  • 动态环境下基于强化学习的无人机任务路径规划

    路径规划主要是指无人机环境中存在威胁障碍物 然后 规划无人机从起点到目的地避开障碍物的最佳路线也是无人机实现自主飞行的主要因素之一 在无人机的任务分配中 主要目的是增强无人机的时间性能和环境适应性 对于无人机的路径规划水平 修改和改进算法可
  • STL--map的应用

    STL之map的应用 map定义及用途 map翻译为映射 是STL中的常用容器 其实 数组就是一种映射 比如 int a 100 就是定义了一个int到int的映射 而a 5 25 就是把5映射到25 数组总是将int类型映射到其它基本类型
  • oracle优化-----监控指标

    author skatetime 2010 03 24 昨天一个朋友问我 如何优化数据库 在想优化数据库前 首先要确认数据库是否需要优化 这就需要一些监控指标了 如 事务响应时间 数据库的逻辑读 数据库的物理读 物理写等 日常监控这些指标
  • GetProcAddress错误码127

    表现为明明loadLibrary GetProcAddress就是拿不到地址 原因是C语言的函数使用C 编译时需要加上extern C 转载于 https www cnblogs com Jacket K p 11574624 html
  • 十个经典免费软件和五★级网站!

    十个经典免费软件和五 级网站 软件非常实用 都是 免费版本 ghost 诺顿杀毒 等经典软件哪里皆可下载到 就没列出 推荐的网站则是very出色实用 lt 一 gt 软件 1 代理甭猎手 v1 0 179 KB 绿色 推荐指数 介绍 全称是
  • 【目标检测之数据集预处理】继承Dataset定义自己的数据集【附代码】

    在深度学习训练中 除了设计有效的卷积神经网络框架外 更重要的是数据的处理 在训练之前需要对训练数据进行预处理 比如在目标检测网络训练中 首先需要划分训练集和测试集 然后对标签 边界框等进行处理后才能送入网络进行训练 本文章以VOC数据集格式
  • 【设计模式学习】11种高频设计模式之建造者模式

    文章目录 相关介绍 代码介绍 常规用法 静态内部类方法 系列文章目录 参考资料 相关介绍 1 定义 将一个复杂对象的构建与它的表示分离 使得同样得构建过程可以创建不同得表示 2 作用 在用户不知道对象得建造过程和细节的情况下就可以直接创建复
  • MySQL server has gone away

    一 可能是mysql连接超时 原因 mysql长连接时 很长时间没有新的请求发起到达服务端 当这个时间超过配置的最大超时时间时 mysql就会强行关闭链接 此后再通过这个connection发起查询的时候 就会报错server has go
  • WiFiAssistant 无线承载网络设置助手的开发历程(一)

    今年6月中旬 我曾经基于MFC写过一个WiFiHelper的小程序 开启和关闭虚拟WiFi 并且能够支持定时关机 当然 真正使用虚拟WiFi还需要手动设置共享 并且 由于我的是台式机 所以并没有去升级WiFiHelper 估计是即将毕业的缘