2014-04-01 89 views
1

我想在指定的矩形区域(限制坐标x1,y1,x2,y2,x3,y3,x4,y4)随机鼠标移动。 运动应该是平滑的,随机的,不只是直线,随机上/下/左/右/等在指定的时间。蟒蛇随机鼠标移动

你可以给我一个手或工作的例子,我可以从中学习吗? 非常感谢

+1

控制鼠标指针是高度特异性的平台。你在使用什么平台? – 9000

回答

2

此代码仅适用于Windows。您可以尝试random_movement函数中的参数以获得更好的结果。祝你好运!

import ctypes 
import random 
import time 
import math 

def move_mouse(pos): 
    x_pos, y_pos = pos 
    screen_size = ctypes.windll.user32.GetSystemMetrics(0), ctypes.windll.user32.GetSystemMetrics(1) 
    x = 65536L * x_pos/screen_size[0] + 1 
    y = 65536L * y_pos/screen_size[1] + 1 
    return ctypes.windll.user32.mouse_event(32769, x, y, 0, 0) 

def random_movement(top_left_corner, bottom_right_corner, min_speed=100, max_speed=200): 
    '''speed is in pixels per second''' 

    x_bound = top_left_corner[0], bottom_right_corner[0] 
    y_bound = top_left_corner[1], bottom_right_corner[1] 

    pos = (random.randrange(*x_bound), 
        random.randrange(*y_bound)) 

    speed = min_speed + random.random()*(max_speed-min_speed) 
    direction = 2*math.pi*random.random() 

    def get_new_val(min_val, max_val, val, delta=0.01): 
     new_val = val + random.randrange(-1,2)*(max_val-min_val)*delta 
     if new_val<min_val or new_val>max_val: 
      return get_new_val(min_val, max_val, val, delta) 
     return new_val 

    steps_per_second = 35.0 
    while True: 
     move_mouse(pos) 
     time.sleep(1.0/steps_per_second) 

     speed = get_new_val(min_speed, max_speed, speed) 
     direction+=random.randrange(-1,2)*math.pi/5.0*random.random() 

     new_pos = (int(round(pos[0]+speed*math.cos(direction)/steps_per_second)), 
       int(round(pos[1]+speed*math.sin(direction)/steps_per_second))) 

     while new_pos[0] not in xrange(*x_bound) or new_pos[1] not in xrange(*y_bound): 
      direction = 2*math.pi*random.random() 
      new_pos = (int(round(pos[0]+speed*math.cos(direction)/steps_per_second)), 
       int(round(pos[1]+speed*math.sin(direction)/steps_per_second))) 
     pos=new_pos 

实施例:

random_movement((300,300),(600,600)) 
+0

酷! :) 非常感谢你。我将从这个例子中学习一些东西。 – peter

1

对于受限于矩形的随机平滑运动,我会尝试使用随机更改系数的Lissajous curves

+0

感谢它看起来不错。但是我想随机做鼠标移动(例如当你在屏幕上移动你的鼠标时,你永远不会得到相同的动作,所以我不需要“好的”曲线,它应该只是模拟用户的鼠标)。不幸的是,我不是蟒蛇英雄,所以任何例子都非常感谢。谢谢 – peter

-1

对于执行这些动作,可以使用第三方软件包PyUserInput,它允许您控制鼠标或键盘,并且它是跨平台的。使用点安装它:

$ pip install PyUserInput 

为了做平滑的动作,你可以尝试9000在他的回答中提出的。

1
Above program does throws error in Win7 64 bit machine with embeded python  and the trace being: 
Traceback (most recent call last): 
File "mouse.py", line 52, in <module> 
random_movement((300,300),(600,600)) 
File "mouse.py", line 35, in random_movement 
move_mouse(pos) 
File "mouse.py", line 11, in move_mouse 
return ctypes.windll.user32.mouse_event(32769, x, y, 0, 0) 
ctypes.ArgumentError: argument 2: <class 'TypeError'>: Don't know how to   convert 
parameter 2 

Any idea what is wrong ?