全局鼠标钩+模拟鼠标输入

时间:2010-01-05 13:41:54

标签: mouse hook global

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

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

例如,假设我们的输入看起来像这样:

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更新...我可以检测输入的频率,并每隔一个输入发送一个输入???例如,我可以将鼠标频率从125hz“加倍”到250hz,并根据我设置的任何规则模拟我自己的'中间'更新...

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

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

2 个答案:

答案 0 :(得分:1)

希望this link on grabbing raw mouse input会有所帮助,它包括一个为C#编写的库以及一个C ++版本。它旨在允许在Windows中使用多个鼠标,但希望您可以模拟它用于您想要完成的任务。

答案 1 :(得分:1)

我已经构建了一个可以帮助您的库,它是一个简单的c库和can work on games where common windows api would not

以下示例显示如何使用此库反转鼠标移动,它基本上只是将垂直轴上的位移乘以-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查看更多文档。