用python调节鼠标移速,一次失败的探索

关键在于调整速度的原理要搞明白,但是最后还是因为无法实现而失败,仅此记录,如果有人搞出来真的调速了,希望能告诉我

一个失败的想法:反向回退调节

如何调整速度呢?
我们把鼠标轨迹理解成一条曲线,曲线的切线就是速度的方向,当 △ T \triangle T T小到一定程度,移动的轨迹可以近似为直线,或者说我稍微偏离一点人是感觉不出来的,人的视觉本身也并不精准。所以在一条直线上怎么加减速就很容易了吧,结论就出来了:

  1. 首先保证适当的位移间距或者位移时间,保证检测起点和终点之间是一条近似直线
  2. 其次进行缩放。比如我移动了10单位的距离,然后我通过两点计算给他变成3的距离,瞬间移动,人是感觉不出来的,在他的眼里,自己就是移动了3,感觉上是变慢了,实际上是我在每一个时间区间里都在拖慢他的行动。反过来,加速也如此。

理想很丰满,现实有问题。

from pynput.mouse import Button
from pynput import mouse
import numpy as np


class MouseCache:
    """主类,控制鼠标速度"""
    def __init__(self, rate):
        self.rate = rate
        self.counter=0
        self.controller=mouse.Controller()
        self.pre_position=self.controller.position
        self.target_position=self.controller.position
        # Collect events until released
        """
                with mouse.Listener(
            on_move=self.on_move,
            on_click=self.on_click,
            on_scroll=self.on_scroll) as listener:
            listener.join()
        """
        listener = mouse.Listener(
            on_move=self.on_move,
            on_click=self.on_click,
            on_scroll=self.on_scroll
        )
        listener.start()
        while True:
            print(1) #奇怪,加了print反而可以提高更新频率
            if self.target_position!=self.pre_position:
                #print('change')
                self.controller.position=self.target_position
                self.pre_position=self.target_position


    def on_move(self, x, y):
        self.counter=self.counter+1
        if(self.counter>=2): # 调成2也会抖动,不行了
            self.counter=0
            self.target_position=tuple(map(lambda a,b:np.around((1-self.rate)*a+self.rate*b),
                                           self.pre_position,
                                           self.controller.position))
            

    def on_click(self, x, y, button, pressed):
        print('{0} at {1}'.format(
            'Pressed' if pressed else 'Released',
            (x, y)))
        if not pressed:
            # Stop listener
            print(f'Stop listener')
            return False

    def on_scroll(self, x, y, dx, dy):
        print('Scrolled {0} at {1}'.format(
            'down' if dy < 0 else 'up',
            (x, y)))
        #self.controller.position = (0, 0)


if __name__ == '__main__':
    MouseCache(0.1)

首先是在on_move回调函数里,对鼠标修改是无效的。这样合理,毕竟一边移动一边修改,到底算那个?

这时就另想他法,用一个变量去做两个函数间的通信,使用while True持续检测,结果又不太行,虽然是能更新了,但是更新的频率即使很高,依旧是不够高,也会有抖动,不行,另寻他法吧

又一个失败的思路:改注册表

我又发现可以通过修改注册表来修改速度,而且python也可以修改注册表。

然而,需要重启电脑注册表才能生效,又失败了。

感想

其实当时在网上搜索不到现成的思路的时候,我就应该明白,这可能就难以实现。不过也学到了很多东西,也算有所收获,对图形界面,线程,以及键盘鼠标的监控与操纵更熟悉了,以后自动化办公摸鱼也应该更加方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦梦亦醒乐逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值