本代码可以监测USB状态的变化 启动VC,新建一个MFC的EXE程序,命名为USBListening,选择Dialog bassed, 其余默认,点击Finished 在绿字下面添加如下红色代码 / // CUSBListeningDlg message handlers #i nclude "Dbt.h" #i nclude <malloc.h> #i nclude <Rpcdce.h> #pragma comment(lib,"Rpcrt4.lib") PVOID g_hNotifyDevNode; void CUSBListeningDlg::RegisterForDevChange(HWND hDlg, PVOID *hNotifyDevNode) { DEV_BROADCAST_DEVICEINTERFACE *pFilterData = (DEV_BROADCAST_DEVICEINTERFACE*) _alloca(sizeof(DEV_BROADCAST_DEVICEINTERFACE)); ASSERT (pFilterData); UUID GUID_CLASS_INPUT; UuidFromString((unsigned char*)"36FC9E60-C465-11CF-8056-444553540000", &GUID_CLASS_INPUT); ZeroMemory(pFilterData, sizeof(DEV_BROADCAST_DEVICEINTERFACE)); pFilterData->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); pFilterData->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; pFilterData->dbcc_classguid = GUID_CLASS_INPUT; /* USB dbcc_classguid :{36FC9E60-C465-11CF-8056-444553540000} 可以在注册表中查询 HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Enum/USB/ROOT_HUB 此键值下面有你的设备列表你可以查到的,只能用那个*/ *hNotifyDevNode = RegisterDeviceNotification(hDlg, pFilterData, DEVICE_NOTIFY_WINDOW_HANDLE); } //使用向导,添加DefWindowProc函数 LRESULT CUSBListeningDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DEVICECHANGE: { switch (wParam) { case DBT_DEVICEARRIVAL: // Handle device arrival MessageBox("Handle device arrival"); break; case DBT_DEVICEQUERYREMOVE: // Handle device removal request MessageBox("Handle device removal request"); break; case DBT_DEVICEREMOVECOMPLETE: // Handle device removal MessageBox("Handle device removal"); break; } } } return CDialog::DefWindowProc(message, wParam, lParam); } //在OnInitDialog函数中添加RegisterForDevChange函数 BOOL CUSBListeningDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here RegisterForDevChange(m_hWnd,&g_hNotifyDevNode); return TRUE; // return TRUE unless you set the focus to a control } |