Roger1990 Ответов: 1

ERROR_INVALID_PARAMETER при вызове getpointerdevicerects


Я пытаюсь вызвать API GetPointerDeviceRects на языке c++, чтобы получить диапазон сенсорного дигитайзера. Для этого требуется 3 параметра. Одна из них-ручка. Мне удалось получить правильный дескриптор устройства с помощью GetRawInputDeviceList. Что касается других параметров, я объявил их, как показано в приведенном ниже фрагменте кода. Я получаю код ошибки 87, что означает недопустимый параметр. Не могли бы вы помочь мне устранить эту ошибку?

Что я уже пробовал:

<pre>RECT   pointerDeviceRect;
RECT   displayRect;
GetPointerDeviceRects(device, &pointerDeviceRect, &displayRect);
cout << "get pointer device rects error code " << GetLastError() << endl;
cout << "coordinates: " << pointerDeviceRect.top<<endl;


Часть кода для получения дескриптора

for (vector<RAWINPUTDEVICELIST>::iterator device_iterator(input_devices.begin());
            device_iterator != input_devices.end();
            ++device_iterator)
        {
            UINT info_size(sizeof(RID_DEVICE_INFO));
            if (GetRawInputDeviceInfo(device_iterator->hDevice, RIDI_DEVICEINFO, (LPVOID)&device_info, &info_size) == info_size)
            {
                // non-keyboard, non-mouse HID device?
                if (device_info.dwType == RIM_TYPEHID)
                {
                    if ((device_info.hid.dwVendorId == VENDOR_ID)
                        && (device_info.hid.dwProductId == PRODUCT_ID))
                    {
                        deviceHandle = device_iterator->hDevice;
                        break;
                    }
                }
            }
        }

CHill60

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

Roger1990

Я обновил это в вопросе для вас

1 Ответов

Рейтинг:
0

Jochen Arndt

Такие ошибки возникают, когда один из параметров не проходит внутреннюю проверку функций Windows API. В большинстве случаев - кроме недопустимого дескриптора, который имеет ERROR_INVALID_HANDLE код и передача нулевых указателей, что очевидно - член передаваемой структуры не задан должным образом.

Прочтите документацию по этой функции. При передаче структур - соответственно указателей на структуры - часто требуется очистить элементы и инициализировать элемент размера, если он присутствует. Последнее имеет место и здесь:

pData [вход, выход, опционально]

Тип: LPVOID

Указатель на буфер, содержащий информацию, заданную командой uiCommand. Если uiCommand является RIDI_DEVICEINFO, установите член cbSize RID_DEVICE_INFO в sizeof(RID_DEVICE_INFO) перед вызовом GetRawInputDeviceInfo.
Так что используйте что-то вроде
// Clearing the struct is optional here but does not harm
RID_DEVICE_INFO device_info = {};
UINT info_size = device_info.cbSize = sizeof(device_info);
int result = GetRawInputDeviceInfo(device_iterator->hDevice, RIDI_DEVICEINFO, &device_info, &info_size);


[РЕДАКТИРОВАТЬ]
Вы не показали полную связь между получением дескриптора устройства и вызовом GetPointerDeviceRects().

Но все твои призывы к GetRawInputDeviceInfo() терпят неудачу с ошибкой ERROR_INVALID_PARAMETER так что ваш deviceHandle переменная никогда не устанавливается / не изменяется.

Помимо передачи неправильно инициализированной структуры, вы допустили еще одну ошибку:
Вы не справились с ошибкой должным образом, когда она произошла. Значение, возвращаемое с помощью GetLastError() никогда не очищается, а устанавливается только при сбое функции API. Поэтому вы должны вызывать его только тогда, когда функция API указывает на сбой по возвращаемому значению. И он должен быть вызван перед вызовом любой другой функции API (что обычно означает: любая другая функция, потому что они также могут вызывать функции API).
[/РЕДАКТИРОВАТЬ]