Координаты X и Y от сенсорной панели Precision с необработанным вводом

Фон

Я пытаюсь получить координаты касания от точных сенсорных панелей с C ++ в Win10 с программой, работающей в фоновом режиме.


Исследование

Сырой ввод можно получить данные в фоновом режиме.

Я могу получить данные с этим идентификатором использования и страницами из Microsoft :

Member  Description                         Page    ID      Mandatory/Optional
X       X coordinate of contact position    0x01    0x30    Mandatory for T Optional for C
Y       Y coordinate of contact position    0x01    0x31    Mandatory for T Optional for C

Я могу поставить их вместе с HIDP_functions, из этот ответ.


Код

case WM_INPUT: {
UINT dwSize;
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
LPBYTE lpb = new BYTE[dwSize];
if (lpb == NULL) {
return 0;
}
RAWINPUT* raw = (RAWINPUT*)lpb;
GetRawInputDeviceInfo(raw->header.hDevice, RIDI_PREPARSEDDATA, NULL, &dwSize);
PHIDP_PREPARSED_DATA preparsedData = (PHIDP_PREPARSED_DATA)HeapAlloc(GetProcessHeap(), 0, dwSize);
GetRawInputDeviceInfo(raw->header.hDevice, RIDI_PREPARSEDDATA, preparsedData, &dwSize);

HIDP_CAPS caps;
HidP_GetCaps(preparsedData, &caps);
USHORT capsLength = caps.NumberInputValueCaps;
PHIDP_VALUE_CAPS valueCaps = (PHIDP_VALUE_CAPS)HeapAlloc(GetProcessHeap(), 0, capsLength*sizeof(HIDP_VALUE_CAPS));

HidP_GetValueCaps(HidP_Input, valueCaps, &capsLength, preparsedData);
for (int i=0; i < capsLength; i++) {
CHAR value;
USHORT valuelength = valueCaps[i].BitSize * valueCaps[i].ReportCount;
HidP_GetUsageValueArray (HidP_Input, valueCaps[i].UsagePage, 0, valueCaps[i].NotRange.Usage, &value, valuelength, preparsedData, (PCHAR)raw->data.hid.bRawData, raw->data.hid.dwSizeHid);
std::cout << valueCaps[i].UsagePage << "  " << valueCaps[i].NotRange.Usage <<std::endl;
std::cout << value << std::endl;

switch(valueCaps[i].NotRange.Usage) {
case 0x30:    // X-axis
std::cout << "X: " << value << std::endl;
break;

case 0x31:    // Y-axis
std::cout << "y: " << value << std::endl;
break;
}
}

}

проблема

Я скомпилировал код и коснулся сенсорной панели, но все выходы:

0  0
³

Я сделал что-то не так? У кого-нибудь есть идеи?

3

Решение

Зов вашей программы

HidP_GetUsageValueArray (HidP_Input, valueCaps [i] .UsagePage, 0, valueCaps [i] .NotRange.Usage, &value, valuelength, preparsedData, (PCHAR) raw-> data.hid.bRawData, raw-> data.hid.dwSizeHid);

возвращает HIDP_STATUS_NOT_VALUE_ARRAY = 0xc011000b

В массиве valueCaps [] на моем ноутбуке с PTP находятся valueCaps [i] .UsagePage = 1 и valueCaps [i] .NotRange.Usage = 0x30 / 0x31. Вы можете использовать простой

HidP_GetUsageValue
(
HidP_Input,
valueCaps [я] .UsagePage,
0,
valueCaps [я] .NotRange.Usage,
&значение,
preparsedData,
(Pchar) raw-> data.hid.bRawData,
raw-> data.hid.dwSizeHid
);

с 1 / 30ч, 1/31ч

соответствует

_Must_inspect_result_
NTSTATUS __stdcall
HidP_GetUsageValue (
В HIDP_REPORT_TYPE ReportType,
В ИСПОЛЬЗОВАНИЕ UsagePage,
_In_opt_ USHORT LinkCollection,
В ИСПОЛЬЗОВАНИЕ Использование,
Из PULONG UsageValue,
В PHIDP_PREPARSED_DATA PreparsedData,
_In_reads_bytes_ (ReportLength) Отчет PCHAR,
В ULONG ReportLength
);

и значение (UsageValue) должно быть LONG !!!!!.

Первое значение в WM_INPUT приходит с UsagePage 0x0D Usage 0x51

Идентификатор контакта Уникально идентифицирует контакт в данном кадре 0x0D 0x51 Обязательно

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]