У меня есть программа на C ++, которая перечисляет все устройства ввода (используя прямой ввод) в начале программы. Если программа запускается, а затем я подключаю другой контроллер, этот контроллер не будет распознан, пока программа не будет перезапущена. Кто-нибудь знает событие, которое я могу использовать, которое заставит мою программу перечислять все устройства после того, как новое будет подключено?
Эта статья обсуждает, как обнаружить изменения игровой площадки. Прежде всего, вы можете справиться с WM_DEVICECHANGE
сообщение и проверка wParam
за DBT_DEVICEARRIVAL
или же DBT_DEVICEREMOVECOMPLETE
, Кажется, что для того, чтобы получить их как WPARAM
с, однако, вам нужно позвонить RegisterDeviceNotification
первый.
В статье показано, как это сделать:
DEV_BROADCAST_DEVICEINTERFACE notificationFilter;
ZeroMemory(¬ificationFilter, sizeof(notificationFilter));
notificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
notificationFilter.dbcc_size = sizeof(notificationFilter);
HDEVNOTIFY hDevNotify;
hDevNotify = RegisterDeviceNotification(m_hWnd, ¬ificationFilter,
DEVICE_NOTIFY_WINDOW_HANDLE |
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
if(hDevNotify == NULL) {
// do some error handling
}
Единственное, на что следует обратить внимание, это то, что минимально поддерживаемой ОС для этого является XP, поэтому вам нужно поставить соответствующую #define
для этого, прежде чем включать заголовки Windows.
В зависимости от того, что вы хотите сделать, вам может даже не понадобиться сначала вызывать эту функцию. Вместо этого вы можете просто проверить DBT_DEVNODES_CHANGED
не делать различий между подключенным или отключенным устройством. Это может сохранить некоторый код, если вам все равно.
Других решений пока нет …