2

我正在寻找创建一个在 XP/Vista/7 中工作的全局鼠标钩子,它允许我访问鼠标输入的 X、Y 值,并在它们到达 Windows 之前修改这些值......

我还希望能够在实际鼠标输入之间模拟鼠标输入......

例如,假设我们的输入如下所示:

1: 1,0 2: 2,0 3: 3,0 4: ?,?

我希望能够截取输入编号 4 并通过“if”语句运行它:如果输入的值与某些参数匹配,我想通过添加或减去它来修改值...

USB 鼠标的默认轮询速率为 125Hz,最大为 1000hz...

如果可能的话(特别是当轮询率设置为小于 1000hz 时)我想在实际鼠标更新(关键)​​之间“注入”输入,例如:

(以毫秒为单位)

0008 - 1,0 0016 - 1,0 0032 - 2,0

所以鼠标以 125Hz 更新......我可以检测输入的频率,并每隔一个输入发送一个输入吗?因此,例如,我可以将鼠标频率从 125 赫兹“加倍”到 250 赫兹,并根据我设置的任何规则模拟我自己的“中间”更新......

这些看起来合理吗?现在我在 C# 中工作,我正在使用本教程中的“Gma.UserActivityMonitor”:http: //www.codeproject.com/KB/cs/globalhook.aspx但由于某种原因我得到了性能打击由于钩子,使得在全屏游戏中使用此代码时鼠标输入会出现无法使用的延迟...

也许我需要用 C++ 写一些东西?任何帮助将不胜感激。谢谢!

4

2 回答 2

2

我已经建立了一个可以帮助你的库,它是一个简单的 c 库,可以在普通 windows api 不能的游戏上工作

以下示例显示了如何使用此库反转鼠标移动,它基本上只是将垂直轴上的位移乘以 -1,因此它们发生在相反的方向:

#include <interception.h>
#include "utils.h" // for process priority control

enum ScanCode
{
    SCANCODE_ESC = 0x01
};

int main()
{
    InterceptionContext context;
    InterceptionDevice device;
    InterceptionStroke stroke;

    raise_process_priority();

    context = interception_create_context();

    interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP);
    interception_set_filter(context, interception_is_mouse, INTERCEPTION_FILTER_MOUSE_MOVE);

    while(interception_receive(context, device = interception_wait(context), &stroke, 1) > 0)
    {
        if(interception_is_mouse(device))
        {
            InterceptionMouseStroke &mstroke = *(InterceptionMouseStroke *) &stroke;

            if(!(mstroke.flags & INTERCEPTION_MOUSE_MOVE_ABSOLUTE)) mstroke.y *= -1;

            interception_send(context, device, &stroke, 1);
        }

        if(interception_is_keyboard(device))
        {
            InterceptionKeyStroke &kstroke = *(InterceptionKeyStroke *) &stroke;

            interception_send(context, device, &stroke, 1);

            if(kstroke.code == SCANCODE_ESC) break;
        }
    }

    interception_destroy_context(context);

    return 0;
}    

您可能会看到在反转垂直位移之前检查了 INTERCEPTION_MOUSE_MOVE_ABSOLUTE 标志。通常操作系统使用相对坐标,但我经历过在虚拟机中鼠标坐标以绝对形式工作,而不是相对坐标。为简单起见,此示例仅反转相对位移。

您可以在http://oblita.com/Interception查看更多文档。

于 2012-02-16T20:05:45.983 回答
1

希望这个关于抓取原始鼠标输入的链接会有所帮助,它包括一个为 C# 编写的库以及一个 C++ 版本。它旨在启用在 Windows 中使用多个鼠标,但希望您可以模拟它用于您想要完成的任务。

于 2010-01-05T14:30:00.663 回答