`
happmaoo
  • 浏览: 4599720 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

VC实现自动监测光驱状态的改变

 
阅读更多

VC实现自动监测光驱状态的改变

2006-08-08 05:00作者:蒋涛出处:blog责任编辑:方舟

<!--广告-->
<!-- Please check block file -->
<!-- Please check block file -->
  一、实现原理

  Windows系统通过GDI(图形设备接口)将系统的硬件和用户可以操作的编程接口相分离,以保证系统的稳定型和安全性。当某一个设备的硬件配置发生变化时,Windows发送广播消息WM_DEVICECHANGE给相关的应用和设备驱动程序,此时在应用程序中可以截获该消息并分析其中的消息参数,先分辨当前的消息内容,然后调用不同的事件处理程序。本文中主要考虑的是光驱的弹出和送入事件,因此程序设计时只需对逻辑驱动器进行扫描,判断是哪个驱动器号发生变化即可。一般的外设(包括软、硬盘驱动器、光驱等)在Windows系统中按照逻辑上的驱动器名称进行管理,这样就屏蔽了用户和计算机硬件直接打交道。Windows中用掩码数字0代表驱动器“A”,1代表驱动器“B”,依此类推。其中每个逻辑驱动器又有0和1两种状态变化,如果驱动器一直未发生变化,则此值为0,否则置为1,一个逻辑驱动器状态可以响应多种事件,如打开、关闭、新添加、删除等事件,甚至可以响应用户自定义的事件。

  本文中的程序主要是监测光驱的弹出和送入的状态改变,当应用程序启动后,弹出一个对话框,说明正在等待光驱事件的发生,此时如果将光驱弹出,应用程序会提示此时光盘驱动器已经弹出,在送入光驱之后,并且光驱中有CDROM碟片时,应用会提示光驱已经就绪。

  二、程序实现

  从Visual C++的IDE中的File菜单中选择New对话框,在Project属性页中选择Win32 Application,建立一个空的Win32应用程序,将StdAfx.h和StdAfx.cpp包含进来。建立一个新的对话框资源,在对话框上写上一句静态文本,“正在等待光驱事件”。下面实现监测光驱状态变化的主程序,在主程序cdchange.cpp中实现了三个函数。

  第一个函数是chFirstDriveFromMask(ULONG unitmask),该函数的作用是将响应WM_DEVICECHANGE消息事件的内容(即驱动器掩码)作为输入,和系统定义的掩码相比较,从而返回发生变化事件的驱动器的逻辑名称,如“E盘”、“F盘”等。函数的源代码如下:

char chFirstDriveFromMask (ULONG unitmask)
{
 char i;
 for (i = 0; i < 26; ++i) //假设不会超过26个逻辑驱动器
 {
  if (unitmask & 0x1) //看该驱动器的状态是否发生了变化
   break;
  unitmask = unitmask >> 1;
 }
 return (i + 'A');
}

  第二个函数是关键,它是对话框的事件处理函数,同时也是用来截获并处理Windows的WM_DEVICECHANGE事件。在该函数中首先声明了一个 PDEV_BROADCAST_HDR类型的结构变量lpdb,该结构里存储了当WM_DEVICECHANGE消息产生时的设备事件信息,它的声明在 VC98目录下面的Include目录中的dbt.h中。接着,进入事件和消息处理程序,当WM_DEVICECHANGE事件出现时,程序再判断该消息的附加消息参数以判断CDROM的事件类型。当一个设备被插入并变得可用时,系统会发送广播事件DBT_DEVICEARRIVAL,而当一个设备被除去并变得不可用时,系统会发送广播事件DBT_DEVICEREMOVECOMPLETE,根据这两种消息可以判断当前的光驱是否是开着的。处理完以上事件之后,还要检查一下光驱中是否由CDROM碟片,如有才弹出对话框表明光驱已经弹出或成功送入。同时为了防止于其他的自动识别光驱状态的应用产生冲突,本例中将暂时禁止光驱的自动播放功能。函数的源代码如下:

BOOL WINAPI DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 BOOL fRet = TRUE; // 返回值
 //通过响应WM_DEVICECHANGE消息得到的设备事件信息结构
 PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
 //对话框消息处理
 switch (uMsg)
 {
  case WM_INITDIALOG:
   fRet = TRUE;
   break;
   //对 WM_DEVICECHANGE 消息进行处理
  case WM_DEVICECHANGE:
  char szMsg[80]; // 对话框中要表示的字符串
   switch (wParam)
   {
    //当一个设备变得被插入并变得可用时,
    //系统会发送广播事件DBT_DEVICEARRIVAL
    case DBT_DEVICEARRIVAL:
     // 判断CDROM碟片是否已经插入到光驱中
     if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) {
      PDEV_BROADCAST_VOLUME lpdbv=(PDEV_BROADCAST_VOLUME) lpdb;
      //判断是否有CDROM碟片
      if (lpdbv -> dbcv_flags & DBTF_MEDIA)
      {
       // 显示消息,获取光驱的逻辑驱动器号
       wsprintf (szMsg, "驱动器 %c: 已经可用\n",chFirstDriveFromMask(lpdbv ->dbcv_unitmask));
       MessageBox (hwnd, szMsg, "光驱自动监测", MB_OK |MB_ICONINFORMATION);
      }
     }
     break;

    //当一个设备变得被移走并变得不可用时,
    //系统会发送广播事件DBT_ DEVICEREMOVECOMPLETE

    case DBT_DEVICEREMOVECOMPLETE:
     // 判断CDROM碟片是否从光驱中移走
     if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) {
      PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
      if (lpdbv -> dbcv_flags & DBTF_MEDIA)
      {
       //显示消息,获取光驱的逻辑驱动器号
       wsprintf (szMsg, "驱动器 %c: 已经弹出\n",chFirstDriveFromMask(lpdbv ->dbcv_unitmask));
       MessageBox (hwnd, szMsg, "光驱自动监测", MB_OK| MB_ICONINFORMATION);
      }
     }
     break;
    }
    //处理其他Windows消息
   case WM_COMMAND:
    int wmId, wmEvent;
    wmId = LOWORD(wParam);
    wmEvent = HIWORD(wParam);
    switch (wmId)
    {
     case IDOK:
      EndDialog(hwnd, 0);
      break;
    }
   default:
    fRet = FALSE;
    break;
  }
  // 禁止光驱的AutoPlay功能
  static UINT uMsgQueryCancelAutoPlay=RegisterWindowMessage("QueryCancelAutoPlay");
  if (uMsg==uMsgQueryCancelAutoPlay)
  {
   int n = MessageBox(hwnd, "你想禁止AutoPlay功能吗?", NULL,MB_YESNO | MB_ICONQUESTION);
   // 1代表取消 AutoPlay
   // 0 t代表允许AutoPlay
   SetDlgMsgResult(hwnd, uMsg, (n == IDYES) ? 1 : 0);
   fRet = (n == IDYES) ? 1 : 0;
  }
  return(fRet);
}

  第三个函数非常简单,产生一个模式对话框。代码如下:

int APIENTRY WinMain
(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
 //从对话框模版资源中创建一个模式对话框
 DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),NULL, DlgProc);
 return 0;
}
分享到:
评论

相关推荐

    vc实现自动关机,修正了bug,很好用

    vc实现自动关机,修正了bug,很好用vc实现自动关机,修正了bug,很好用

    vc 实现打开关闭光驱,已经调试成功!

    在VC++编程环境中,实现打开或关闭光驱的功能主要涉及到Windows API函数的调用。Windows API是Windows操作系统提供的一系列接口函数,它们允许程序员直接控制操作系统底层功能,如硬件设备操作。在这个项目中,我们...

    VC 软件自动更新的实现.rar

    VC 软件自动更新的实现源码,是一个在线自动升级更新程序的例子,非常实用的一个在线升级模块,附加有ASP/PHP/JSP三种动态网页使用实例,提供了不同主机的不同文件,相关说明:  1) update文件夹下为服务器所用...

    VC实现光驱、软驱、USB的禁用和启用

    在Windows操作系统中,开发者可以利用Microsoft Visual C++(VC)进行系统级编程,实现对硬件设备的控制,如光驱、软驱和USB接口的启用与禁用。这些功能通常涉及底层驱动程序开发和系统API调用。下面将详细介绍如何...

    VC实现自动关机软件

    VC实现的关机软件,免费无限时无限量使用

    流量监测系统 VC实现的,可运行的源代码

    在这个“流量监测系统 VC实现的,可运行的源代码”中,我们可以深入理解如何使用Microsoft Visual C++(简称VC)开发此类系统。VC是一种强大的C++集成开发环境,广泛用于Windows平台的软件开发。 在构建流量监测...

    VC6.0中实现在状态栏中加入进度条

    本教程将详细介绍如何在VC6.0的MFC应用中实现在状态栏中添加进度条。 首先,我们需要了解MFC中的状态栏和进度条组件。状态栏通常是位于窗口底部的一个区域,用于显示简短的信息或提示,而进度条则用来显示任务的...

    VC实现QQ在线状态检测

    在本案例中,"VC实现QQ在线状态检测"是指使用Microsoft Visual C++(简称VC)这一集成开发环境来编写程序,检测QQ用户的在线状态。以下将详细阐述涉及的相关知识点: 1. **网络编程基础**:QQ在线状态检测需要通过...

    96_vc_xtq.rar_VC 网络 状态 监测_Vc_嗅探器_网络 监测

    VC++编程实现网络嗅探器在调试状态下,在Output窗口中输出监测信息,监测局域网信息

    光驱控制程序(vc版)

    使用VC编写光驱控制程序,开发者可以利用C++的强大功能,包括面向对象编程、模板、异常处理等特性,以实现高效、稳定的驱动代码。VC提供的MFC(Microsoft Foundation Classes)库,为开发人员提供了丰富的类和函数,...

    vc 自动改变控件位置和大小

    这项技术可以通过使用特定的对话框类来实现,例如《VC 中自动改变控件位置和大小的对话框类》。 首先,在非模态对话框类的头文件(.h)顶部加上#include "lxDialog.h",然后把非模态对话框类的基类改成 ClxDialog。这...

    VC MFC实现自动关闭的弹出窗口.rar

    VC MFC弹出窗口的实现例子,基于MFC的AfxMessageBox,与标准的 MessageBox 弹出消息框相比,MFC提供的 AfxMessageBox方法使消息框变得更加容易,且消息框支持自动关闭,点击OK将弹出两个AfxMessageBox:第一个是没有...

    用vc实现串口通信的完整代码.rar

    用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的完整代码.rar用vc实现串口通信的...

    VC实现窗口自动隐藏

    在Windows编程领域,"VC实现窗口自动隐藏"是一种常见的用户界面设计技巧,它能提供更加高效和简洁的用户体验。这个程序使用Visual C++(VC)作为开发工具,通过Windows API来实现窗口的自动隐藏和显示功能,使得窗口...

    VC实现网络连接检测

    VC实现网络连接检测,得到网络未连接的话打开系统网络连接模块。 通过Socket ICMP协议实现。

    VC实现光驱、软驱、USB的禁用和启用.doc

    此外,还可以结合系统事件监听,自动响应某些条件下的设备状态改变,例如在检测到未经授权的USB设备插入时自动禁用。 ### 四、注意事项 虽然通过VC可以方便地实现对设备的控制,但在实际部署前应充分测试,确保...

    VC状态栏自动提示菜单信息类及演示程序和文章链接

    而“VC状态栏自动提示菜单信息类及演示程序和文章链接”则是一个专门针对这一需求设计的组件,它能够帮助开发者实现更高效、友好的用户界面。 这个资源包含了一个自定义的类,该类可以被集成到你的VC++工程中,用于...

    vc/MFC 虚拟光驱

    根据给定的信息,我们可以推断出作者主要关注的是在VC/MFC环境下开发一个虚拟光驱。虚拟光驱是一种软件程序,它可以模拟物理光驱的功能,允许用户加载ISO镜像文件并将其作为虚拟驱动器挂载,从而无需实际插入光盘...

    VC实现聊天室服务端及客户端程序

    《VC实现聊天室服务端及客户端程序》 在IT领域,开发一款聊天室程序是学习网络编程和客户端-服务器架构的常见实践。本项目利用Microsoft Foundation Classes (MFC)库,一个C++类库,来构建一个具备基本聊天功能的...

Global site tag (gtag.js) - Google Analytics