MFC U盘检测
WM_DEVICECHANGE消息
查阅MSDN得知:
The framework calls this member function to notify an application or device driver of a change to the hardware configuration of a device or the computer.
即:框架调用这个函数来通知应用程序或者设备驱动程序设备硬件配置或者电脑的配置被改变了。
所以,检测U盘的插入和拔出也就相当于侦测处理WM_DEVICECHANGE消息。
获取WM_DEVICECHANGE消息的方法
WM_DEVICECHANGE的使用方式有两种,一种是通过WindowProc()的方式,另一种是通过OnDeviceChange()消息响应函数的方式,底下就先介紹第一種方式,再介绍第二种。
通过WindowProc()的方式检测U盘
这里通过一个简单的Demo来说明
程序界面如下:
需要包含的头文件:
#include <dbt.h>
#include <winioctl.h>
重写WindowProc()函数实现U盘检测,代码如下:
char FirstDriveFromMask(ULONG unitmask) //獲取盤符
{
char i;
for (i = ; i < ; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> ;
}
return (i + 'A');
} LRESULT CUpanDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
CString detectMsg; switch (message)
{
//WM_DEVICECHANGE,系统硬件改变发出的系统消息
case WM_DEVICECHANGE:
{
PDEV_BROADCAST_HDR lpdb=(PDEV_BROADCAST_HDR)lParam;
switch(wParam)
{
case WM_DEVICECHANGE:
break;
case DBT_DEVICEARRIVAL://设备检测结束,并且可以使用
{
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch(lpdbv->dbcv_flags)
{
case : //U盘
{
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]插入!"), decDriver.GetBuffer());
m_editControl.SetWindowText(detectMsg);
}
break;
case DBTF_MEDIA: //光盘
break;
}
}
}
break;
case DBT_DEVICEREMOVECOMPLETE://设备卸载或者拔出
{
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch(lpdbv->dbcv_flags)
{
case : //U盘
{
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]拔出!"), decDriver.GetBuffer());
m_editControl.SetWindowText(detectMsg);
}
break;
case DBTF_MEDIA: //光盘 break;
}
}
}
break;
}
}
break;
} return CDialog::WindowProc(message, wParam, lParam);
}
程序运行结果如下:
插入U盘时:
拔出U盘时:
2. 通过OnDeviceChange()的方式检测U盘
首先在头文件声明一个消息函数:
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);
消息映射:
BEGIN_MESSAGE_MAP(OGrgFrmRepair, CDialog) ON_WM_DEVICECHANGE() END_MESSAGE_MAP()
实现:
char FirstDriveFromMask(ULONG unitmask) //獲取盤符
{
char i;
for (i = ; i < ; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> ;
}
return (i + 'A');
} BOOL CUpanDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
CString detectMsg;
PDEV_BROADCAST_HDR lpdb=(PDEV_BROADCAST_HDR)dwData; switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE:
{
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch(lpdbv->dbcv_flags)
{
case : //U盘
{
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]拔出!"), decDriver.GetBuffer());
m_editControl.SetWindowText(detectMsg);
}
break;
case DBTF_MEDIA: //光盘 break;
}
}
}
break;
case DBT_DEVICEARRIVAL:
{
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
switch(lpdbv->dbcv_flags)
{
case : //U盘
{
CString decDriver;
decDriver = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
detectMsg.Format(_T("检测到U盘:[%s]插入!"), decDriver.GetBuffer());
m_editControl.SetWindowText(detectMsg);
}
break;
case DBTF_MEDIA: //光盘
break;
}
}
}
break;
} return TRUE; }
MFC U盘检测的更多相关文章
- U盘检测软件:ChipGenius,MyDiskTest
几年前的事情了.有一次去北邮玩,看到校园里有卖U盘的摊位,问了问价格,8GB的金士顿U盘99块钱.正好头一天有个同事跟我说最近U盘降价了,8GB才99,于是心里一痒痒就买了一个.回来用着就感觉不对劲, ...
- chkdsk 命令对Raid盘检测和查错、修复
C:\Documents and Settings\Administrator>chkdsk /?检查磁盘并显示状态报告. CHKDSK [volume[[path]filename]]] [/ ...
- U盘小偷——C++实现U盘插入检测和文件扫描拷贝
前几天女朋友说老师上课的PPT不共享,没法复习,想着写个U盘小偷拷贝PPT来着,后来觉得这样的行为这是不对的,万一不小心复制了老师的专利啥的,或者一些不可描述的东西,就闹大了. 虽然没有采取实际行动, ...
- MFC与Qt的内存管理
最近在做MFC向Qt的移植,在内存管理方面遇到了很头疼的问题,虽然不知道问题到底出在哪,先了解下这两个库的内存管理方式.于是转载两篇关于内存管理的文章. 一. Qt内存管理: 在Qt的程序中经常会看到 ...
- 在线SVN仓库实现:金山快盘+TortoiseSVN(Win)+SCPlugin(Mac)
前段时间一直在研究SVN在线托管,也尝试了网上推荐的免费托管网站. 但毕竟是是免费的,还是要受到比如空间大小.私有性等这样那样的限制,感觉有些麻烦. 而且,比较心疼自己在本地开发的时候积累的更新日志, ...
- VC++ 内存泄露与检测的一种方法
本文介绍,当VC++或者MFC程序,出现内存泄露时,如何快速定位的方法,这种方法有一定的局限性,在注意事项中会给出的. MFC程序 当MFC程序出现内存泄露时,退出程序时的VS调试输出 ...
- 把CDLinux制作成U盘启动
因为用下了CDlinux,本来想在虚拟机上运行的.发现虚拟机跑的时候无法识别集成的笔记本网卡,坑爹啊.后来想刻碟的,发现手头上还没有现成的东西,光驱是只读的,又要用到光驱,于是想到了了用U盘,正好手上 ...
- 金士顿DT100 G3 PS2251-07海力士U盘量产修复成功教程
金士顿DT100 G3这款U盘.用了大概一年半没什么问题,前段时间拷贝大文件,无奈电脑突然断电,然后这个U盘在电脑上就读不出来了,只能显示盘符,所以有了修复过程. 最开始我也是菜鸟,不知道怎么搞, ...
- 磁盘检测SMART工具
题记: 做过一些关于硬盘的调研任务,当时搜集很多资料,不过现在没有,从网上找了一篇关于SMART的介绍,感觉基本上都是比较全面了. 首先各大硬盘厂商生产的硬盘基本都是会遵循SMART的技术标准的,当然 ...
随机推荐
- 【转】Oracle Freelist和HWM原理及性能优化
文章转自:http://www.wzsky.net/html/Program/DataBase/74799.html 近期来,FreeList的重要作用逐渐为Oracle DBA所认识,网上也出现一些 ...
- LeetCode: 412 Fizz Buzz(easy)
题目: Write a program that outputs the string representation of numbers from 1 to n. But for multiples ...
- 3 手写Java HashMap核心源码
手写Java HashMap核心源码 上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码. 我们来先了解一下HashMap的原理.HashMap 字面意思 has ...
- 201621123016 《Java程序设计》第十二周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...
- JQuery onload、ready 加载顺序
// ready 这个方法只是在页面所有的DOM加载完毕后就会触发 // 方式1 $(function(){ // do something }); // 方式2 $(document).ready( ...
- POJ3450【KMP理解】
题意: 求多个字符串的最长公共子串 思路: 4000个串,200长度. 一种暴力,对于一个串最多有200*200=40000级别个子串,然后我要再处理一下next数组200,8e6复杂度: 然后我要和 ...
- Codeforces 174B【模拟构造】
题意: 给你一个串只有小写字母和点,让你构造前缀是1-8,后缀是1-3长度的文件名: 思路: 那么以"."作为分割点,把字符串都拿出来,然后 首段长度<=8 OK; 中间&l ...
- 2014-7-7 NOIP模拟赛(图论)
1.无线通讯网(wireless.pas/cpp/c) [题目描述] 国防部计划用无线网络连接若干个边防哨所.2种不同的通讯技术用来搭建无线网络:每个边防哨所都要配备无线电收发器:有一些哨所还可以增配 ...
- git 版本控制(一)
新建代码库repository 1.在当前目录新建一个git代码库 git init git init projectname 2.下载一个项目,如果已经有了远端的代码,则可以使用clone下载 gi ...
- 洛谷1537(bitset+01背包)
总数是偶数并且其一半可得即可. bitset的移位可替代原本的数组转移. #pragma comment(linker, "/STACK:1024000000,1024000000" ...