C++ 从C+模拟鼠标事件+;在窗户里

C++ 从C+模拟鼠标事件+;在窗户里,c++,winapi,click,mouse,C++,Winapi,Click,Mouse,我有一个用触摸屏运行的程序,但由于鼠标指针“在”触摸屏上会出现问题,触摸屏的Windows鼠标行为已被禁用,并且正在使用一个自制程序监控触摸屏,并在触摸屏或未触摸屏的位置向窗口发送消息(即WM_LBUTTONDOWN,WM_LBUTTONUP) 相关代码如下所示: touched = false; while (1) { if (!touched) { // p.x and p.y calculated here based on mouse position at

我有一个用触摸屏运行的程序,但由于鼠标指针“在”触摸屏上会出现问题,触摸屏的Windows鼠标行为已被禁用,并且正在使用一个自制程序监控触摸屏,并在触摸屏或未触摸屏的位置向窗口发送消息(即
WM_LBUTTONDOWN
WM_LBUTTONUP

相关代码如下所示:

touched = false;

while (1)
{
    if (!touched) {
        // p.x and p.y calculated here based on mouse position at
        // time of touch screen event
        p.x = ...;
        p.y = ...;

        if ((window = WindowFromPoint (p)) != NULL)
            PostMessage (window, WM_LBUTTONDOWN, 0, 0);

        touched = true;
    }
    else
    {
        if ((window = WindowFromPoint (p)) != NULL)
            PostMessage (window, WM_LBUTTONUP, 0, 0);

        touched = false;
    }
}
这是可行的,但并不能完全模仿Windows的鼠标按下行为——不管发生非接触时触摸的位置如何(即,如果拖动触摸),都会将
WM_LBUTTONUP
发送到接收到
WM_LBUTTONDOWN
的控件

我想做的是让它更像Windows。在任何应用程序中,打开一个有按钮的对话框。单击并按住按钮上的鼠标,你会看到它被按下。将鼠标从按钮上拖下来,不要松开鼠标,你会看到按钮再次升起。将鼠标拖回按钮上,你会看到它被按下。如果你当指针在按钮上时松开鼠标,则按钮被按下。如果在指针离开按钮时松开鼠标,则按钮未被按下

我设置了一个低级鼠标钩子,可以看到在此序列中发生的唯一鼠标事件是
WM_LBUTTONDOWN
,然后是一系列
WM_MOUSEMOVE
,然后是
WM_LBUTTONUP
,无论鼠标是在按钮上还是在按钮下释放

我曾尝试为拖动鼠标时添加替代处理,并发送了此POST
WM_MOUSEMOVE
消息,但这些消息应该发送到哪个控件?WM_LBUTTONDOWN事件最初发送到的按钮,还是其他地方?我尝试了按钮和按钮所在的窗口,但显然我已经成功了做了一些错误的事情,因为它似乎不起作用。我所能达到的最好效果是,当我不触碰按钮时,触摸屏按钮没有被“点击”,但触摸屏按钮仍然被按下

有什么建议吗

是否有人可以确认在此操作期间应将哪些事件发送到何处

谢谢您的建议。

这是您的代码:

    PostMessage (window, WM_LBUTTONDOWN, 0, 0);
你能试试这句话而不是上面这句话吗

    DWORD dw = MAKEWORD(p.x, p.y);
    PostMessage (window, WM_LBUTTONDOWN, MK_LBUTTON, dw);
我认为这段代码应该有效。

这是您的代码:

    PostMessage (window, WM_LBUTTONDOWN, 0, 0);
你能试试这句话而不是上面这句话吗

    DWORD dw = MAKEWORD(p.x, p.y);
    PostMessage (window, WM_LBUTTONDOWN, MK_LBUTTON, dw);

我认为这段代码应该可以工作。

您检查过这个问题吗:我尝试过SendInput,但问题是SendInput(除非我做错了什么)使鼠标指针做出反应,就好像我发送的鼠标事件实际发生了一样——因此,如果我将鼠标单击发送到另一个位置,鼠标实际上会移动到该另一个位置。我尝试做的是发送底层的WM_LBUTTONDOWN、WM_MOUSEMOVE和WM_LBUTTONUP消息(以及任何其他消息,如果有的话)至适当的控制好像鼠标实际上被单击和/或拖动到了那里,但没有移动鼠标指针。如果要隐藏鼠标指针,最好将鼠标指针设置为不可见的指针。使用WM_uu消息而不是使用SendInput的关键在于目标应用程序是否使用GetCursorPos或Get[Async]KeyState检查鼠标位置或按钮状态,它将获得实际状态,而不是您试图伪造的状态。(此外,如果应用程序在钩子或消息循环中而不是在窗口过程中处理输入,则在您发布消息时可能无法工作。)但如果您拥有目标应用程序在这种情况下,您可以对此进行计划。您是否检查了以下问题:我尝试了SendInput,但问题是SendInput(除非我做错了什么)使鼠标指针做出反应,就好像我发送的鼠标事件实际发生了一样——因此,如果我将鼠标单击发送到另一个位置,鼠标实际上会移动到该另一个位置。我尝试做的是发送底层的WM_LBUTTONDOWN、WM_MOUSEMOVE和WM_LBUTTONUP消息(以及任何其他消息,如果有的话)至适当的控制好像鼠标实际上被单击和/或拖动到了那里,但没有移动鼠标指针。如果要隐藏鼠标指针,最好将鼠标指针设置为不可见的指针。使用WM_uu消息而不是使用SendInput的关键在于目标应用程序是否使用GetCursorPos或Get[Async]KeyState检查鼠标位置或按钮状态,它将获得实际状态,而不是您试图伪造的状态。(此外,如果应用程序在钩子或消息循环中而不是在窗口过程中处理输入,则在您发布消息时可能无法工作。)但如果您拥有目标应用程序在这种情况下,您可以对此进行计划。MAKEWORD从字节创建一个单词…您至少需要MAKELONG,尽管Windows鼠标按钮消息实际上需要LPARAM:MAKEWORD从字节创建一个单词…您至少需要MAKELONG,尽管Windows鼠标按钮消息实际上需要LPARAM: