如何在光标不在屏幕上时获取鼠标移动信息

3

[请参见结尾的更新]

我是一个老旧的 Stack Overflow 用户(像大多数地球上的开发者一样),但这是我在这里的第一个问题。

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

使用这个陀螺仪鼠标时,当用户将手臂指向屏幕外移动时,光标会停留在屏幕边缘,这没有问题。然而,当他将手臂移回来时,无论离屏幕的距离有多远,光标立即移回屏幕上。这导致了空气鼠标实际位置和光标之间的巨大差异。

这可以通过对离屏幕移动的像素数量和方向进行简单控制,并结合一些事件处理来解决。如果我能够总结出在 -X、+X、-Y 和 +Y 方向上移动的“离屏幕”像素数量,就可以防止/取消鼠标移动事件 - 或将光标设置为其在屏幕边缘的先前位置 - 直到控制告诉我物理鼠标指向屏幕。然后我才允许光标自由移动。

[请参见结尾的更新]

也许这并不是特别有用,但这是一个有趣的问题,看到它能够运行起来会非常有趣!
目前,基于this great project,我只能说明鼠标何时离开屏幕,但无法控制其移动距离和方向,以便实现我正在尝试的内容。在我当前的 Windows 知识水平上,这种信息似乎过于低级。
因此,明确一下:在 C#(其他语言也可以,但我需要学习很多)中,我如何获取任何类型的“增量位置”信息或移动方向,当光标处于屏幕边缘时?
恕我直言,我对使用不同类型的控制器以及“你不应该这样做”的答案不感兴趣。我要解决这个问题,使用这些元素,并且让它能够运作起来将是很棒的事情!
更新:
好了,现在是我的进展。
为了获取原始鼠标数据并了解鼠标在屏幕外的移动,我需要使用一些Windows API函数注册我的应用程序以接收WM_INPUT消息。
基于我找到的非常古老的代码,我能够获取鼠标原始数据并实现我想要的功能。但是这个代码基于WdnProc回调,因此只有当我的应用程序处于焦点状态时才能工作。而我需要它在焦点在其他地方时也能工作 - 毕竟,我正在尝试改善陀螺仪鼠标提供的指向性,用于第三方游戏。
看起来我应该使用一个钩子(这里有一个好例子),但我不知道如何钩取输入消息。尝试合并上述两个链接的代码,但第一个链接需要传递给WdnProc的message.LParam,而当仅钩取鼠标事件时似乎无法使用。
现在我已经超出了自己的水平,无法取得真正的进展。有什么建议吗?

你可以锁定窗口中的光标,这就是游戏处理此情况的方式(如果我说错了,请纠正我)。 - Matthiee
感谢您的评论,Mattiee。当我说“用于游戏”时,我的表述不够清晰。我并非在开发游戏,而是试图使用一种特定类型的控制器/鼠标来改善第三方游戏的控制。因此,“我的窗口”这样的概念并不存在。 - FabricioNK
1个回答

0

获取光标位置并检测其移动最简单的解决方法之一是使用来自user32.dll的win32 API。

这里有一个简单的代码,在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);
}

已经尝试过这个方法,作为鼠标事件的钩子,GetCursorPos 受限于屏幕边界。看起来操作系统只是传递已经转换为屏幕像素限制的鼠标移动消息。因此,要在超出屏幕限制后获取鼠标方向,也许我应该寻找类似原始鼠标数据的东西? - FabricioNK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接