gpt4 book ai didi

delphi - Windows 平板电脑上使用 Delphi VCL 进行长触摸

转载 作者:行者123 更新时间:2023-12-03 15:13:31 25 4
gpt4 key购买 nike

我创建了一个 TCustomControl在 Windows 8.1 平板电脑上运行的 VCL 应用程序的派生类。

我正在使用OnMouseDown/OnMouseUp事件,尽管这显然是基于触摸的。

我想做的是检测长按 - 即触地并按住 1 秒。所以在 OnMouseDown事件我记录按下时间戳,设置一个标志来指示鼠标按下,并创建一个休眠 1 秒的匿名线程,然后检查该标志。

OnMouseUp我将标志设置为 false。

只要您在控件上晃动手指,此操作就会起作用。否则,如果您只是触摸并按住鼠标,则在松开手指之前不会调用事件。

我已经研究过手势,但这看起来完全是多余的,而且据我了解,无论如何也不支持长按。

感谢您的任何建议。

理查德

最佳答案

您所面临的是带有触摸输入设备的 Windows 的“正常”但愚蠢得可笑的行为。我们现在面临同样的问题有一段时间了,并且在过去几周里正在努力积极解决它。诀窍在于,Windows 将触摸输入设备视为“可以用单指完全控制的鼠标”。因此,它有几种状态,不止事件:

事件包括:触摸开始(向下)、移动、向上、右键单击,如果您确实想注册回调,您将处于静止状态(自上次报告以来未移动,但仍处于向下状态)。

同时,还有更多的州。首先,当您按下手指时,它会在内部检测到“触地!”事件。然后它会等待一定的时间(这可能会或可能不会被修改,取决于驱动程序等...),以确定您想要的是否是右键单击(在x时间之后,释放后!在Y时间之前!它将触发右键单击事件)或者是否是左键单击(触发事件TouchBegin - 在之后y 时间,比 x 时间长,y 到期后,将触发左下事件(不是点击!))。
同时,如果第一次触地被移动或 - !!在等待x时间过期!!在 x 时间用完之前松开手指,将自动触发左键按下(移动时)左键单击(移动时)发布)。 Y 时间到期或触发 MOVE 后的任何时间也是如此。

为了更简单易懂,我尝试举个例子:

假设您有触摸设备,时序如下:B 点是起点,位于时间线的 0 秒处。X 点是第一个触发断点,位于时间线的 5 秒处。Y 点是第二个触发断点,位于时间线的 10 秒处。

您将手指放在触摸处,时间线就会开始。可能的情况: - 在点 X 之前的任何时间释放它 -> 触发左键单击(触摸向下和向上事件,按顺序依次进行) - 您在 X 点之后但 Y 点之前释放它 -> 触发右键单击(触摸向下和向上事件,带有右键单击标志) - 你到达Y点 - 左下被触发! - 您可以在 Y 点之后随时释放它,无论是否在释放之间触发移动(但在到达时间轴中的该点之前不会触发移动) -> 触发左上。

  • 您在到达 X 点之前触发(执行)移动事件 -> 触发向左向下,然后触发检测到的多个移动事件,直到您释放它 -> 然后触发向左向上
  • 您在 X 之后但 Y 之前触发(执行)移动事件 -> 与上面相同!
  • 您到达 Y 点并随后移动它 -> 检查上面的 4 号点。

希望这对您有意义。

现在跳到可能的解决方案:自定义驱动程序是一种选择,但我们还没有做到这一点,因此我们仍在尝试其他选项。目前最有希望的似乎是使用 RAW_INPUT 和 Touch hooks,看起来我们必须将它们结合起来才能得到我们想要的东西。好的一面是,Windows 本身确实会检测手指何时触摸设备,无论它想要检测、确定然后转发到应用程序的时间和事件如何,但由于某种原因,它们很难在这种情况下使用。作为证据,您只需检查触摸屏幕的第一刻出现在手指下方的透明点即可。

与此同时,Android 可以更好地处理这些事情......

希望它能有所帮助,一旦我们完成并获得足够好的东西可供使用,我很高兴能提供完整的解决方案。

M.*

关于delphi - Windows 平板电脑上使用 Delphi VCL 进行长触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38892049/

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