实时获得硬件被拔掉的消息,并在程序中弹出提示框。
我知道获得系统的WM_DEVICECHANGE的消息。
在函数OnDeviceChange(){}
中实现,可是如何判断硬件已经被拔掉?谢谢!
我知道获得系统的WM_DEVICECHANGE的消息。
在函数OnDeviceChange(){}
中实现,可是如何判断硬件已经被拔掉?谢谢!
解决方案 »
- combobox使用问题?
- 急求 如何侦测显示器的亮度等设置被修改的事件
- CView::OnLButtonDown(UINT nFlags, CPoint point) 如何在外部等待其按下鼠标
- 菜鸟请教:CStdioFile的问题
- 紧急求助!!关于文件拖拽
- 提供自己开发的考勤、工资、进销存管理软件源代码,VC+SQL Server,并负责学习指点(十二年软件开发经验,5年VC开发)
- 终于搞定一个棘手的问题,心情爽,散分啊,呵呵呵
- 有个问题请教一下
- 我用TextOut在屏幕上显示一段文字,除了InvalidateRect之外,还有没有什么办法把它擦掉?
- 请推荐一个好用的短信群发工具,高分相送!!
- ***如何向可编辑控件中加入字符串的问题***(急!!!如解决可继续加分)
- 我用ShellExecute打开网页,如何能开一个新的浏览器,而不是从现有的打开网页中占用一个
可是出现了一些问题;
1:在Win2000下有时系统重起
2:在windows me下操作a:盘时程序非法操作
2:在winnt下有时系统不支持。
能否帮忙说详细点?谢谢!
可是出现了一些问题;
1:在Win2000下有时系统重起
2:在windows me下操作a:盘时程序非法操作
2:在winnt下有时系统不支持。
能否帮忙说详细点?谢谢!
我刚写了类似的程序,没有什么问题啊http://expert.csdn.net/Expert/topic/2247/2247211.xml?temp=.7121088
把上面贴子的代码中
if(!SetupDiClassGuidsFromName("Ports",ab,i,&i))//通过设备类名得到设备类型的GUID
改成
if(!SetupDiClassGuidsFromName("USB",ab,i,&i))//通过设备类名得到设备类型的GUID
就能用了
#include <windows.h>
#include <dbt.h>char FirstDriveFromMask (ULONG unitmask); //prototype/*------------------------------------------------------------------
Main_OnDeviceChange (hwnd, wParam, lParam) Description
Handles WM_DEVICECHANGE messages sent to the application's
top-level window.
--------------------------------------------------------------------*/void Main_OnDeviceChange (HWND hwnd, WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
char szMsg[80]; switch(wParam)
{
case DBT_DEVICEARRIVAL:
// Check whether a CD or DVD was inserted into a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
wsprintf (szMsg, "Drive %c: Media has arrived.\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask)); MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
}
}
break; case DBT_DEVICEREMOVECOMPLETE:
// Check whether a CD or DVD was removed from a drive.
if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if (lpdbv -> dbcv_flags & DBTF_MEDIA)
{
wsprintf (szMsg, "Drive %c: Media was removed.\n",
FirstDriveFromMask(lpdbv ->dbcv_unitmask)); MessageBox (hwnd, szMsg, "WM_DEVICECHANGE", MB_OK);
}
}
break; default:
/*
Process other WM_DEVICECHANGE notifications for other
devices or reasons.
*/
;
}
}/*------------------------------------------------------------------
FirstDriveFromMask (unitmask) Description
Finds the first valid drive letter from a mask of drive letters.
The mask must be in the format bit 0 = A, bit 1 = B, bit 3 = C,
etc. A valid drive letter is defined when the corresponding bit
is set to 1. Returns the first drive letter that was found.
--------------------------------------------------------------------*/ char FirstDriveFromMask (ULONG unitmask)
{
char i; for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
} return (i +
然后在代码中处理如下:
BOOL CDevDlg::OnDeviceChange( UINT nEventType, DWORD dwData )
{
switch(nEventType)
{
case DBT_DEVICEARRIVAL:
{
//处理到达消息,
MessageBox("arrival");
bDeviceArrive = TRUE;
}
break;
case DBT_DEVICEREMOVECOMPLETE:
{
//处理拔除消息,
MessageBox("Remove");
bDeviceArrive = FALSE;
bDeviceRemove = TRUE;
}
break;
}
return TRUE;
}
如果不是这样,那稍微麻烦点,就上面诸位的方法可以。枚举设备接口。ddk里头有例子的。