为了账号安全,请及时绑定邮箱和手机立即绑定

鼠标事件发送者如何为空?(仅适用于 Windows 8.1+ TOUCH)

鼠标事件发送者如何为空?(仅适用于 Windows 8.1+ TOUCH)

C#
四季花海 2021-11-21 14:44:55
这只发生在 Windows 8.1+ 触摸设备上。我有一些面板,用户可以在其中用手指滑动。我已经实现了PreFilterMessage,这样我就可以在整个应用程序中全局捕捉鼠标移动,而不必担心子控件干扰。在触摸设备上单击表单时,我有时会收到一般错误:IsCanceledMove() Object reference not set to an instance of an object.我以没有工具栏或工具条的空白形式进行测试。只有两个面板。一个有一个大标签,另一个有按钮和一个文本框。这是我的鼠标移动过滤器,我将引发事件的发送者传递给引发异常的函数。private static void mouseFilter_MouseFilterMove(object sender, MouseFilterEventArgs e){     IsCanceledMove(sender as Control);}public bool PreFilterMessage(ref Message m){      Point mousePosition = Control.MousePosition;      var args = new MouseFilterEventArgs(MouseButtons.Left, 0, mousePosition.X, mousePosition.Y, 0);      switch (m.Msg)      {          case WM_MOUSEMOVE:              if (MouseFilterMove != null)                     MouseFilterMove(Control.FromHandle(m.HWnd), args);              break;            // more cases      }        // Always allow message to continue to the next filter control        return args.Handled;}接下来我只是做一个检查,看看被移动的控件是否是一个文本框,以及它的文本是否被突出显示。我还检查了另一个公共类的静态布尔变量。如果其中任何一个为真,我设置LastTouchedPanel为空。(这是类型Panel)// On Mouse move check if text is behing high lightedprivate static void IsCanceledMove(Control c){     try     {          // If highlighting text, stop moving          if (c.GetType() == typeof(TextBox))              if ((c as TextBox).SelectionLength > 0)                  LastTouchedPanel = null;          // Checks a static boolean variable from another control class.          if (UKSlider.IsSliding)               LastTouchedPanel = null;     }     catch (Exception ex)     {          MessageBox.Show("IsCanceledMove() " + ex.Message);     }}如果对象为空,对象如何发送事件,您如何处理 ARM 设备的事件?这适用于 Vista 到 Windows 10,但不适用于 Windows 10 ARM。编辑:我注意到Control.FromHandle(m.HWnd)有时在我的PreMessageFilteron 和 ARM 设备中返回 Null 。放入空检查显然可以解决异常,但会错过一些移动事件。
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

空鼠标事件发送器与在触摸设备上使用IMessageFilter直接相关。我在 Windows 8.1 触摸设备和 Windows 10 上看到过这种情况。

我在我的应用程序中的事件开始时开始,PreFilterMessage. 我想确保实际上有一个由Control.FromHandle. 果然,我可以看到有时简单地触摸表单上的空白区域会返回一个空控件。大概是一个无法转换为 .NET Control 类型的窗口句柄。

表单是空的,带有自定义控件。我确定只使用与Control.FromHandle.

所以这把我引向了一个大问题——我怎样才能得到一个尝试转换这些控件的空引用?

由于我知道有问题的控件无法转换为 .NET 控件,因此我转向窗口句柄以查找一些信息。我注意在空控件上提出的窗口句柄。

当我单击表单中的空白区域时,我可以看到我按预期获得了表单的窗口句柄。我注意到当我获得空引用时,句柄不是来自我的应用程序中的任何控件。

我认为实际上只有一个答案,手势控制器或类似的东西。这是我开始尝试一些手势的时候。就在那里,几个小时以来我第一次很高兴看到空引用异常。

事实证明,用一根手指移动会PreMessageFilter从您的表单中获得鼠标移动。一招2周的手指和你鼠标移动你的形式从手势控制器鼠标移动消息。手势控制器不能使用Control.FromHandle.

这里发生的事情是我在测试过程中变得懒惰,在点击时将手掌放在触摸屏上。

对于我的场景,我知道我只想处理鼠标移动而不关心手势。我可以忽略空句柄。如果您想同时处理两者,我认为您应该忽略它PreMessageFilter并使用手势消息正确处理手势。


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信