gpt4 book ai didi

c++ - 在 Windows 中从 C++ 模拟鼠标事件

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:07 44 4
gpt4 key购买 nike

我有一个在触摸屏上运行的程序,但由于鼠标指针“在”触摸屏上会出现问题,因此触摸屏的 Windows 鼠标行为已被禁用,并且正在使用自制程序监视触摸屏并在触摸或未触摸屏幕的位置将消息发布到窗口(即 WM_LBUTTONDOWNWM_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。在任何应用程序中,打开一个对话框,上面有一个按钮。在按钮上单击并按住鼠标,您会看到它按下去。将鼠标拖离按钮并且不要松开鼠标,您会看到按钮再次升起。将鼠标拖回到按钮上,您会看到它按下去。如果您在指针位于按钮上时松开鼠标,则按下按钮。如果您在指针离开按钮时松开鼠标,则不会按下按钮。

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

我已经尝试在拖动鼠标时添加替代处理,并发布 WM_MOUSEMOVE 消息,但是这些应该发送到哪个控件? WM_LBUTTONDOWN 事件最初发送到的按钮,还是其他地方?我已经尝试了按钮和按钮打开的窗口,但显然我做错了什么,因为它似乎不起作用。我能够实现的最好结果是当我取消触摸按钮时触摸屏按钮没有被“点击”,但触摸屏按钮仍然被压下。

有什么建议吗?

谁能确认在此操作期间应将哪些事件发送到哪里?

感谢您的任何建议。

最佳答案

这是您的代码:

    PostMessage (window, WM_LBUTTONDOWN, 0, 0);

你能试试这个而不是上面的行吗:

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

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

关于c++ - 在 Windows 中从 C++ 模拟鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6688369/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com