Windows SendInput使鼠标光标闪烁并消失

时间:2019-06-02 20:27:51

标签: c++ windows winapi touch sendinput

我正在用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有关,因为它想隐藏光标,因为这是通常的情况当用户触摸屏幕时会发生这种情况。

有什么建议吗?

0 个答案:

没有答案