Я пытаюсь получить координаты касания от точных сенсорных панелей с 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
³
Я сделал что-то не так? У кого-нибудь есть идеи?
Зов вашей программы
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 Обязательно
Других решений пока нет …