helin
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3159回复:8

怎么向系统注册消息?

楼主#
更多 发布于:2004-04-07 11:04
usb设备surprise remove之后
想要告诉上层程序设备已经拔除
怎么在驱动里实现呢?
通过注册一个消息然后发给应用程序嘛?
如果是的话
怎么注册这个消息?
谢谢!
helin
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-04-07 11:33
怎么没人回呀?
helin
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-07 15:04
我问的问题一向没人回答
非常担心地说一句:
我问问题的方式有问题嘛?
告诉我
我改还不行嘛*^_^*
CObject
驱动大牛
驱动大牛
  • 注册日期2002-08-18
  • 最后登录2017-07-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望106点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2004-04-07 15:13
处理WM_DEVICECHANGE
看MSDN
[img=501x116]http://www.driverdevelop.com/forum//upload/CObject/2004-01-13_2.jpg[/img]
CObject
驱动大牛
驱动大牛
  • 注册日期2002-08-18
  • 最后登录2017-07-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望106点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2004-04-07 15:20
Windows WDM设备驱动程序开发指南

第九章有个例子。附件里是!你看看有没有用!
附件名称/大小 下载次数 最后更新
2004-04-07_Notify.rar (14KB)  137
[img=501x116]http://www.driverdevelop.com/forum//upload/CObject/2004-01-13_2.jpg[/img]
helin
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-07 15:56
谢谢大虾
我就是想去处理这个WM_DEVICECHANGE
MSDN也看了不少
但是我的USB设备产生的WM_DEVICECHANGE消息中的EVENT TYPE是DBT_DEVNODES_CHANGED,而不是DBT_DEVICEARRIVAL
怎么回事儿呢?
是不是需要在驱动中修改什么?
谢谢啦

[编辑 -  4/7/04 by  helin]
CObject
驱动大牛
驱动大牛
  • 注册日期2002-08-18
  • 最后登录2017-07-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望106点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2004-04-07 17:34
BOOL CWdm2NotifyDlg::OnDeviceChange( UINT nEventType, DWORD dwData )
{
CString Msg = "duh";
switch( nEventType)
{
case DBT_CONFIGCHANGECANCELED:
Msg.Format("DBT_CONFIGCHANGECANCELED");
break;
case DBT_CONFIGCHANGED:
Msg.Format("DBT_CONFIGCHANGED");
break;
case DBT_CUSTOMEVENT:
Msg.Format("DBT_CUSTOMEVENT");
break;
case DBT_DEVICEARRIVAL:
Msg.Format("DBT_DEVICEARRIVAL");
break;
case DBT_DEVICEQUERYREMOVE:
Msg.Format("DBT_DEVICEQUERYREMOVE");
break;
case DBT_DEVICEQUERYREMOVEFAILED:
Msg.Format("DBT_DEVICEQUERYREMOVEFAILED");
break;
case DBT_DEVICEREMOVEPENDING:
Msg.Format("DBT_DEVICEREMOVEPENDING");
break;
case DBT_DEVICEREMOVECOMPLETE:
Msg.Format("DBT_DEVICEREMOVECOMPLETE");
break;
case DBT_DEVICETYPESPECIFIC:
Msg.Format("DBT_DEVICETYPESPECIFIC");
break;
case DBT_QUERYCHANGECONFIG:
Msg.Format("DBT_QUERYCHANGECONFIG");
break;
case DBT_DEVNODES_CHANGED:
Msg.Format("DBT_DEVNODES_CHANGED");
break;
case DBT_USERDEFINED:
Msg.Format("DBT_USERDEFINED");
break;
default:
Msg.Format("Event type %d",nEventType);
}

PDEV_BROADCAST_DEVICEINTERFACE pdbch = (PDEV_BROADCAST_DEVICEINTERFACE)dwData;
if( pdbch!=NULL && pdbch->dbcc_devicetype==DBT_DEVTYP_DEVICEINTERFACE)
{
CString Msg2;
Msg2.Format("%s: %s",Msg,pdbch->dbcc_name);
Msg = Msg2;
}

CListBox* EventList = (CListBox*)GetDlgItem(IDC_EVENT_LIST);
EventList->AddString(Msg);
return TRUE; // or BROADCAST_QUERY_DENY to deny a query remove
}



有DBT_DEVICEREMOVECOMPLETE呀!自己处理啊
不用改驱动
[img=501x116]http://www.driverdevelop.com/forum//upload/CObject/2004-01-13_2.jpg[/img]
helin
驱动牛犊
驱动牛犊
  • 注册日期2004-03-23
  • 最后登录2004-09-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-07 18:07
那系统到底什么情况下才产生DBT_DEVICEARRIVAL呀,我的设备插上之后当然可以产生一连串的WM_DEVICECHANGE,但其EVENTTYPE值是DBT_DEVNODES_CHANGED,而我插上U盘的话就会产生一个DBT_DEVICEARRIVAL,我就是希望产生这个DEVICEARRIVAL,到底怎样才能实现呢?应该不是系统自己产生的吧,我觉着U盘的驱动里一定有什么例程是专门干这个的,你认为呢?
CObject
驱动大牛
驱动大牛
  • 注册日期2002-08-18
  • 最后登录2017-07-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望106点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2004-04-07 19:45
插拔过程中有好几个EVENTTYPE值,自己想处理 哪个就处理哪个呗!

我的设备不是U盘,驱动中没做什么特殊处理!

BOOL CMainFrame::OnDeviceChange( UINT nEventType, DWORD dwData )
{
pdbch = (PDEV_BROADCAST_DEVICEINTERFACE)dwData;
if((pdbch!=NULL)&&(pdbch->dbcc_devicetype==DBT_DEVTYP_DEVICEINTERFACE))
{
if((pdbch->dbcc_classguid.Data1==0x12345678)&&
(pdbch->dbcc_classguid.Data2==0x1234)&&
(pdbch->dbcc_classguid.Data3==0x6789)&&
(pdbch->dbcc_classguid.Data4[0]==0x12)&&
(pdbch->dbcc_classguid.Data4[1]==0x23)&&
(pdbch->dbcc_classguid.Data4[2]==0x34)&&
(pdbch->dbcc_classguid.Data4[3]==0x56)&&
(pdbch->dbcc_classguid.Data4[4]==0x78)&&
(pdbch->dbcc_classguid.Data4[5]==0x91)&&
(pdbch->dbcc_classguid.Data4[6]==0x12)&&
(pdbch->dbcc_classguid.Data4[7]==0x23))
{
switch( nEventType)
{
case DBT_DEVICEARRIVAL:          // 做设备已经连接的处理工作
{
TRACE("n设备已经连接了!"); }
break;

case DBT_DEVICEREMOVECOMPLETE:   // 做设备已经拔除的处理工作
{
TRACE("n设备已经拔出了"); }
break;
default:
;
}

}
}

return TRUE; // or BROADCAST_QUERY_DENY to deny a query remove
}



你把我给你的例子改一下,然后你把U盘插拔一次,我觉得应该可以看到你想要的东西的!

[编辑 -  4/7/04 by  CObject]
[img=501x116]http://www.driverdevelop.com/forum//upload/CObject/2004-01-13_2.jpg[/img]
游客

返回顶部