.h 內
private
:
// User declarations
void
__fastcall WndProc(TMessage &Msg);
.c內
#include "Dbt.h"
//---------------------------------------------------------------------------
// 重载窗体WndProc函数
void
__fastcall TForm1::WndProc(TMessage &Msg)
{
if
(Msg.Msg == WM_DEVICECHANGE)
{
int
nDevType;
PDEV_BROADCAST_HDR dbh;
if
(Msg.WParam == DBT_DEVICEARRIVAL || Msg.WParam == DBT_DEVICEREMOVECOMPLETE)
{
dbh = PDEV_BROADCAST_HDR(Msg.LParam);
if
(dbh->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
if
(Msg.WParam == DBT_DEVICEARRIVAL)
{
ShowMessage(
"USB connect"
);
}
else
{
ShowMessage(
"USB remove"
);
}
}
}
}
TForm::WndProc(Msg);
}
1、可根據dbch_devicetype(DBT_DEVTYP_DEVICEINTERFACE和DBT_DEVTYP_VOLUME),分別得到PID/VID/SN和盤符號。
2、當USB設備不是存儲設備時,只出發一次WM_DEVICECHANGE,devicetype是DBT_DEVTYP_DEVICEINTERFACE
3、當USB設備是存儲設備時,會觸發兩次WM_DEVICECHANGE,一次是DBT_DEVTYP_DEVICEINTERFACE、一次是DBT_DEVTYP_VOLUME
4、插入時,先DBT_DEVTYP_DEVICEINTERFACE後DBT_DEVTYP_VOLUME
5、拔出時,先DBT_DEVTYP_VOLUME後DBT_DEVTYP_DEVICEINTERFACE
6、即使是存儲設備,有時也不會觸發DBT_DEVTYP_VOLUME,這個問題還沒搞清楚。
沒有留言:
張貼留言