将PT_TOUCH注入事件转换为WM_TOUCH事件

时间:2018-10-23 18:01:45

标签: c++ winapi

是否可以将PT_TOUCH事件“转换”为WM_TOUCH事件?

要弄清为什么我需要这样做,请在下面的文本中涂红色(不必要):

这个问题的原因是我在一个试图从Window回调中捕获msg参数的项目中使用了旧的WINUSER.h(这两个已经过测试并且可以正常工作)。

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事件也可以,我只需要支持一个额外的信息(具有鼠标事件)和多点触控支持-在这种情况下,我不确定鼠标可以处理。

1 个答案:

答案 0 :(得分:0)

其中可能没有用。

按照iinspectable的建议,升级您的SDK,即可使用WM_TOUCH和PT_TOUCH。

如果升级SDK不起作用,请确保仔细检查项目中的预建库/错误的项目设置,因为升级SDK后解决了我的外部符号无法解析的问题。