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

时间:2018-08-26 15:44:52

标签: c# windows mouseevent raw-input mouse-hook

[请在最后查看更新]

我是一个老堆栈溢出用户(大多数开发人员都在使用Earth),但这是我的第一个问题。

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

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

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

也许这没什么用,但这是一个有趣的问题,看到这种工作真是太有趣了!

当前,基于this great project,我只能说明鼠标何时不在屏幕上,但无法控制鼠标移动的距离和方向,以正确实现我正在尝试的操作。在我看来,这种信息对于我目前的Windows知识来说太底层了。

因此,要明确一点:当光标为C时,我如何才能使用C#(接受其他语言,但我必须学习很多;),以获得任何类型的“增量位置”信息或运动方向在屏幕的尽头?

在所有应有的尊重下,我对使用不同种类的控制器以及“您不应该这样做”的答案不感兴趣。使用这些元素,我有一个要解决的问题,使这项工作很棒!

更新:

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

为了获取原始鼠标数据并了解“屏幕外”的鼠标移动,我不得不使用某些Windows API函数来注册我的应用程序,以接收WM_INPUT消息。

基于我发现的very old code,我能够获取鼠标原始数据并完全实现所需的功能。除了该代码基于WdnProc回调的事实之外,因此仅当我的应用程序具有焦点时才起作用。而且,当焦点放在其他地方时,我还需要它也能正常工作-毕竟,我正在尝试改善陀螺鼠标为第三方游戏提供的指向性。

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

现在,我不在同盟中取得一些真正的进步。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

这是一个简单的代码,它使用C#Windows Form应用程序中的计时器每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);
}