启用和禁用USB端口

谁能告诉我如何使用C / C ++来启用和禁用USB端口。

我已经search了一种方法来做到这一点..使用Windowsregistry,但也有一些问题。

HKEY_LOCAL_MACHINE \系统\ CurrentControlSet \服务\ USBSTOR

将开始值的值更改为3 —-取消阻止4 —-阻止

它不显示在Windows 7上的正确行为。例如,当我将开始值的值更改为4时,禁用USB端口,但再次启用,我们需要重新启动系统,禁用所有端口后仍然有一件事情,但仍然我们能够使用已经插入的设备。

任何其他方式来做到这一点?

Solutions Collecting From Web of "启用和禁用USB端口"

我已经找到了使用devcon实用程序的另一个解决方案。 它提供了各种命令来启用和禁用USB设备。

http://msdn.microsoft.com/en-us/library/windows/hardware/ff544746(v=vs.85).aspx#ddk_example_31_disable_devices_by_device_instance_id_tools

但它需要运行命令的管理权限,我没有这个源代码。

所以我想问你所有的一件事..我听说libusb-win32库为编写USB设备编程。

所以有人有这个想法..

任何帮助将不胜感激..

谢谢你们..

这是真正的回答关于重新设备检测问题的意见。

在控制台应用程序中创建一个隐藏窗口。

这个例子假定你有一个名为DevNotifier的类,它有一个HWND hidden_wnd_; 成员变量:

 static TCHAR const s_window_class[] = _T("Device notification window"); static TCHAR const* const s_window_title = s_window_class; LRESULT CALLBACK DevNotifierWndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { DevNotifier* dn = (DevNotifier*) ::GetWindowLongPtr(hWnd, GWLP_USERDATA); switch (message) { case WM_DEVICECHANGE: dn->onWM_DEVICECHANGE( wParam, lParam ); break; default: return ::DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void DevNotifier::createHiddenWindow() { HINSTANCE hinstance = ::GetmoduleeHandle(NULL); if ((hinstance == 0) || (hinstance == INVALID_HANDLE_VALUE)) { throw Exception("Failed to get application instance handle."); } // register window class WNDCLASSEX wcex; ::memset(&wcex, 0, sizeof(wcex)); wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = 0; wcex.lpfnWndProc = &DevNotifierWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hinstance; wcex.hIcon = 0; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = 0; wcex.lpszMenuName = 0; wcex.lpszClassName = s_window_class; wcex.hIconSm = 0; (void) ::RegisterClassEx(&wcex); // Create the window hidden_wnd_ = ::CreateWindow( s_window_class, s_window_title, WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance, NULL ); if (!hidden_wnd_) { throw Exception("Failed to create device notification window"); } #ifdef _WIN64 ::SetWindowLongPtr(static_cast<HWND>(hidden_wnd_), GWLP_USERDATA, (LONG_PTR)this); #else ::SetWindowLongPtr(static_cast<HWND>(hidden_wnd_), GWLP_USERDATA, (LONG)this); #endif ::ShowWindow(static_cast<HWND>(hidden_wnd_), SW_HIDE); } 

您可以在hidden_​​wnd_上注册通知。
例如

  DEV_BROADCAST_DEVICEINTERFACE filter; ZeroMemory(&filter, sizeof(filter)); filter.dbcc_size = sizeof(filter); filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; filter.dbcc_classguid = /* SOME INTERFACE GUID */; HDEVNOTIFY hdn = ::RegisterDeviceNotification( hidden_wnd_, &filter, DEVICE_NOTIFY_WINDOW_HANDLE ); 

你需要实现处理WM_DEVICE_CHANGE消息的函数:

 bool DevNotifier::onWM_DEVICECHANGE(WPARAM wparam, LPARAM lparam) { DEV_BROADCAST_HDR* dbh = (DEV_BROADCAST_HDR*)lparam; // Note dbh will NOT always be valid, depending upon the value of wparam. if (wparam == DBT_DEVNODES_CHANGED) { // Do some stuff here return true; } else if (wparam == DBT_DEVICEARRIVAL) { DEV_BROADCAST_HDR* hdr = (DEV_BROADCAST_HDR*)lparam; if (hdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { DEV_BROADCAST_DEVICEINTERFACE* devinterface = (DEV_BROADCAST_DEVICEINTERFACE*)hdr; // Do some stuff here } } else if (wparam == DBT_DEVICEREMOVEPENDING) { } else if (wparam == DBT_DEVICEREMOVECOMPLETE) { HANDLE h = INVALID_HANDLE_VALUE; DEV_BROADCAST_HDR* phdr = (DEV_BROADCAST_HDR*) lparam; if (phdr->dbch_devicetype == DBT_DEVTYP_HANDLE) { DEV_BROADCAST_HANDLE* pdbh = (DEV_BROADCAST_HANDLE*) lparam; h = pdbh->dbch_handle; } else if (phdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { DEV_BROADCAST_DEVICEINTERFACE* devinterface = (DEV_BROADCAST_DEVICEINTERFACE*)phdr; // Do some stuff here } // Maybe do some stuff here too. } return false; } 

在您的控制台应用程序中,您将不得不运行消息泵来获取Windows消息。 如果在应用程序正在等待消息的时候你还有其他的东西要做,那么你也需要在这里处理。

 while (GetMessage(&message, NULL, 0, 0) > 0) { TranslateMessage(&message); DispatchMessage(&message); }