13.MFC实现U盘小偷程序:多线程与界面开发

1.前言

本文将带领大家来写一个U盘小偷的项目。

事实上,我已经写过一篇关于控制台版本U盘小偷的文章,可以参考这篇文章:手写一个U盘小偷

这篇文章里面涉及到的很多东西可能目前还没有讲到,所以推荐先学习一下本文再去看控制台版本的U盘小偷。

同时为了兼顾学习MFC编程、以及让程序更加好看,所以本文将打算用MFC写一个带界面的U盘小偷。

这里先介绍一下U盘小偷的运行原理:

  1. 监听U盘消息
  2. 遍历U盘中的所有文件
  3. 将U盘中的所有文件拷贝到计算机硬盘中

考虑到小偷这个属性,我们就还需要隐藏我们的程序,还有考虑到拷贝文件的效率,还需要采用多线程等等。

2.前置工作

这次的项目名称为day13--UThief,建立MFC项目,选用基于对话框使用静态库,其它选项都随意,默认都行,影响不大。

然后将默认的控件都删除掉:

image-20231209202309193

这里注意一下,对话框的里面还有一圈蓝色的虚线,这个虚线是控件能摆放的范围,即控件只能放在这个虚线之内。

所以一般我都会将这个虚线拖大到窗口大小,这样整个窗口都可以摆放控件了。

既然这个项目的主要功能是拷贝文件,那么我们就得先有一个控件用于显示拷贝的过程吧。

这里就用到了前面提到的编辑框了,它除了可以用于输入,当然也可以用于输出信息。

拖一个编辑框控件,然后将它拉大,可以通过下图箭头所示的按钮预览效果:

image-20231209202452153

这里先放一个编辑框吧,之后如果有其它的功能需要添加再说,然后是它的属性调整:

image-20231209202715812

  1. Auto VScrollauto为自动,V为垂直(Vertical),Scroll为滚动,即自动垂直滚动,就是当你在最后一行按换行后,就会自动行上滚。
  2. 垂直滚动:就是出现右侧的滚动条。
  3. 多行:很好理解,因为其默认只显示为1行。
  4. 想要返回:也就是我们按的Enter键,用于换行,不将它置为true,我们就无法换行。
  5. ID:控件识别名,相当于我们的身份证,用于识别控件的。

然后为它绑定一个控件变量:

image-20231209202816859

自此,控件方面暂时就这样了,后面到了有需要的地方,我们再一步一步添加。

然后我们还需要添加消息,即我们得监听U盘的插入与拔出等消息。

但如果你在网上搜:MFC U盘消息

会发现基本大部分文章内容都是需要提前注册设备号,但我们是U盘小偷啊,怎么可能提前知道设备号?

所以这种方法行不通,即MFC没有处理陌生设备消息的能力,那就没办法了,只能我们自己在比较原始的回调函数中处理U盘消息了。

回调函数不会不记得了吧?在windows编程入门章节详解介绍过,就是用于处理各种消息的。

当然,它也只是稍微原始一点,因为windows消息的回调函数也是已经被MFC封装过了,我们只需要用类向导,自动生成虚函数来处理即可:

image-20231209203149029

生成之后我们就能看到:

image-20231209203218438

这个函数的参数与最原始的消息回调函数是不是特别相似!只是将第一个参数封装了而已,原始的回调函数如下:

在这里插入图片描述

对于我们不需要处理的消息,都通过调用基类的函数进行默认处理,自此前置工作我们就做完了!

3.U盘消息

上述步骤主要作用是接收消息,我们想要接收的消息是U盘消息。

但这个回调函数会收到所有的窗口消息,所以我们还需要通过回调函数的第一个参数来判断是否为U盘消息。

因此我们需要知道U盘消息是什么,U盘只是设备的一种,更加统一的叫法其实是设备管理消息

所有的Windows消息都可以在官方文档中找到:windows消息

我们主要在意的是最后一个项目,即窗口消息(WMwindows message):

image-20231209203454744

窗口消息里面也有很多种类的消息,我们现在需要的是U盘消息,即设备管理消息(Device Management Messages)。

点进去我们就能看到消息的名称:

image-20231209203534034

所以代码中我们就可以这样写:

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux