如何控制鼠标移动速度

lyingbo 2011-04-27 05:10:27
需求:

鼠标在鼠标垫上移动距离a,光标就在屏幕上移动距离b;
一般情况下,我们鼠标移动大概几个厘米,光标就可以跨越整个屏幕,就是说a很小的时候,b就是屏幕的宽度了;

现在我想通过程序去修改这个精度:
就是当鼠标移动的距离a很大的时候,甚至是10个或者20个屏幕宽度时,光标才从屏幕的左边移动到右边,
相当于b只是a的1/10,或者1/20;

我尝试过以下方法:

1、在控制面板中修改鼠标指针移动速度,把移动速度调到最小时,也只能到两个距离一比一,达不到我的要求

2、通过函数SystemParametersInfo来设置系统光标的移动速度,移动速度设为最小值1时,和上面的第1种方法效果一致


问题

1、网上搜到的采用过滤驱动的方法:由于没有做过驱动相关的东西,不知道这种方法是否可行?

2、如果过滤驱动的方法可行的话,怎么做?

谢谢您百忙之中浏览我的帖子,在此感激不尽。

QQ:342210738
希望得到您的帮助
...全文
1722 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyingbo 2011-05-03
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 bluesky12312388 的回复:]
引用 17 楼 q342210738 的回复:

引用 1 楼 bluesky12312388 的回复:
换个思路,你HOOK鼠标移动消息,将这次移动的坐标差乘以一个比例比如说0.1就是放慢十倍,不知是否可行。


我用WH_GETMESSAGE来hook WM_MOUSEMOVE消息,不知道怎么修改hook到的消息参数~~

做过这方面用hook来修改系统消息的,麻烦告诉我下怎么……
[/Quote]
CallNextHookEx这个试了没效果的
xiaopoy 2011-05-01
  • 打赏
  • 举报
回复
这个可能我得一段时间后才能试试帮忙了。
因为弄驱动的编译环境比较麻烦,要是有什么新的进展,可以说说吗?
lyingbo 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiaopoy 的回复:]
这个在微软ddk的例子里应该有,鼠标过滤。

要HOOK鼠标发来的packet消息,得在驱动MajorFunction里的#define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f 函数里截取鼠标设备对应的CONNECTDATA。
DriverObject->MajorFunction [IRP_MJ_INTERNAL_DEVICE_CONTROL] =
……
[/Quote]

[Quote=引用 10 楼 xiaopoy 的回复:]
对了。

我看的例子是这个:
http://msdn.microsoft.com/en-us/library/ff542393(v=vs.85).aspx
源代码是在WDK安装后sample目录的

你可以到在线看
http://www.hackchina.com/r/194283/moufiltr.h__html

参考资料:
http://msdn.microsoft.co……
[/Quote]


好的,谢谢你了~~很有用的资料~~
lyingbo 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pathuang68 的回复:]
通过这个函数肯定可以改变鼠标移动的速度,还可以改变很多系统级的参数。
BOOL SystemParametersInfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni)
要调整鼠标速度,可将第一个参数设为SPI_SETMOUSESPEED。

楼主可以到网上自己搜搜这个函数的用法。
[/Quote]

前面说了,通过这个函数的SPI_SETMOUSESPEED修改的效果,最小速度也差不多是我要的速度的10倍了
bluesky12312388 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 q342210738 的回复:]

引用 1 楼 bluesky12312388 的回复:
换个思路,你HOOK鼠标移动消息,将这次移动的坐标差乘以一个比例比如说0.1就是放慢十倍,不知是否可行。


我用WH_GETMESSAGE来hook WM_MOUSEMOVE消息,不知道怎么修改hook到的消息参数~~

做过这方面用hook来修改系统消息的,麻烦告诉我下怎么把放慢十倍之后的消息放回去
[/Quote]
CallNextHookEx
lyingbo 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bluesky12312388 的回复:]
换个思路,你HOOK鼠标移动消息,将这次移动的坐标差乘以一个比例比如说0.1就是放慢十倍,不知是否可行。
[/Quote]

我用WH_GETMESSAGE来hook WM_MOUSEMOVE消息,不知道怎么修改hook到的消息参数~~

做过这方面用hook来修改系统消息的,麻烦告诉我下怎么把放慢十倍之后的消息放回去
lyingbo 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xiaopoy 的回复:]
这个很让感兴趣,要是问题还没解决 /:^]
我也想试着做些例子。
[/Quote]

目前还没搞定,以前没接触过驱动的东西,第一次接触,学习的很慢~~~
pathuang68 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 q342210738 的回复:]

引用 11 楼 pathuang68 的回复:
通过这个函数肯定可以改变鼠标移动的速度,还可以改变很多系统级的参数。
BOOL SystemParametersInfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni)
要调整鼠标速度,可将第一个参数设为SPI_SETMOUSESPEED。

楼主可以到网上自己搜搜这个函数的用……
[/Quote]

Sorry,心里想着其他的事情,没仔细看题。
xiaopoy 2011-04-29
  • 打赏
  • 举报
回复
这个很让感兴趣,要是问题还没解决 /:^]
我也想试着做些例子。
pathuang68 2011-04-28
  • 打赏
  • 举报
回复
通过这个函数肯定可以改变鼠标移动的速度,还可以改变很多系统级的参数。
BOOL SystemParametersInfo(UINT uiAction,UINT uiParam,PVOID pvParam,UINT fWinlni)
要调整鼠标速度,可将第一个参数设为SPI_SETMOUSESPEED。

楼主可以到网上自己搜搜这个函数的用法。
xiaopoy 2011-04-28
  • 打赏
  • 举报
回复
对了。

我看的例子是这个:
http://msdn.microsoft.com/en-us/library/ff542393(v=vs.85).aspx
源代码是在WDK安装后sample目录的

你可以到在线看
http://www.hackchina.com/r/194283/moufiltr.h__html

参考资料:
http://msdn.microsoft.com/en-us/library/ff539838(v=VS.85).aspx
xiaopoy 2011-04-28
  • 打赏
  • 举报
回复
这个在微软ddk的例子里应该有,鼠标过滤。

要HOOK鼠标发来的packet消息,得在驱动MajorFunction里的#define IRP_MJ_INTERNAL_DEVICE_CONTROL 0x0f 函数里截取鼠标设备对应的CONNECTDATA。
DriverObject->MajorFunction [IRP_MJ_INTERNAL_DEVICE_CONTROL] =
MouFilter_InternIoCtl;
MouFilter_InternIoCtl会收到
#define IOCTL_INTERNAL_MOUSE_CONNECT CTL_CODE(FILE_DEVICE_MOUSE, 0x0080, METHOD_NEITHER, FILE_ANY_ACCESS)
这个internal device control requests。

当出现irpStack->Parameters.DeviceIoControl.IoControlCode这个controlcode里出现IOCTL_INTERNAL_MOUSE_CONNECT时,irq的stack(堆栈)里
(irpStack->Parameters.DeviceIoControl.Type3InputBuffer));
里面就保存着这个mouse设备的CONNECT_DATA的指针
typedef struct _CONNECT_DATA {
IN PDEVICE_OBJECT ClassDeviceObject;
IN PVOID ClassService;
} CONNECT_DATA, *PCONNECT_DATA;
其中CONNECT_DATA结构中的classService就是过滤鼠标消息的关键了。

它指向一个函数,这个函数的指针为:
VOID MouseClassServiceCallback(
__in PDEVICE_OBJECT DeviceObject,
__in PMOUSE_INPUT_DATA InputDataStart,
__in PMOUSE_INPUT_DATA InputDataEnd,
__inout PULONG InputDataConsumed
);
Parameters:
DeviceObject [in]
Pointer to the class device object.

InputDataStart [in]
Pointer to the first mouse input data packet in the input buffer of the port device.

InputDataEnd [in]
Pointer to the mouse input data packet that immediately follows the last data packet in the input data buffer of the port device.

InputDataConsumed [in, out]
Pointer to the number of mouse input data packets that are transferred by the routine.

这里的InputDataStart指向的数据的结构是
typedef struct _MOUSE_INPUT_DATA {
USHORT UnitId;
USHORT Flags;
union {
ULONG Buttons;
struct {
USHORT ButtonFlags;
USHORT ButtonData;
} ;
} ;
ULONG RawButtons;
LONG LastX;
LONG LastY;
ULONG ExtraInformation;
} MOUSE_INPUT_DATA, *PMOUSE_INPUT_DATA;
详细的介绍参看:
http://msdn.microsoft.com/en-us/library/ff542403(v=vs.85).aspx

这个就是要修改的鼠标packet了。想抛弃还是想让它对应的动作发生,就看你的需要了。

希望可以帮到你 /:^]
lyingbo 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jixingzhong 的回复:]
控制面板-》打印机和其他硬件-》鼠标-》指针选项,调整移动速度
[/Quote]

试过了,不是我要的效果,谢谢你了
lyingbo 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiaopoy 的回复:]
是想控制自己的程序里的移动速度,还是整个系统的移动速度?

在自己的程序里的话,直接在WM_MOUSEMOVE里处理下就好使了。 /:^]

整个系统的鼠标移动速度,在R3想HOOK住所有进程的消息处理的确很麻烦,不如直接做个过滤用的驱动
[/Quote]

是想控制整个系统的移动速度,如果做个过滤用的驱动的话,想跟您请教下,我有下了几个usb鼠标filter的源代码,我该怎么改?
jixingzhong 2011-04-28
  • 打赏
  • 举报
回复
去vc板块看看是否有高手知道相关的api
jixingzhong 2011-04-28
  • 打赏
  • 举报
回复
暂时没找到相关的api
jixingzhong 2011-04-28
  • 打赏
  • 举报
回复
控制面板-》打印机和其他硬件-》鼠标-》指针选项,调整移动速度
xiaopoy 2011-04-28
  • 打赏
  • 举报
回复
是想控制自己的程序里的移动速度,还是整个系统的移动速度?

在自己的程序里的话,直接在WM_MOUSEMOVE里处理下就好使了。 /:^]

整个系统的鼠标移动速度,在R3想HOOK住所有进程的消息处理的确很麻烦,不如直接做个过滤用的驱动
lyingbo 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bluesky12312388 的回复:]
换个思路,你HOOK鼠标移动消息,将这次移动的坐标差乘以一个比例比如说0.1就是放慢十倍,不知是否可行。
[/Quote]
这个方法我先下,谢谢了,期待其他方法
bluesky12312388 2011-04-27
  • 打赏
  • 举报
回复
换个思路,你HOOK鼠标移动消息,将这次移动的坐标差乘以一个比例比如说0.1就是放慢十倍,不知是否可行。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧