我想通过WM_DEVICECHANGE来判断插入USB的操作,同时得到USB的串口,请问有没有人知道怎么实现的? 谢谢。
解决方案 »
- 急急急 listbox中每行后面怎样加checkbox
- 请教各位高手,本人用VC++编了一个简单的游览器,怎样才能支持打开FLASH???谢谢!!!
- 关于VB里的异或逻辑运算符Xor的转换问提,向PB大师求救
- 为什么在派生类的时候找不到CWnd?
- 在哪有《inside visual c++》源码下载 ?
- 通过代理服务器如何玩联众游戏??
- 为何activex控件不能接收消息
- 非服务程序,如何自己通过命令方式 让自己退出??
- 求助!关于安装Codejock.Xtreme.Toolkit.Pro.v15.0.1的问题
- 请问关于数据库
- 请问VC FORM之间如何传参数
- msflxgrd.ocx控件问题
LRESULT CTestUSBDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message == WM_DEVICECHANGE) //0x8000,0x8004
{
CString str;
DEV_BROADCAST_HDR* dhr = (DEV_BROADCAST_HDR *)lParam;
switch(wParam)
{
case DBT_CONFIGCHANGECANCELED:
TRACE("DBT_CONFIGCHANGECANCELED");
break;
case DBT_CONFIGCHANGED:
TRACE("DBT_CONFIGCHANGED");
break;
case DBT_DEVICEQUERYREMOVE:
TRACE("DBT_DEVICEQUERYREMOVE");
break;
case DBT_DEVICEQUERYREMOVEFAILED:
TRACE("DBT_DEVICEQUERYREMOVEFAILED");
break;
case DBT_DEVICEREMOVEPENDING:
TRACE("DBT_DEVICEREMOVEPENDING");
break;
case DBT_DEVICETYPESPECIFIC:
TRACE("DBT_DEVICETYPESPECIFIC");
break;
case DBT_QUERYCHANGECONFIG:
TRACE("DBT_QUERYCHANGECONFIG");
break;
case DBT_USERDEFINED:
TRACE("DBT_USERDEFINED");
break;
case DBT_DEVICEARRIVAL:
if(dhr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)dhr;
if(lpdbv->dbcv_flags & DBTF_MEDIA)
{
str.Format("Drive %c 插入", FirstDriveFromMask(lpdbv ->dbcv_unitmask));
//AfxMessageBox(str);
}
else
{
char ch = FirstDriveFromMask(lpdbv ->dbcv_unitmask);
str.Format("%c:\\",ch);
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if(dhr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)dhr;
if(lpdbv->dbcv_flags & DBTF_MEDIA)
{
str.Format("Drive %c 拔除",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
}
else
{
str.Format("Drive %c 拔除",FirstDriveFromMask(lpdbv ->dbcv_unitmask));
}
//AfxMessageBox(str);
}
break;
default:
break;
}
}
return CDialog::WindowProc(message, wParam, lParam);
}
BOOL GetExistingDevicePortName(LPTSTR dwHardwareID, LPTSTR szPortName, SIZE_T lpcbPortName)
{
ZeroMemory(szPortName, lpcbPortName); HDEVINFO DeviceInfoSet = SetupDiGetClassDevs(NULL, 0, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT); if (DeviceInfoSet == INVALID_HANDLE_VALUE)
{
return FALSE;
} BOOL Found = FALSE;
DWORD i = 0, err = 0;
SP_DEVINFO_DATA DeviceInfoData; DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
while ( !Found && SetupDiEnumDeviceInfo(DeviceInfoSet, i++, &DeviceInfoData))
{
DWORD DataT = 0;
LPTSTR p = NULL, buffer = NULL;
DWORD buffersize = 0; while (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)buffer, buffersize, &buffersize))
{
if (GetLastError() == ERROR_INVALID_DATA)
{
break;
}
else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
if (buffer)
LocalFree(buffer); buffer = (char *)LocalAlloc(LPTR,buffersize);
}
else
{
err = 1;
break;
}
} if (GetLastError() == ERROR_INVALID_DATA)
continue; if (err)
break; for (p = buffer; *p && (p < &buffer[buffersize]); p += lstrlen(p) + sizeof(TCHAR))
{
if (!_tcsicmp(dwHardwareID, p))
{
Found = TRUE;
break;
}
} if (buffer)
LocalFree(buffer);
} if (Found)
{
HKEY DeviceKey = SetupDiOpenDevRegKey(DeviceInfoSet, &DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ);
if (DeviceKey != INVALID_HANDLE_VALUE)
{
TCHAR chPortName[MAX_PATH];
DWORD lType = 0, lpcbData = MAX_PATH; if (RegQueryValueEx(DeviceKey, "PortName", NULL, &lType, (PBYTE)chPortName, &lpcbData) == ERROR_SUCCESS)
{
if (lpcbPortName >= lpcbData)
CopyMemory(szPortName, chPortName, lpcbData);
}
RegCloseKey(DeviceKey);
}
} err = GetLastError();
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
SetLastError(err); return err == NO_ERROR;
}
另外你说的“USB的串口”,什么意思
添加里面的“ EnumSerial.cpp ”和“ EnumSerial.h ”两个文件,并且将 Setupapi.lib 包含进你的工程文件中就行了 调用方式如下: CArray<SSerInfo,SSerInfo&> asi;
// Populate the list of serial ports.
EnumSerialPorts(asi,FALSE/*include all*/); for (int ii=0; ii<asi.GetSize(); ii++) {
CString str = (asi[ii].strFriendlyName);
}返回的字符串含有你需要的信息"USB Serial Port(COM1)"
没有关系,一般的串口和usb转换串口的描述信息是不一样的,
CArray<SSerInfo,SSerInfo&> asi;
// Populate the list of serial ports.
EnumSerialPorts(asi,FALSE/*include all*/); for (int ii=0; ii<asi.GetSize(); ii++)
{
CString str = (asi[ii].strFriendlyName); if (str.Find("USB Serial Port") != -1 )
{
MessageBox("此串口为usb串口");
}
}
这样如果不是插入usb串口,根本就不会进行串口枚举
代码贴出来:
BOOL CMainFrame::OnDeviceChange( UINT nEventType, DWORD dwData)
{
PDEV_BROADCAST_HDR pDevBroadcastHdr;
PDEV_BROADCAST_VOLUME pDevBroadcastVolume;
PDEV_BROADCAST_PORT pDevPort;
CString strVolume="";
switch (nEventType)
{
case DBT_DEVICEARRIVAL:
pDevBroadcastHdr = (PDEV_BROADCAST_HDR) dwData;
pDevPort = (PDEV_BROADCAST_PORT)pDevBroadcastHdr;
if (pDevBroadcastHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
pDevBroadcastVolume = (PDEV_BROADCAST_VOLUME)pDevBroadcastHdr;
xJudgeDeviceChangePath(pDevBroadcastVolume->dbcv_unitmask,strVolume);
}
else if(pDevBroadcastHdr->dbch_devicetype == DBT_DEVTYP_PORT)
{
//串口
AfxMessageBox(pDevPort->dbcp_name);
}
break;
default:
break;
}
return TRUE;
}
这个代码参考了网上的还有CODEproject上的代码,揭贴了,呵呵