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

问题描述 投票:0回答:1

[请看最后的更新]

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

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

使用这种陀螺鼠标,当用户将其手臂指向屏幕外时,光标停在屏幕限制处,这没有问题。但是,当他将手臂向后移动时,无论距屏幕的距离如何,光标都会立即移动到屏幕上。这导致空中鼠标实际位置和光标之间的巨大差异。

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

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

目前,基于this great project,我可以说明鼠标何时离屏,但无法控制它移动的距离和方向,以正确实现我正在尝试的内容。在我看来,这种信息对我目前的Windows知识来说太低了。

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

尽管如此,我对使用不同类型的控制器并不感兴趣,以及“你不应该这样做”的答案。我有这个问题需要解决这个问题,让这项工作真的很棒!

更新:

好的,这是我迄今为止的进步。

为了获得原始鼠标数据并了解鼠标移动'屏幕外',我必须使用一些Windows API函数注册我的应用程序来接收WM_INPUT消息。

基于我发现的very old code,我能够获得鼠标原始数据并实现我想要的。除了这个代码基于WdnProc回调的事实,因此只有当我的应用程序具有焦点时它才有效。当焦点在其他地方时我需要它才能工作 - 毕竟,我正在努力改进陀螺鼠标提供的指向,用于第三方游戏。

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

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

c# windows mouseevent raw-input mouse-hook
1个回答
0
投票

获取光标位置然后检测其移动的最简单的解决方案之一,无论光标在哪里使用user32.dll的win32 API。

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

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.