您的位置:程序门 -> vb ->



如何用vb判断是否插入u盘


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


如何用vb判断是否插入u盘
发表于:2007-10-12 20:51:04 楼主
如题!

小生vb小菜鸟,希望编写一个小程序.能监控u盘插入和拔出.

从而监控u盘的接入情况.

望各位大虾、高手们援手一助!
发表于:2007-10-12 21:30:221楼 得分:0
是不是可以监视有多少个盘符?有新盘符进来是看看什么类型,如果是u盘记录一下,有减少盘符时看看纪录里是不是有减少的那个盘?

我也菜鸟,瞎说哈,呵呵
发表于:2007-10-12 21:50:292楼 得分:0
我博客上有几篇用wmi的可以监视
api监视的方法等有机会我再发出来
地址是
http://blog.csdn.net/chenhui530/archive/2007/10/03/1810255.aspx

http://blog.csdn.net/chenhui530/archive/2007/10/03/1810252.aspx

http://blog.csdn.net/chenhui530/archive/2007/10/03/1810264.aspx
发表于:2007-10-12 21:50:553楼 得分:0
用api,可以监控u盘插入和斷開
发表于:2007-10-12 22:43:064楼 得分:0
我目前的想法:
1、找到最后一个盘符;   (用批处理可以找到,但批处理后的结果我无法返回到vb中)   sos
2、将找到的盘符进行判定,看是否为u盘。(已经可以实现)

目前就想完成这些,望各位大力帮助。非常感激!
发表于:2007-10-13 09:05:245楼 得分:0
操作系统在有   u   盘插拔时,会发出   devicechange   消息。你只要利用   setwindowlong   api   注册你的回调函数地址,在回调函数中就可以处理。
发表于:2007-10-13 09:15:526楼 得分:0
option   explicit
‘子类化窗体消息处理函数时需要使用的api,很常见,不作过多说明。
declare   function   setwindowlong   lib   "user32"   alias   "setwindowlonga"   (byval   hwnd  
as   long,   byval   nindex   as   long,   byval   dwnewlong   as   long)   as   long
declare   function   callwindowproc   lib   "user32"   alias   "callwindowproca"   (byval  
lpprevwndfunc   as   long,   byval   hwnd   as   long,   byval   msg   as   long,   byval   wparam   as  
long,   byval   lparam   as   long)   as   long
declare   sub   copymemory   lib   "kernel32"   alias   "rtlmovememory"   (pdst   as   any,   psrc  
as   any,   byval   bytelen   as   long)
const   gwl_wndproc   =   -4
const   wm_devicechange   as   long   =   &h219
const   dbt_devicearrival   as   long   =   &h8000&
const   dbt_deviceremovecomplete   as   long   =   &h8004&
'设备类型:逻辑卷标
const   dbt_devtyp_volume   as   long   =   &h2
'与wm_devicechange消息相关联的结构体头部信息
private   type   dev_broadcast_hdr
lsize   as   long
ldevicetype   as   long         '设备类型
lreserved   as   long
end   type
'设备为逻辑卷时对应的结构体信息
private   type   dev_broadcast_volume
lsize   as   long
ldevicetype   as   long
lreserved   as   long
lunitmask   as   long         '和逻辑卷标对应的掩码
iflag   as   integer        
end   type
public   info   as   dev_broadcast_hdr
public   info_volume   as   dev_broadcast_volume
public   prevproc   as   long       ‘原来的窗体消息处理函数地址
public   sub   hookform(f   as   form)
          prevproc   =   setwindowlong(f.hwnd,   gwl_wndproc,   addressof   windowproc)
end   sub
public   sub   unhookform(f   as   form)
          setwindowlong   f.hwnd,   gwl_wndproc,   prevproc
end   sub
public   function   windowproc(byval   hwnd   as   long,   byval   umsg   as   long,   byval   wparam  
as   long,   byval   lparam   as   long)   as   long
          select   case   umsg
                        '插入usb   disk   则接收到此消息
                      case   wm_devicechange
                        if   wparam   =   dbt_devicearrival   then
                     
                        '若插入usbdisk或者映射网络盘等则
                        'info.ldevicetype   =2
                        '即dbt_devtyp_volume
                     
                        ‘利用参数lparam获取结构体头部信息
                        copymemory   info,   byval   lparam,   len(info)
                     
                        if   info.ldevicetype   =   dbt_devtyp_volume   then
                         
                            copymemory   info_volume,   byval   lparam,   len(info_volume)
                         
                            '检测到有逻辑卷添加到系统中,则显示该设备根目录下全部文件名
                            listfiles   chr(getdrivename(info_volume.lunitmask))   &   ":\",  
form1.list1
                        end   if
                        end   if
                     
                        if   wparam   =   dbt_deviceremovecomplete   then
                     
                        '若移走usbdisk或者映射网络盘等则
                        'info.ldevicetype   =2
                        '即dbt_devtyp_volume
                     
                        ‘利用参数lparam获取结构体头部信息
                        copymemory   info,   byval   lparam,   len(info)
                                           
                        if   info.ldevicetype   =   dbt_devtyp_volume   then
                            copymemory   info_volume,   byval   lparam,   len(info_volume)
                         
                            '清除list中的内容
                            form1.list1.clear
                        end   if
                        end   if                    
               
            end   select
          '   调用原来的窗体消息处理函数
          windowproc   =   callwindowproc(prevproc,   hwnd,   umsg,   wparam,   lparam)
       
end   function
'根据输入的32位long型数据(只有一位为1)返回对应的卷标的ascii数值
'规则是1:a、2:b、4:c等等
function   getdrivename(byval   lunitmask   as   long)   as   byte
dim   i   as   long
i   =   0
while   lunitmask   mod   2   <>   1
        lunitmask   =   lunitmask   \   2
        i   =   i   +   1
wend
getdrivename   =   asc("a")   +   i
end   function
'显示插入逻辑卷根目录的文件名列表,需要在工程里引用microsoft   scripting   runtime库。
function   listfiles(strpath   as   string,   byref   list   as   listbox)
      dim   fso   as   new   scripting.filesystemobject
      dim   objfolder   as   folder
      dim   objfile   as   file
   
      set   objfolder   =   fso.getfolder(strpath)
   
      for   each   objfile   in   objfolder.files
          list.additem   objfile.name
      next
end   function
窗体form1代码:
option   explicit
private   sub   form_load()
'子类化窗体的消息处理函数
hookform   me
end   sub
private   sub   form_unload(cancel   as   integer)
'程序退出时恢复原窗体处理函数
unhookform   me
end   sub
效果图:

备注:本示例程序不仅仅能检测u盘的插入,对cdrom、网络映射盘等设备也会作出同样的反应,如果需要只检测u盘,则需要在if   info.ldevicetype   =  
dbt_devtyp_volume  
处再对iflag结构成员作检测,其数值为0时表示设备为u盘。另外根据微软的解释,软盘的插拔是不会有引发该消息的,原因是只有支持软弹出技术的设备才会引发该消息。(原文:messages  
for   media   arrival   and   removal   are   sent   only   for   media   in   devices   that   support   a  
soft-eject   mechanism.   )
本演示程序在windows98、xp系统下调试通过。
发表于:2007-10-13 09:22:447楼 得分:0
上面的也是转载,希望对你有帮助~~~
不要说我抄袭原创就可以了....
发表于:2007-10-13 22:16:128楼 得分:0
谢谢楼上的发表!
发表于:2007-10-20 09:19:209楼 得分:0
又是零号这个垃圾,抄袭别人,没抄完整!


快速检索

最新资讯
热门点击