我有一个带触摸屏的程序,但由于鼠标指针在触摸屏上“打开”会引入问题,触摸屏的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
,无论鼠标是否在按钮上释放。
我已经尝试在拖动鼠标时添加替代处理,并且发布了WM_MOUSEMOVE
消息,但是应该将这些消息发送到哪个控件? WM_LBUTTONDOWN
事件最初发送到或其他地方的按钮?我已经尝试了按钮和窗口按钮,但显然我做错了,因为它似乎不起作用。我能够实现的最好的是当我取消按钮时触摸屏按钮没有被“点击”,但仍然按下了触摸屏按钮。
有什么建议?
任何人都可以确认在此操作过程中应该发送哪些事件?
谢谢你的建议。
这是你的代码:
PostMessage (window, WM_LBUTTONDOWN, 0, 0);
你可以尝试这个而不是上面的行:
DWORD dw = MAKEWORD(p.x, p.y);
PostMessage (window, WM_LBUTTONDOWN, MK_LBUTTON, dw);
我认为这段代码应该有效。