2

I am writing a chunk of code to get gather mouse click information using pyHook and then the win32api to get access to a click function. Essentially I am trying to use the mouse to record a pattern of clicks to be recorded and played back later.

Here is my present code:

import win32api, win32con, time, win32ui, pyHook, pythoncom

#Define the clicks in the win32api
def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

def onclick(event):
    click()
    print event.Position
    return True

hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(click)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()

I am sure there is something stupidly simple.

Also here is the debug I got from running this:

Traceback (most recent call last):
File "C:\Python27\lib\site-packages\pyHook\HookManager.py", line 325, in MouseSwitch
return func(event)
TypeError: click() takes exactly 2 arguments (1 given)
falsetru
  • 357,413
  • 63
  • 732
  • 636
CodeMonkeyAlx
  • 813
  • 4
  • 16
  • 32

3 Answers3

1

hm.SubscribeMouseAllButtonsDown(click) -> hm.SubscribeMouseAllButtonsDown(onclick)

Removed click() call in onclick.

import win32api, win32con, time, win32ui, pyHook, pythoncom

def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

def onclick(event):
    print event.Position
    return True

hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(onclick)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()
falsetru
  • 357,413
  • 63
  • 732
  • 636
0

I can't install pyhook, so this is a stab in the dark. I've assumed (event_x, event_y) = event.Position.

import win32api, win32con, time, win32ui, pyHook, pythoncom

#Define the clicks in the win32api
def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

def onclick(event):
    print event.Position
    (event_x, event_y) = event.Position
    click(event_x, event_y)
    return True

hm = pyHook.HookManager()
hm.SubscribeMouseAllButtonsDown(onclick)
hm.HookMouse()
pythoncom.PumpMessages()
hm.UnhookMouse()
dilbert
  • 3,008
  • 1
  • 25
  • 34
  • this sort of works for what I am trying to do. but now it repeats the two coordinates over and over 14 times before it lets another click (Granted it takes less than a second to go through the 14 cycles) – CodeMonkeyAlx Jun 24 '13 at 16:59
  • Ah, I think falsetru's answer is probably closer to what you want. I didn't know how pyhook works; It would seem that putting an emulated click, "win32con.MOUSEEVENTF_LEFTDOWN" inside the event handler, would trigger the event handler "onclick" again. – dilbert Jun 24 '13 at 22:00
  • This is honestly only part one of the puzzle. I know how to get it to display the co-ordinates but now I need to store them / play them back. – CodeMonkeyAlx Jun 25 '13 at 16:52
0

click() gets 2 parameters and you are passing a tuple (event.position is a tuple). Do instead:

    def click((x,y)):