阅读:3159回复:8
怎么向系统注册消息?
usb设备surprise remove之后
想要告诉上层程序设备已经拔除 怎么在驱动里实现呢? 通过注册一个消息然后发给应用程序嘛? 如果是的话 怎么注册这个消息? 谢谢! |
|
沙发#
发布于:2004-04-07 11:33
怎么没人回呀?
|
|
板凳#
发布于:2004-04-07 15:04
我问的问题一向没人回答
非常担心地说一句: 我问问题的方式有问题嘛? 告诉我 我改还不行嘛*^_^* |
|
地板#
发布于:2004-04-07 15:13
处理WM_DEVICECHANGE
看MSDN |
|
|
地下室#
发布于:2004-04-07 15:20
Windows WDM设备驱动程序开发指南
第九章有个例子。附件里是!你看看有没有用! |
|
|
5楼#
发布于:2004-04-07 15:56
谢谢大虾
我就是想去处理这个WM_DEVICECHANGE MSDN也看了不少 但是我的USB设备产生的WM_DEVICECHANGE消息中的EVENT TYPE是DBT_DEVNODES_CHANGED,而不是DBT_DEVICEARRIVAL 怎么回事儿呢? 是不是需要在驱动中修改什么? 谢谢啦 [编辑 - 4/7/04 by helin] |
|
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呀!自己处理啊 不用改驱动 |
|
|
7楼#
发布于:2004-04-07 18:07
那系统到底什么情况下才产生DBT_DEVICEARRIVAL呀,我的设备插上之后当然可以产生一连串的WM_DEVICECHANGE,但其EVENTTYPE值是DBT_DEVNODES_CHANGED,而我插上U盘的话就会产生一个DBT_DEVICEARRIVAL,我就是希望产生这个DEVICEARRIVAL,到底怎样才能实现呢?应该不是系统自己产生的吧,我觉着U盘的驱动里一定有什么例程是专门干这个的,你认为呢?
|
|
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] |
|
|