关于检测鼠标是否拔出的问题。。。

usualwyy 2009-08-31 06:29:19
我的程序时用VB写的,但是悲剧的是查了所有能查到得中外资料,找不到VB的相关应用或者项目

所以只能向VC版的各位老大请教

具体问题:
我用WindowProc截获消息,
        
Select Case uMsg
Case WM_DEVICECHANGE

If wParam = DBT_DEVICEREMOVECOMPLETE Then

MsgBox ("beep")

End If
End Select

只能截获U盘拔出的消息,鼠标拔出一点反应都没有
如果去掉判断

Select Case uMsg
Case WM_DEVICECHANGE


MsgBox ("beep")


End Select


在鼠标拔出时Beep了多次,这就是说鼠标拔出的确属于WM_DEVICECHANGE的范畴,而且如果不做判断,同时截获了鼠标拔出造成的其他影响


怎么做出判断准确截获鼠标拔出的消息?

有劳各位大大给出方案,最好是VB代码,如果是VC\C++也欢迎

只要解决问题,不管什么代码都给高分

万谢.......
...全文
183 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ghost90 2009-08-31
  • 打赏
  • 举报
回复
在XP 下试验
USB鼠标的插入、拔出只有 DBT_DEVNODES_CHANGED 消息,也就是
If wParam = DBT_DEVNODES_CHANGED Then

MsgBox ("beep")

End If

MoXiaoRab 2009-08-31
  • 打赏
  • 举报
回复
上面的代码写得很乱,忘记排版了

DEV_BROADCAST_HDR

你在监听这个WM_DEVICECHANGE事件的类型号为DBT_DEVICEREMOVECOMPLETE(拔出设备时),
它的lParam的解释如下:
lParam
Pointer to a structure identifying the device removed. The structure consists of an event-independent header, followed by event-dependent members that describe the device. To use this structure, treat the structure as a DEV_BROADCAST_HDR structure, then check its dbch_devicetype member to determine the device type.

重要的是最后一句,也就是DEV_BROADCAST_HDR的第二个参数dbch_devicetype,你再去看下这个里面,应该可以得到启示了
这个参数的值可以为DBT_DEVTYP_PORT这个结构体,再跟下去看下,第四个参数(设备名称)
dbcp_name
Pointer to a null-terminated string specifying the friendly name of the port or the device connected to the port. Friendly names are intended to help the user quickly and accurately identify the device—for example, "COM1" and "Standard 28800 bps Modem" are considered friendly names.
MoXiaoRab 2009-08-31
  • 打赏
  • 举报
回复

void CWndMessDlg::OnDeviceChange(WPARAM wParam,LPARAM lParam)
{
UINT Event = (UINT) wParam;
PDEV_BROADCAST_HDR pHDR = (PDEV_BROADCAST_HDR) lParam;
CString strMes ;

switch(Event) {
case DBT_CONFIGCHANGECANCELED:
strMes = "A request to change the current configuration (dock or undock) has been canceled. ";
break;
case DBT_CONFIGCHANGED:
strMes = "The current configuration has changed, due to a dock or undock.";
break;
case DBT_DEVICEARRIVAL:
strMes = "A device has been inserted and is now available. " ;
strMes += "\n";
switch(pHDR->dbch_devicetype) {
case DBT_DEVTYP_OEM :
strMes += "OEM- or IHV-defined device type. ";
break;
case DBT_DEVTYP_VOLUME: //这个是U盘
strMes += " Logical volume. ";
break;
case DBT_DEVTYP_PORT: //注意看这个,端口设备哦
strMes += " Port device (serial or parallel). ";
break;
default:
break;
}
break;
case DBT_DEVICEQUERYREMOVE :
strMes = "Permission is requested to remove a device. Any application can deny this request and cancel the removal. ";
break;
case DBT_DEVICEQUERYREMOVEFAILED:
strMes = "A request to remove a device has been canceled. ";
break;
case DBT_DEVICEREMOVECOMPLETE:
strMes = "A device has been removed. ";
break;
case DBT_DEVICEREMOVEPENDING:
strMes = "A device is about to be removed. Cannot be denied. ";
break;
case DBT_DEVICETYPESPECIFIC:
strMes = "A device-specific event has occurred. ";
break;
case DBT_QUERYCHANGECONFIG:
strMes = "Permission is requested to change the current configuration (dock or undock). ";
break;
case DBT_USERDEFINED:
strMes ="The meaning of this message is user-defined. ";
break;
default:
break;

}
AfxMessageBox(strMes);

}

MoXiaoRab 2009-08-31
  • 打赏
  • 举报
回复
WM_DEVICECHANGE消息当有设备被禁止或激活时(比如我们插入光盘,从光驱中取出光盘,或者在系统设备中删除或禁止打印端口),该消息的wParam参数分别被指定为DBT_DEVICEARRIVAL和DBT_DEVICEREMOVECOMPLETE.此时,lParam参数指向一个DEV_BROADCAST_HDR结构,该结构中的dbch_devicetype成员表识设备的类型,当该值为DBT_DEVTYP_VOLUME时,表明一个带有卷标名的驱动器发生了变化,一般情况下该驱动器既为光驱.

Select Case uMsg
Case WM_DEVICECHANGE

If (DEV_BROADCAST_HDR)lParam.dbch_devicetype <> DBT_DEVTYP_VOLUME
Then

MsgBox ("beep")

End If
End Select

Try it
happysalay 2009-08-31
  • 打赏
  • 举报
回复
->在鼠标拔出时Beep了多次,这就是说鼠标拔出的确属于WM_DEVICECHANGE的范畴,而且如果不做判断,同时截获了鼠标拔出造成的其他影响
每次截获之后判断一下WPARAM的值,对比一下看看是什么情况。
贪玩的老鼠 2009-08-31
  • 打赏
  • 举报
回复
lParam是对应一个DEV_BROADCAST_HDR结构体,
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
DEV_BROADCAST_DEVICEINTERFACE lpdbv = (DEV_BROADCAST_DEVICEINTERFACE)lpdb;
根据名字去判断dbcc_name

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧