无法使此鼠标检测代码可靠地运行......任何想法?

时间:2015-07-10 18:05:44

标签: c# wpf

这段代码只是POC,"用WPF编写#34;但是如果你将事件处理程序改为winforms,那么几乎相同的东西将适用于Winforms ...只是试图降低逻辑和然后我会把它生产出来。

我尝试做的是检测拖动操作的鼠标方向变化。例如,点击&按住窗体的客户区域并将鼠标移动到右侧,现在将其移动到左侧...这将是方向更改。同样的事情明显地留下了< - >右,右< - >左,上< - >向下,向下< - >向上...对角线到右上角< - >对角线到左下角等等。

我已经尝试了一些不同的概念,而我似乎没有做到最好的概念,但它仍然有点不可靠......我得到一些误报和一些失误。这段代码的作用是节省10点鼠标移动,然后计算第一点和最后一点之间的线的角度,然后如果我在 ROUGHLY 的相反方向得到下一段,这将是一个变化。它有点/有点可行,但我把可靠性提高到75%。不可靠性似乎是你做了一些事情,比如移动到左上角,然后来回上下移动,它不会可靠地检测上下方向的变化。

我没有和角度想法结婚......这正是我迄今为止最好的工作方式......这里是最小的代码:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication7
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            MouseLeftButtonDown += MainWindow_MouseLeftButtonDown;
            MouseLeftButtonUp += MainWindow_MouseLeftButtonUp;
            MouseMove += MainWindow_MouseMove;
        }

        Point _pt;
        List<Point> lst = new List<Point>();
        double? _d = null;

        void MainWindow_MouseMove(object sender, MouseEventArgs e)
        {
            if (Mouse.Captured == this)
            {
                lst.Add(e.GetPosition(this));

                if (lst.Count >= 10)
                {
                    double dX = lst[lst.Count - 1].X - lst[0].X;
                    double dY = lst[lst.Count - 1].Y - lst[1].Y;

                    double dAngle = Math.Atan2(dY, dX) * 180 / Math.PI;

                    //System.Diagnostics.Debug.WriteLine("GOT ANGLE: " + dAngle);

                    if (!_d.HasValue)
                    {
                        _d = dAngle;
                    }
                    else
                    {
                        //System.Diagnostics.Debug.WriteLine(Math.Abs(dAngle - _d.Value));

                        if (Math.Abs(dAngle - _d.Value) >= 160.0 && Math.Abs(dAngle - _d.Value) <= 200)
                        {
                            System.Diagnostics.Debug.WriteLine(DateTime.Now + " DIRECTION CHANGE!");
                            _d = dAngle;
                        }

                        _d = dAngle;
                    }

                    lst.Clear();
                }
            }
        }

        void MainWindow_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            ReleaseMouseCapture();
        }

        void MainWindow_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            lst.Clear();
            _d = null;
            _pt = e.GetPosition(this);
            CaptureMouse();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我怀疑以下代码

double dX = lst[lst.Count - 1].X - lst[0].X;
double dY = lst[lst.Count - 1].Y - lst[1].Y;

应更改为:

double dX = lst[lst.Count - 1].X - _pt.X;
double dY = lst[lst.Count - 1].Y - _pt.Y;

我的理由是:你正在读取鼠标移动的最后10个位置,例如(0,1),(0,2),(0,3),(0,4),(0 ,5),(0,6),(0,7),(0,8),(0,9),(0,10)

然后运行比较并清除列表。但是,如果清除列表时光标向相反方向移动,则检测将被忽略,因为它仍然是顺序的: (0,10),(0,9),(0,8),(0,7),(0,6),(0,5),(0,4),(0,3),(0 ,2),(0,1)