Преобразовать введенное событие PT_TOUCH в событие WM_TOUCH - PullRequest
0 голосов
/ 23 октября 2018

Есть ли способ "перевести" событие PT_TOUCH в событие WM_TOUCH?

Чтобы выяснить, почему я должен это сделать, пожалуйста, выделите красный текст ниже (не обязательно):

Причина этого вопроса в том, что я использую старый WINUSER.h в проекте, в котором я пытаюсь перехватить параметры msg из обратного вызова Window (эти два проверены и работают).

LRESULT CALLBACK WinProc(HWND hWnd, unsigned int msg, WPARAM wp, LPARAM lp)

switch (msg)    {

    case WM_MOUSEMOVE: {        
        doSomething;
        break; }

    case WM_TOUCH:  {   
        doSomethingElse;
        break;  }
}

Я внедряю входные данные PT_TOUCH из другого проекта, который имеет более новую версию заголовка WINUSER.h, который уже имеет реализацию PT_TOUCH.(Я перевожу некоторые входные данные, прочитанные этим проектом, на сенсорные события).Так что это выглядит примерно так:

POINTER_TOUCH_INFO contact;
ZeroMemory(&contact, sizeof(POINTER_TOUCH_INFO));

InitializeTouchInjection(1, TOUCH_FEEDBACK_DEFAULT); 
memset(&contact, 0, sizeof(POINTER_TOUCH_INFO));

contact.pointerInfo.pointerType = PT_TOUCH;
contact.pointerInfo.pointerId = 0;  
contact.touchFlags = TOUCH_FLAG_NONE;
contact.touchMask = TOUCH_MASK_CONTACTAREA | TOUCH_MASK_ORIENTATION | TOUCH_MASK_PRESSURE;

contact.orientation = 90; 

contact.pressure = channelPressForce;

contact.pointerInfo.ptPixelLocation.y = ((pressTouch.getTouchX(selected) * 0x7FFF) / (GetSystemMetrics(SM_CXSCREEN) - 1)); 
contact.pointerInfo.ptPixelLocation.x = ((pressTouch.getTouchY(selected) * 0x7FFF) / (GetSystemMetrics(SM_CXSCREEN) - 1)); 
                    // defining contact area (I have taken area of 8 x 8 pixel)
contact.rcContact.top = contact.pointerInfo.ptPixelLocation.y - 4;
contact.rcContact.bottom = contact.pointerInfo.ptPixelLocation.y + 4;
contact.rcContact.left = contact.pointerInfo.ptPixelLocation.x - 4;
contact.rcContact.right = contact.pointerInfo.ptPixelLocation.x + 4;

contact.pointerInfo.pointerFlags = POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT | POINTER_FLAG_DOWN;// | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT;
InjectTouchInput(1, &contact); // Injecting the touch down on screen
printf("SENT TOUCH DOWN EVENT \n");

Я считаю, что код работает правильно, так как вместо этого я попытался внедрить события MOUSE без проблем.(Даже несмотря на то, что я мог видеть результаты событий MOUSE на своем экране - как будто я щелкал - но по какой-то причине я не вижу результатов введенных событий TOUCH).

Некоторая ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Простое обновление проекта с более новой версией заголовка, к сожалению, не вариант (AFAIK).

Это не обязательно должно быть событие WM_TOUCH, ничего страшного, если это событие WM_MOUSE, все что мне нужноэто поддержка одной дополнительной информации (которая есть у события мыши) и поддержка Multi-Touch - в этом случае я не уверен, что мышь справится с этим.

1 Ответ

0 голосов
/ 25 октября 2018

Возможно, в этом нет смысла.

Вместо этого обновите свой SDK, как предложено iinspectable, и вы сможете использовать как WM_TOUCH, так и PT_TOUCH.

И убедитесь, что дважды проверили предварительно созданные библиотеки / неправильные настройки проекта в вашем проекте, если обновление SDK не работает, поскольку это решило мою проблему с неразрешенными внешними символами после обновления Project SDK.

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