关键在于调整速度的原理要搞明白,但是最后还是因为无法实现而失败,仅此记录,如果有人搞出来真的调速了,希望能告诉我
一个失败的想法:反向回退调节
如何调整速度呢?
我们把鼠标轨迹理解成一条曲线,曲线的切线就是速度的方向,当
△
T
\triangle T
△T小到一定程度,移动的轨迹可以近似为直线,或者说我稍微偏离一点人是感觉不出来的,人的视觉本身也并不精准。所以在一条直线上怎么加减速就很容易了吧,结论就出来了:
- 首先保证适当的位移间距或者位移时间,保证检测起点和终点之间是一条近似直线
- 其次进行缩放。比如我移动了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也可以修改注册表。
然而,需要重启电脑注册表才能生效,又失败了。
感想
其实当时在网上搜索不到现成的思路的时候,我就应该明白,这可能就难以实现。不过也学到了很多东西,也算有所收获,对图形界面,线程,以及键盘鼠标的监控与操纵更熟悉了,以后自动化办公摸鱼也应该更加方便。