[请看最后的更新]
我是一个旧的堆栈溢出用户(大多数开发人员,你知道,地球),但这是我的第一个问题。
我正在尝试使用“空中鼠标”进行游戏(将其指向屏幕),但由于鼠标传感器是陀螺仪,因此屏幕移动存在一些问题,我想通过软件尝试修复。
使用这种陀螺鼠标,当用户将其手臂指向屏幕外时,光标停在屏幕限制处,这没有问题。但是,当他将手臂向后移动时,无论距屏幕的距离如何,光标都会立即移动到屏幕上。这导致空中鼠标实际位置和光标之间的巨大差异。
这可以通过简单控制像素数量和方向,离屏移动以及一些事件处理来解决。如果我可以总结在-X,+ X,-Y和+ Y中行进的“屏幕外”像素的数量,则可以防止/取消鼠标移动事件 - 或者将光标设置到其先前位置,在边缘屏幕 - 直到控件告诉我物理鼠标指向屏幕。就在这时,我允许光标自由移动。
也许这不是那么有用,但这是一个有趣的问题,看到这个工作会很有趣!
目前,基于this great project,我可以说明鼠标何时离屏,但无法控制它移动的距离和方向,以正确实现我正在尝试的内容。在我看来,这种信息对我目前的Windows知识来说太低了。
所以,要明确:我怎样才能在C#中接受其他语言,但我必须学到很多东西;),当光标处于极限时,获得任何类型的“增量位置”信息或移动方向屏幕?
尽管如此,我对使用不同类型的控制器并不感兴趣,以及“你不应该这样做”的答案。我有这个问题需要解决这个问题,让这项工作真的很棒!
更新:
好的,这是我迄今为止的进步。
为了获得原始鼠标数据并了解鼠标移动'屏幕外',我必须使用一些Windows API函数注册我的应用程序来接收WM_INPUT消息。
基于我发现的very old code,我能够获得鼠标原始数据并实现我想要的。除了这个代码基于WdnProc回调的事实,因此只有当我的应用程序具有焦点时它才有效。当焦点在其他地方时我需要它才能工作 - 毕竟,我正在努力改进陀螺鼠标提供的指向,用于第三方游戏。
看来我应该使用一个钩子(a good example here),但我不知道如何挂钩输入消息。试图合并上面两个链接的代码,但第一个需要传递给WdnProc的message.LParam - 这似乎只是挂钩鼠标事件时不可用。
现在我已经走出了联盟,取得了一些真正的进步。有任何想法吗?
获取光标位置然后检测其移动的最简单的解决方案之一,无论光标在哪里使用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);
}