易语言实现USB插拔的监视,读出盘符,读出USB根目录下的文件,通过SetWindowLong实现窗口子类化,当参数Wp = #DBT_DEVICERARRIVAL就是监视插入设备,当wp = #DBT_DEVICEREMOVECOMPLETE就是删除设备
用到的API
.版本 2 .DLL命令 SetWindowLong, 子程序指针, , "SetWindowLongA" .参数 hwnd, 整数型 .参数 nIndex, 整数型 .参数 value, 子程序指针 .DLL命令 CallWindowProc, 整数型, , "CallWindowProcA" .参数 proc, 子程序指针 .参数 hwnd, 整数型 .参数 msg, 整数型 .参数 wp, 整数型 .参数 lp, 整数型 .DLL命令 复制结构体, 整数型, , "RtlMoveMemory" .参数 dest, PDEV_BROADCAST_VOLUME, 传址 .参数 source, 整数型 .参数 len, 整数型, , 14
自定义数据类型
.版本 2 .数据类型 PDEV_BROADCAST_VOLUME .成员 dbcv_size, 整数型, , , 14 .成员 dbcv_devicetype, 整数型 .成员 dbcv_reserved, 整数型 .成员 dbcv_unitmask, 整数型 .成员 dbcv_flags, 短整数型 .数据类型 _DEV_BROADCAST_HDR .成员 dbch_size, 整数型 .成员 dbch_devicetype, 整数型 .成员 dbch_reserved, 整数型
常量
.版本 2 .常量 WM_DEVICECHANGE, "537", , 驱动盘符被改变 .常量 DBT_DEVICEREMOVECOMPLETE, "32772" .常量 DBT_DEVICERARRIVAL, "32768" .常量 DBT_DEVTYP_OEM, "0" .常量 DBT_DEVTYP_DEVNODE, "1" .常量 DBT_DEVTYP_VOLUME, "2" .常量 DBT_DEVTYP_PORT, "3" .常量 DBT_DEVTYP_N, "4"
窗口子类化
.版本 2
.程序集 窗口程序集1
.程序集变量 a, 子程序指针
.子程序 __启动窗口_创建完毕
a = SetWindowLong (_启动窗口.取窗口句柄 (), -4, &MsgProc)
MsgProc
.版本 2 .子程序 MsgProc, 整数型 .参数 hwnd, 整数型 .参数 msg, 整数型 .参数 wp, 整数型 .参数 lp, 整数型 .局部变量 val, PDEV_BROADCAST_VOLUME .局部变量 i, 整数型 .局部变量 mask, 整数型 .判断开始 (msg = 537) .判断开始 (wp = #DBT_DEVICERARRIVAL) ' 插入设备 复制结构体 (val, lp, 14) .如果真 (val.dbcv_devicetype = #DBT_DEVTYP_VOLUME) mask = val.dbcv_unitmask .变量循环首 (0, 25, 1, i) .如果真 (位与 (mask, 1) = 1) 跳出循环 () .如果真结束 mask = 右移 (mask, 1) .变量循环尾 () 编辑框1.加入文本 (“USB磁盘被插入,盘符:” + 字符 (65 + i) + #换行符) 检测 (字符 (65 + i)) .如果真结束 .判断 (wp = #DBT_DEVICEREMOVECOMPLETE) ' 删除设备 复制结构体 (val, lp, 14) .如果真 (val.dbcv_devicetype = #DBT_DEVTYP_VOLUME) mask = val.dbcv_unitmask .变量循环首 (0, 25, 1, i) .如果真 (位与 (mask, 1) = 1) 跳出循环 () .如果真结束 mask = 右移 (mask, 1) .变量循环尾 () 编辑框1.加入文本 (“USB磁盘被拔除,盘符:” + 字符 (65 + i) + #换行符) .如果真结束 .默认 .判断结束 .默认 .判断结束 返回 (CallWindowProc (a, hwnd, msg, wp, lp))
检测USB根目录
.版本 2 .子程序 检测 .参数 盘符, 文本型 .局部变量 fn, 文本型 fn = 寻找文件 (盘符 + “:\*.*”, ) 编辑框2.内容 = “” .判断循环首 (fn ≠ “”) 编辑框2.加入文本 (fn + #换行符) fn = 寻找文件 (, ) .判断循环尾 ()
销毁还原窗口
.版本 2 .子程序 __启动窗口_将被销毁 a = SetWindowLong (_启动窗口.取窗口句柄 (), -4, a)