Почему после инициализации расширений Wintab я не получаю сообщений окна WT_PACKETEXT? - PullRequest
0 голосов
/ 21 октября 2019

В настоящее время я пытаюсь обработать абсолютное значение сенсорного кольца графического планшета через Wintab API. Однако, несмотря на следующие инструкции, как они описаны в документации, похоже, что вызов WTOpen не устанавливает никаких настроек расширения. Использование сенсорного кольца после инициализации Wintab по-прежнему вызывает события по умолчанию, в то время как события по умолчанию для перьевых входов подавляются, и вместо этого все перьевые входы относятся к моему приложению.

Вот соответствующие сегменты кода:

...

#include "wintab.h"
#define PACKETDATA (PK_X | PK_Y | PK_Z | PK_NORMAL_PRESSURE | PK_ORIENTATION | PK_TIME | PK_BUTTONS)
#define PACKETMODE 0
#define PACKETTOUCHSTRIP PKEXT_ABSOLUTE
#define PACKETTOUCHRING PKEXT_ABSOLUTE
#include "pktdef.h"

...

internal b32
InitWinTab(HWND Window, window_mapping *Map)
{
    if(!LoadWintabFunctions())
        return false;

    LOGCONTEXT Tablet;
    AXIS TabletX, TabletY, TabletZ, Pressure;

    if(!gpWTInfoA(WTI_DEFCONTEXT, 0, &Tablet))
        return false;
    gpWTInfoA(WTI_DEVICES, DVC_X, &TabletX);
    gpWTInfoA(WTI_DEVICES, DVC_Y, &TabletY);
    gpWTInfoA(WTI_DEVICES, DVC_Z, &TabletZ);
    gpWTInfoA(WTI_DEVICES, DVC_NPRESSURE, &Pressure);

    UINT TouchStripOffset = 0xFFFF;
    UINT TouchRingOffset = 0xFFFF;
    for(UINT i = 0, ScanTag = 0; gpWTInfoA(WTI_EXTENSIONS + i, EXT_TAG, &ScanTag); i++)
    {
        if (ScanTag == WTX_TOUCHSTRIP)
            TouchStripOffset = i;
        if (ScanTag == WTX_TOUCHRING)
            TouchRingOffset = i;
    }

    Tablet.lcOptions |= CXO_MESSAGES;
    Tablet.lcPktData = PACKETDATA;
    Tablet.lcPktMode = PACKETMODE;
    Tablet.lcMoveMask = PACKETDATA;
    Tablet.lcBtnUpMask = Tablet.lcBtnDnMask;
    Tablet.lcInOrgX = 0;
    Tablet.lcInOrgY = 0;
    Tablet.lcInExtX = TabletX.axMax;
    Tablet.lcInExtY = TabletY.axMax;

    if(TouchStripOffset != 0xFFFF)
    {
        WTPKT DataMask;
        gpWTInfoA(WTI_EXTENSIONS + TouchStripOffset, EXT_MASK, &DataMask);
        Tablet.lcPktData |= DataMask;
    }
    if(TouchRingOffset != 0xFFFF)
    {
        WTPKT DataMask;
        gpWTInfoA(WTI_EXTENSIONS + TouchRingOffset, EXT_MASK, &DataMask);
        Tablet.lcPktData |= DataMask;
    }

    Map->AxisMax.x = (r32)TabletX.axMax;
    Map->AxisMax.y = (r32)TabletY.axMax;
    Map->AxisMax.z = (r32)TabletZ.axMax;
    Map->PressureMax = (r32)Pressure.axMax;

    if(!gpWTOpenA(Window, &Tablet, TRUE))
        return false;

    return(TabletX.axMax && TabletY.axMax && TabletZ.axMax && Pressure.axMax);
}

...

        case WT_PACKET:
        {
            PACKET Packet;
            if(gpWTPacket((HCTX)LParam, (UINT)WParam, &Packet)) 
            {
                ...
            }
        } break;

        case WT_PACKETEXT:
        {
            PACKETEXT Packet;
            if(gpWTPacket((HCTX)LParam, (UINT)WParam, &Packet)) 
            {
                ...
            }
        } break;

...

Битовая маска для пакетных данных при инициализации имеет разумные биты, установленные для обоих расширений, и не перекрываются с существующей битовой маской. Никакая стадия инициализации не проходит. WT_PACKET вызывается только с действительными пакетными данными, тогда как WT_PACKETEXT никогда не вызывается. Кроме того, вызов WTPacketsGet с указателем PACKETEXT на HCTX, возвращаемом WTOpen, заполняет пакет мусором из обычной очереди пакетов. Это оставляет меня с выводом, что каким-то образом WTOpen не получил уведомление о том, что расширения должны быть загружены, и я не могу найти то, что еще я должен определить в структуре данных LOGCONTEXT, чтобы изменить это.

Есть лиошибка в моей инициализации? Или есть способ получить лучшее представление о том, почему расширения не загружались?

1 Ответ

0 голосов
/ 23 октября 2019

Оказалось, что настройка драйвера предотвращает отправку пакетов расширения, в пользу использования сенсорного кольца для другой функции. Изменение этого параметра решило проблему. Сам код не содержал никаких ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...