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

Фон

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


Исследовать

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

Я могу получить данные с этими идентификаторами использования и страницами из 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
³

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


person Benny10033    schedule 29.10.2017    source источник
comment
Забыл добавить: я хочу получить данные с программой в фоновом режиме. Поэтому я не могу использовать Windows Touch API.   -  person Benny10033    schedule 30.10.2017
comment
В Precision TouchPad сейчас отсутствует API. Проголосуйте здесь, чтобы сообщить Microsoft, что он нам нужен: aka.ms/Uun1l5   -  person m93a    schedule 05.01.2018
comment
Мне нужно извлечь [X, Y] таким же образом, но для моего монитора с сенсорным экраном.   -  person Xdg    schedule 26.02.2019


Ответы (2)


Пакет с минимальным Contact ID, x, y, Contact, Scan может содержать несколько триплетов Contact ID, x, y для нескольких точек, а затем должен использоваться valueCaps[i].LinkCollection из массива valueCaps[], который увеличивается с 1 до пять баллов.

HidP_GetUsageValue
(
    HidP_Input, 
    valueCaps[i].UsagePage, 
    valueCaps[i].LinkCollection, //** !!!!!
    valueCaps[i].NotRange.Usage, 
    &value, 
    preparsedData, 
    (PCHAR)raw->data.hid.bRawData, 
    raw->data.hid.dwSizeHid
);

Координаты находятся в массиве, если valueCaps[i].UsagePage = 1 и valueCaps[i].NotRange.Usage = 0x30 (x), valueCaps[i].NotRange.Usage = 0x30 (y)

Очень важны xLogicalMin, yLogicalMin, xLogicalMax, yLogicalMax в массиве valueCaps[i]

    xLogicalMin = valueCaps[i].LogicalMin;
    xLogicalMax = valueCaps[i].LogicalMax;
    xPhysicalMin = valueCaps[i].PhysicalMin;
    xPhysicalMax = valueCaps[i].PhysicalMax;

Все выделенные места должны быть правильно освобождены !!!!!

Нажатие на точки по периметру сенсорной панели для запуска нескольких функций или ячейки сетки на сенсорной панели, как на ASUS NumberPad, также с ограниченными функциями емкостного и активного пера, движение одним пальцем, перемещение по четырем сторонам сенсорной панели для прокрутки/масштабирования, перемещение курсора одним палец и щелчок, нажатие, нажатие плюс перемещение, двойной щелчок, щелчок плюс нажатие вторым пальцем. Количество операций с двумя пальцами увеличено на пространстве пальцев, близком или дальнем, возможном с координатами. С координатами, временем в Сканировании и контактами в Контакте доступны все возможные сложные жесты на тачпаде.

person Alexander    schedule 26.06.2020

Вызов вашей программы

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[i].UsagePage, 0, valueCaps[i].NotRange.Usage, &value, preparsedData, (PCHAR)raw->data.hid.bRawData, raw->data.hid.dwSizeHid );

с 1/30ч, 1/31ч

соответствующий

_Must_inspect_result_ NTSTATUS __stdcall HidP_GetUsageValue( In HIDP_REPORT_TYPE ReportType, In USAGE UsagePage, _In_opt_ USHORT LinkCollection, In USAGE Usage, Out PULONG UsageValue, In PHIDP_PREPARSED_DATA PreparsedData, _In_reads_bytes_(ReportLength) PCHAR Report, In ULONG ReportLength );

и значение ( UsageValue ) должно быть ДЛИННЫМ !!!!!.

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

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

person Alexander Alexander    schedule 05.07.2018
comment
Константы для HID API находятся в заголовочном файле hidusage.h и input.inf ( HIDClass ) в системном каталоге windows\inf Координаты и контактная информация могут использоваться для создания новых щелчков и жестов для сенсорной панели, например. вращение. - person Alexander Alexander; 08.07.2018
comment
В UWP есть пространство имен Windows.​Devices.​Human​Interface​Device и класс Hid​Device. - person Alexander Alexander; 11.07.2018
comment
Касание в разных местах сенсорной панели может инициировать несколько команд - person Alexander Alexander; 25.07.2018
comment
Координаты находятся в пределах значений valueCaps[i].LogicalMin и valueCaps[i].LogicalMax, если valueCaps[i].NotRange.Usage = 0x30 и 0x31. - person Alexander Alexander; 31.07.2018
comment
В этой обработке также доступна новая для тачпада функция нажатия. - person Alexander Alexander; 31.07.2018
comment
Для функции HeapAlloc в образце требуется HeapFree. - person Alexander Alexander; 02.08.2018
comment
Действия касания сенсорной панели ноутбука, обработанные с помощью WM_INPUT — 1 касание пальцем, 2 касания пальца, 1 касание пальца, затем 1 касание пальцем, 2 касания пальца, затем 1 касание пальцем, можно комбинировать со щелчком активного стилуса или бесконтактным движением активного стилуса, обнаруженным также с обработкой WM_INPUT для расширения возможностей Active Stylus для простого, быстрого и легкого взаимодействия с пользователем. - person Alexander Alexander; 31.12.2018
comment
Сравнение координат изменения точки касания тачпада и экранных координат курсора позволяет задать дополнительное перемещение курсора в приложении, например, для охвата всего экрана непрерывным касанием и перемещением по тачпаду. - person Alexander Alexander; 11.05.2021