Как добавить отдельные штрихи в Windows 8.1 Переполнение стека

Я пытался внедрить отдельные контакты (сенсорные события) в 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, второй контакт должен все еще работать без остановки процесса … Итак, как я могу ввести отдельные контакты ( цепляет) с разными событиями каждый?

Спасибо!

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]