2010-01-05 153 views
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的...我可以检测输入的频率,并发送输入所有其他输入? ??因此,例如,我可以“双”鼠标频率在125Hz从到250Hz之间,并模拟我自己的“之间”根据我设置任何规则更新...

任何这些似乎并合理?现在我正在使用C#,我正在使用本教程中的“Gma.UserActivityMonitor”:http://www.codeproject.com/KB/cs/globalhook.aspx,但出于某种原因,我得到的性能影响使得在全屏游戏中使用此代码在鼠标输入上产生不可用的延迟去钩...

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

+0

这听起来不妥。你为什么需要这样做? – Skilldrick 2010-01-05 13:47:44

+0

我想制作一个覆盖Windows 3D菜单系统的鼠标接口,并且我需要能够在保持鼠标输入的同时旋转,缩放,平移等,因此我需要能够将鼠标输入钩住低级别并修改/调整它。 – Drax 2010-01-20 06:45:59

回答

1

希望this link on grabbing raw mouse input将是有益的,它包括C#和C++的版本编写的库。它意味着可以在Windows中使用多个鼠标,但希望您可以模拟它用于完成的任务。

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检查更多的文档。

+0

谢谢。我一定会考虑你的图书馆。 – 2012-02-24 01:15:00