Использование joyGetPosEx не работает при переключении USB-порта джойстика

Я использую функцию «joyGetPosEx» для обнаружения входов джойстика:

JOYINFOEX joyInfoEx;
ZeroMemory(&joyInfoEx, sizeof(joyInfoEx));
joyInfoEx.dwSize = sizeof(joyInfoEx);
// poll for values
joyGetPosEx(JOYSTICKID1, &joyInfoEx);

Когда джойстик подключен, все работает нормально, и функция возвращает «JOYERR_NOERROR».

Однако, если во время работы программы я отключу джойстик и подключу его к другому USB-порту, "joyGetPosEx(JOYSTICKID1, &joyInfoEx);" продолжает возвращать значение "JOYERR_UNPLUGGED".

Если я снова подключу устройство к начальному USB-порту, оно снова начнет работать.

Кто-нибудь знает, как заставить джойстик работать даже при подключении к новому порту?

Заранее спасибо!


person Costya    schedule 24.06.2011    source источник
comment
Не имеет отношения к вашему вопросу, но, к вашему сведению, JOYINFOEX joyInfoEx; ZeroMemory(&joyInfoEx, sizeof(joyInfoEx)); joyInfoEx.dwSize = sizeof(joyInfoEx); можно выразить более кратко как JOYINFOEX joyInfoEx = { sizeof(JOYINFOEX) };. Вы пишете на C++, а не на C... ;-]   -  person ildjarn    schedule 25.06.2011
comment
Спасибо, хорошая мысль, но мне все равно не помогает :)   -  person Costya    schedule 25.06.2011
comment
Трудно понять, насколько это реальная проблема. Обратитесь за поддержкой к производителю драйвера.   -  person Hans Passant    schedule 25.06.2011


Ответы (1)


Я бы сказал, что у вас есть USB-устройство без серийного номера, поэтому Windows идентифицирует его по месту подключения. Оно случайно не начинает действовать как JOYSTICKID2?


В конце концов мы обнаружили, что функция joyConfigChanged может переподключать джойстик. [MSDN говорит, что для использования этой функции необходимо #include <dinput.h>, как оказалось, важен порядок включения: сначала mmsystem.h, затем dinput.h.

person Ben Voigt    schedule 25.06.2011
comment
Это была моя первая мысль, поэтому я провел опрос для всех возможных устройств (от JOYSTICKID1 до JOYSTICKID1+15). JOYSTICKID1 продолжает возвращать JOYERR_UNPLUGGED, а остальные просто возвращают JOYERR_PARMS. Это также происходит, если я подключаю другой тип джойстика, он все равно не распознается. Только когда оригинальный джойстик повторно подключается к исходному порту, он снова начинает работать правильно. - person Costya; 25.06.2011
comment
Вам нравится joyConfigChanged? (да, плохой каламбур) - person Ben Voigt; 25.06.2011
comment
По какой-то причине я не могу вызвать функцию joyConfigChanged. Я включаю MMSystem.h и связываюсь с winmm.lib, но когда я пытаюсь вызвать функцию joyConfigChanged, я получаю: ошибка C3861: 'joyConfigChanged': идентификатор не найден. Когда я смотрю на файл MMSystem.h, функция действительно не определена. Любая мысль? - person Costya; 25.06.2011
comment
Я включаю dinput.h. Вот мои включения: #define DIRECTINPUT_VERSION 0x0800 #include <dinput.h> #include <MMSystem.h> Однако, если я добавлю #define _INC_MMSYSTEM, который необходим для определения joyConfigChanged, мой код не скомпилируется. - person Costya; 25.06.2011
comment
@Costya: Возможно, вы должны включить mmsystem.h перед dinput.h? - person Ben Voigt; 25.06.2011
comment
@ Ben Voigt Хорошо, это сработало. Как я подозревал, и как вы сказали, нужен вызов функции joyConfigChanged. Я предполагаю, что это сбрасывает все и позволяет опрашивать джойстик с нового USB-порта. Мне не хватило еще одного включения, а именно #include <WTypes.h>, чтобы все компилировалось и работало как надо. Вот как выглядит мой окончательный вариант: #define DIRECTINPUT_VERSION 0x0800 #include <WTypes.h> #include <MMSystem.h> #include <dinput.h> Спасибо, ваши комментарии были более чем полезны!!! - person Costya; 25.06.2011
comment
Пожалуйста. Я обновлю ответ этой новой информацией. - person Ben Voigt; 25.06.2011