我为在Windows 8.1平板电脑上运行的VCL应用程序创建了一个TCustomControl派生类。
我正在使用OnMouseDown / OnMouseUp事件,即使这显然是基于触摸的。
我想做的是检测长按 - 即按下并保持1秒钟。因此,在OnMouseDown事件中,我记录了下行时间戳,设置一个标志以指示鼠标已关闭,并创建一个休眠1秒钟的匿名线程,然后检查该标志。
在OnMouseUp中,我将标志设置为false。
只要您在控件上摆动手指,此功能就可以正常工作。否则,如果您只是触摸并按住鼠标,则在释放手指之前不会调用事件。
我看过手势,但这看起来完全矫枉过正,而且从我的理解来看,无论如何都不支持长按。
感谢您的任何建议。
理查德
答案 0 :(得分:2)
你面临的是"正常"但是带有触摸输入设备的Windows的愚蠢行为却令人愚蠢。我们暂时面临同样的问题,并且正在努力在过去几周内积极解决这个问题。 诀窍是,窗口将触摸输入设备作为鼠标,可以用单指完全控制"。因此,它有几种状态,不仅仅是事件:
事件是:触摸开始(向下),移动,向上,向右键,如果你真的想注册回调,你将会静止(自上次报告以来没有移动但仍然停止)。
与此同时,还有更多州。首先,当你用手指按下时,它会在内部检测到"触摸!"事件。它等待一段时间(可能会或可能不会进行黑客更改,取决于驱动程序等...),以确定您想要的是右键单击(在 x时间之后) ,一旦发布!在Y时间之前!它将触发右键单击事件)或是否是左键单击(触发事件TouchBegin - 在之后y时间,比x时间更长,在y到期后,它将向下触发事件(不是点击!)。
同时,如果第一次触地被任何一次移动中断或 - !!等待 x时间到期!!手指释放前x时间用完后,会自动触发左下 (移动中)或左键单击 (开启释放)。在Y时间到期后的任何时间也是如此,或者触发MOVE。
为了更简单易懂,我试着举个例子:
让我们说你有触控设备,时间如下: B点开始,位于我们时间轴的0秒处。 点X是第一个触发断点,位于我们时间轴的5秒处。 Y点是第二个触发断点,位于我们时间轴的10秒处。
你触摸手指,开始时间线。 可能的情况: - 你在X点之前的任何时候发布它 - >触发左键单击(触及向上和向上事件,按顺序一个接一个地触发) - 你在点X之后但在点Y之前释放它 - >触发右键单击(触摸向上和向上事件,带右键标记) - 你到达Y点 - 左下触发! - 你可以随时在Y点之后释放它,无论是否在释放之间移动触发(但是在时间线到达此点之前未触发移动) - >左边被触发。
希望这对你有意义。
现在跳转到可能的解决方案:自定义驱动程序将是一个选项,但我们还没有,所以我们仍在尝试其他选项。现在最有希望的似乎是使用RAW_INPUT和Touch钩子,看起来我们必须将它们组合起来以获得我们想要的东西。 好的一面是,当手指接触设备时,窗口本身会检测到,无论它想要检测的时间和事件,确定然后转发到应用程序,但由于某种原因,它们很难在这种性质中使用。作为证据,您可以在触摸屏幕的第一刻简单地检查手指下方出现的透明点。
与此同时,Android更好地处理这些事情......
希望它有所帮助,一旦我们通过并获得足够好用的东西,我很高兴能够提供完整的解决方案。
微米。*
答案 1 :(得分:0)
如果没有触发MouseDown事件并且你想让你的延迟计数器依赖于它,那么你基本上是搞砸了。也就是说,我认为你对概念的微小变化持开放态度。 :)
我认为如果将按钮更改为翻转开关,仍然可以完成。用户必须抓住" (触摸)它,"拉起来" (拖动,应该触发StartDrag事件)并在那里保持所需的时间。在释放开关(MouseDown事件)后,它会快速向下拍摄。
要设计这样一个按钮,您可以使用一个微小的TPanel作为旋钮,稍微大一些,以允许有限的垂直运动。将BevelInner属性设置为bvLowered,将BevelOuter设置为bvRaised,使其看起来像一个框架,并将旋钮面板设置为其子项。或者使用TImage在其上/下位置显示旋钮。在任何情况下,将knob元素的DragKind属性设置为dkDrag,否则StartDrag事件将不会发生。如果仍未触发任何事件,请尝试detect touch input capabilities并报告您的调查结果。
不确定这是否有资格获得答案,但也许值得一试。