2

【请看文末更新】

我是一个老堆栈溢出用户(就像大多数开发人员一样,你知道,地球),但这是我在这里的第一个问题。

我正在尝试使用“空中鼠标”进行游戏(将其指向屏幕),但由于鼠标传感器是陀螺仪,因此我想尝试通过软件修复屏幕外移动的一些问题。

使用这款陀螺鼠标,当用户将手臂指向屏幕外时,光标会停在屏幕边界处,这没有问题。但是,当他将手臂向后移动时,无论离屏幕多远,光标都会立即在屏幕上移动。这会导致空中鼠标实际位置和光标之间存在巨大差异。

这可以通过对像素数量和方向的简单控制来解决,在屏幕外移动,并结合一些事件处理。如果我可以将在 -X、+X、-Y 和 +Y 中移动的“屏幕外”像素的数量相加,则可以防止/取消鼠标移动事件 - 或将光标设置到其先前的位置,在边缘屏幕 - 直到控件告诉我物理鼠标指向屏幕。就在那时,我会让光标自由移动。

也许这不是那么有用,但这是一个有趣的问题,看到这个工作会很有趣!

目前,基于这个伟大的项目,我只能说明鼠标何时离开屏幕,但无法控制它移动的距离和方向,以正确实现我正在尝试的内容。在我看来,这种信息对于我目前的 Windows 知识来说太低级了。

所以,要明确一点:当光标处于极限时,我如何在 C# 中(接受其他语言,但我必须学习很多;),获取任何类型的“增量位置”信息或移动方向屏幕?

恕我直言,我对使用不同类型的控制器以及“你不应该这样做”的答案不感兴趣。我有这个问题要解决,用这些元素,做这个工作会很棒!

更新:

好的,这是我到目前为止的进展。

为了获取原始鼠标数据并了解鼠标“离屏”移动,我必须使用一些 Windows API 函数注册我的应用程序,以接收 WM_INPUT 消息。

根据我发现的一个非常古老的代码,我能够获取鼠标原始数据并完全实现我想要的。除了此代码基于 WdnProc 回调这一事实,因此它仅在我的应用程序具有焦点时才有效。当焦点在其他地方时,我也需要它来工作 - 毕竟,我正在努力改善陀螺鼠标提供的指向,用于第三方游戏。

看来我应该使用挂钩(这里是一个很好的例子),但我不知道如何挂钩输入消息。试图合并上面两个链接的代码,但第一个需要传递给 WdnProc 的 message.LParam - 仅在挂钩鼠标事件时似乎不可用。

现在我已经脱离了我的联盟,无法取得一些真正的进步。有任何想法吗?

4

1 回答 1

0

获取光标位置然后检测其移动的最简单解决方案之一,无论光标在何处使用来自user32.dll.

这是一个简单的代码,它使用 C# Windows 窗体应用程序中的计时器每 10 毫秒获取一次光标位置,并将其显示为窗口的标题。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing;

public partial class Form1 : Form
{
    Timer timer = new Timer();

    public Form1()
    {
        InitializeComponent();

        timer.Interval = 10;
        timer.Tick += Timer_Tick;

        timer.Start();
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        // do here whatever you want to do

        // just for testing...
        GetCursorPos(out Point lpPoint);
        this.Text = lpPoint.X + ", " + lpPoint.Y;
    }

    [DllImport("user32.dll")]
    public static extern bool GetCursorPos(out Point p);
}
于 2018-08-26T17:57:46.300 回答