这段代码只是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();
}
}
}
答案 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)