这只发生在 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 lighted
private 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 。放入空检查显然可以解决异常,但会错过一些移动事件。
慕少森
相关分类