我正在用C ++编写一个Windows Desktop程序,该程序将使用所有触摸屏输入,并将其替换为通过SendInput创建的鼠标输入。到目前为止,我只希望用手指在触摸屏上进行的任何动作作为鼠标增量发送。例如,我应该能够使用物理鼠标将光标放置在屏幕顶部附近,然后将手指沿屏幕底部沿着水平线拖动,然后看到光标在上方复制该动作。
除三个问题外,此方法均有效;
关于我在做什么的更多细节;
我使用CreateWindowEx创建一个不可见的仅消息窗口。
然后我使用RegisterPointerInputTarget来确保将所有触摸输入发送到我的窗口。
在WndProc函数中,对于所有WM_POINTERENTER,WM_POINTERLEAVE,WM_POINTERUP,WM_POINTERDOWN,WM_POINTERUPDATE,WM_POINTERCAPTURECHANGED和WM_TOUCH消息,我不调用DefWindowProc就返回0。
我使用WM_POINTERDOWN检测新的触摸,使用WM_POINTERUPDATE发送带有SENDINPUT的适当鼠标更新,并使用WM_POINTERUP / WM_POINTERCAPTURECHANGED停止跟踪触摸。
*******编辑*******
我现在解决了用户从屏幕上移开手指时光标消失的问题;从WM_POINTERUP消息发送两次鼠标移动。我实际上根本不希望光标移动,因此我先发送(1,0)的一个动作,然后再发送(-1,0)的一个动作。我敢肯定,这感觉像是在破解,所以如果有人有更好的建议,请告诉我。
要解决当手指仍然停留在屏幕上时鼠标消失的问题,我必须在WM_POINTERUPDATE消息中执行相同的操作;将我从那里发送的每个动作分成两个消息。我还必须确保收到的每个WM_POINTERUPDATE都发送一个运动(我一直在跳过空的运动)。
这仅留下鼠标闪烁问题。这可以更简单地复制。只需使用Visual Studio创建一个新的Windows桌面应用程序并将此代码添加到WndProc函数中即可;
case WM_POINTERUPDATE:
{
INPUT Inputs[1] = { 0 };
Inputs[0].type = INPUT_MOUSE;
Inputs[0].mi.dx = 1;
Inputs[0].mi.dy = 0;
Inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE;
SendInput(1, Inputs, sizeof(INPUT));
}
运行程序,触摸应用程序窗口内的屏幕,然后出现闪烁,这仅在从WM_POINTERUDPATE发出SendInput调用时发生,所以我怀疑问题与Windows有关,因为它想隐藏光标,因为这是通常的情况当用户触摸屏幕时会发生这种情况。
有什么建议吗?