在Windows 10平板电脑上的Windows窗体应用中发送到错误控件的垂直滑动模拟鼠标事件

时间:2015-11-16 20:49:24

标签: c# winforms scroll touch windows-10

我试图在Windows 10平板电脑(Dell Venue 8 Pro)上运行Windows窗体应用。通常,Windows将触摸事件转换为明显的鼠标事件对应物。但是,它使用垂直滑动做了一些奇怪的事情。

我的应用有一个自定义控件(直接来自Control并在其构造函数中调用SetStyle(ControlStyles.Selectable..., true)),显示Direct3D呈现的图形。该控件解释MouseDown - > MouseMove - > MouseUp序列作为旋转关于外观位置的视图的请求。这在桌面上工作正常,但在平板电脑上它会中断:我的自定义控件上的垂直滑动以某种方式被Windows捕获并传递到附近的DataGridView,在那里它们被解释为滚动表格的请求。 DataGridView和我的控制不是同一容器下的兄弟姐妹;它们处于完全不同的控制层次级别。这是一个截图:

Screenshot of the application showing the different interpretations of vertical and horizontal swipes

我做了一些调试,以证明在垂直滑动过程中没有任何鼠标事件可以控制我。当我抬起手指时,右边有一些涓涓细流,但在垂直滑动过程中没有任何东西。

麻烦似乎是我的代码(在事件处理程序中)根本没有运行,因为没有任何输入进入我的控制。

这里发生了什么,有什么办法可以告诉Windows不要将我控件上发生的垂直滑动事件发送到一个完全不相关的控件?

修改:我应该补充一点,我在我的代码中调用Focus()以确保我的控件在鼠标悬停时聚焦。我把它放在OnMouseMoveOnMouseDown中,并且几乎放在其他所有鼠标事件上。

修改:我已经构建了一个small Visual Studio 2010 solution来演示此问题。这里有太多代码可以在线重现,但它很容易理解。构建它,将其安装在Windows 10平板电脑上,然后尝试在最右边的控件中垂直滑动。请注意,DataGridView会触发Scroll,而不是该控件接收一堆鼠标事件。

更新:我已明确测试DataGridView获得Scroll事件时我的控件是否有针对性。如上所述,如果我在我的控件上调用Focus()以响应MouseMove等,我的控件确实会获得焦点并在DataGridView.Scroll触发时在垂直滑动期间保持焦点。在DataGridView.Scroll事件处理程序中,我打印出我的控件是否是焦点,而且是。所以这不是DataGridView窃取焦点的问题;这是DataGridView处理用于我控制的滑动的问题,即使我的控制是集中的。

注意:如果我将dataGridView.ScrollBars设置为ScrollBars.None,则滑动的鼠标事件会转到我的控件。每次我的控件聚焦时,我都会弄乱丑陋的黑客隐藏滚动条,并在每次DataGridView聚焦时显示它们。但他们都是丑陋的黑客,带来了令人不快的副作用。

1 个答案:

答案 0 :(得分:1)

如何自己处理触摸事件,而不是等待自己的Microsoft正确实现。 link