Я пытался внедрить отдельные контакты (сенсорные события) в Windows 8. Я использую описанный InjectTouchInput Вот, так что я могу ввести два контакта с помощью следующего кода:
#include "stdafx.h"#include <iostream>
#include <string>
#include <sstream>
#include <windows.h>
using namespace std;
class calculate
{
POINTER_TOUCH_INFO contact[2];
public:
calculate(int m);
void setDots(long x, long y, long x2, long y2, int opt, string num_dots);
};
calculate::calculate(int m)
{
}
void calculate::setDots(long x, long y, long x2, long y2, int opt, string num_dots)
{
switch (opt)
{
case 0:
InitializeTouchInjection(2, TOUCH_FEEDBACK_INDIRECT);
memset(&contact[0], 0, sizeof(POINTER_TOUCH_INFO));
memset(&contact[1], 0, sizeof(POINTER_TOUCH_INFO));
contact[0].pointerInfo.pointerType = PT_TOUCH;
contact[0].pointerInfo.pointerId = 0; //Id 0 for contact 0
contact[0].pointerInfo.ptPixelLocation.y = y;
contact[0].pointerInfo.ptPixelLocation.x = x;
contact[0].touchFlags = TOUCH_FLAG_NONE;
contact[0].touchMask = TOUCH_MASK_CONTACTAREA | TOUCH_MASK_ORIENTATION | TOUCH_MASK_PRESSURE;
contact[0].orientation = 90;
contact[0].pressure = 32000;
contact[0].rcContact.top = contact[0].pointerInfo.ptPixelLocation.y - 2;
contact[0].rcContact.bottom = contact[0].pointerInfo.ptPixelLocation.y + 2;
contact[0].rcContact.left = contact[0].pointerInfo.ptPixelLocation.x - 2;
contact[0].rcContact.right = contact[0].pointerInfo.ptPixelLocation.x + 2;
contact[1].pointerInfo.pointerType = PT_TOUCH;
contact[1].pointerInfo.pointerId = 1; //Id 0 for contact 1
contact[1].pointerInfo.ptPixelLocation.y = y2;
contact[1].pointerInfo.ptPixelLocation.x = x2;
contact[1].touchFlags = TOUCH_FLAG_NONE;
contact[1].touchMask = TOUCH_MASK_CONTACTAREA | TOUCH_MASK_ORIENTATION | TOUCH_MASK_PRESSURE;
contact[1].orientation = 90;
contact[1].pressure = 32000;
contact[1].rcContact.top = contact[1].pointerInfo.ptPixelLocation.y - 2;
contact[1].rcContact.bottom = contact[1].pointerInfo.ptPixelLocation.y + 2;
contact[1].rcContact.left = contact[1].pointerInfo.ptPixelLocation.x - 2;
contact[1].rcContact.right = contact[1].pointerInfo.ptPixelLocation.x + 2;
break;
case 1:
contact[0].pointerInfo.ptPixelLocation.y = y;
contact[0].pointerInfo.ptPixelLocation.x = x;
contact[1].pointerInfo.ptPixelLocation.y = y2;
contact[1].pointerInfo.ptPixelLocation.x = x2;
contact[0].pointerInfo.pointerFlags = POINTER_FLAG_DOWN | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT;
contact[1].pointerInfo.pointerFlags = POINTER_FLAG_DOWN | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT;
break;
case 2:
/*if I inject this flag to first contact [0], both points stopped, but I'm able to inject this flag to the second contact [1] and all is OK*/
//contact[0].pointerInfo.pointerFlags = POINTER_FLAG_UP;
contact[0].pointerInfo.pointerFlags = POINTER_FLAG_UPDATE | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT;
contact[1].pointerInfo.pointerFlags = POINTER_FLAG_UPDATE | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT;
//contact[1].pointerInfo.pointerId = 0;
//contact[0].pointerInfo.pointerId = 1;
contact[0].pointerInfo.ptPixelLocation.x =x;
contact[0].pointerInfo.ptPixelLocation.y =y;
contact[1].pointerInfo.ptPixelLocation.x =x2;
contact[1].pointerInfo.ptPixelLocation.y =y2;
//num_dots = "single";
break;
case 3:
contact[0].pointerInfo.pointerFlags = POINTER_FLAG_UP;
contact[1].pointerInfo.pointerFlags = POINTER_FLAG_UP;
break;
}
bool s;
//check how many points to inject
if(num_dots == "single")
s = InjectTouchInput(1, contact);
else
s = InjectTouchInput(2, contact);
if(!s)
{
LPWSTR str = new wchar_t[255];
auto t = GetLastError();
wsprintf(str, L"error: %d\n", t);
OutputDebugString(str);
wsprintf(str, L" action: %d\n", opt);
OutputDebugString(str);
}
else
{
LPWSTR str = new wchar_t[255];
auto t = GetLastError();
wsprintf(str, L"action %d\n", opt);
OutputDebugString(str);
}
if(opt == 2)
Sleep(20);
}int c =0;
int
WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nShowCmd)
{
bool g = true;
POINT ipoint;
POINT point;
calculate set(0);
if (GetCursorPos(&ipoint))
set.setDots(ipoint.x, ipoint.y, 0,0,0, "single");//initialize both pointsdo
{
if (GetCursorPos(&point)) {
//stop the loop pressing right click
if((GetKeyState(VK_RBUTTON) & 0x100) != 0)
g = false;
if((GetKeyState(VK_LBUTTON) & 0x100) != 0)
{
if(c<1)
{
if((GetKeyState(VK_LSHIFT) & 0x100) != 0)//injecting DOWN event
set.setDots(point.x, point.y, point.x - 50, point.y + 50, 1, "two");
else
set.setDots(point.x, point.y, 0, 0, 1, "single");
}
else
{
if((GetKeyState(VK_LSHIFT) & 0x100) != 0)//injecting UPDATE event (on move)
set.setDots(point.x, point.y, point.x - 50, point.y + 50, 2, "two");
else
set.setDots(point.x, point.y, 0,0,2, "single");
}
c++;
}
else
{
/*if((GetKeyState(VK_LSHIFT) & 0x100) != 0)
set.setDots(0,0,0,0,3, "two");
else
set.setDots(0,0,0,0,3, "single");*/
c = 0;
}
}
} while (g);}
Итак, с помощью этого кода я могу ввести одно или два касания (если нажата клавиша Shift) и рисовать на краске с помощью кистей. Но когда я пытаюсь внедрить отдельные события для каждого контакта, например contact[0].pointerInfo.pointerFlags = POINTER_FLAG_UP;
оба контакта останавливаются, даже когда я пытаюсь изменить их идентификаторы или изменить количество точек для ввода.
contact[1].pointerInfo.pointerFlags = POINTER_FLAG_UPDATE | POINTER_FLAG_INRANGE | POINTER_FLAG_INCONTACT;
Приведенный выше код является лишь примером, но я попытался использовать разные флаги для каждого контакта без успеха 🙁
Моя цель состоит в том, чтобы быть в состоянии ввести две точки, с отдельными событиями каждое, и если первый контакт [0] имеет событие UP, второй контакт должен все еще работать без остановки процесса … Итак, как я могу ввести отдельные контакты ( цепляет) с разными событиями каждый?
Спасибо!
Задача ещё не решена.