2

I want to make a program or when I click on a key the mouse clicks automatically (as long as I click on the key) if I do not click on the key it stops.

I don't want the clicks to happen only when I touch the key once, but as long as the key is held down (It can also be the left button of the mouse pressed that trigger clicks like razer synapse mouses)

Any Idea ?

EDIT 1 :

This one works but not when a key is held down (even when the click is held down it doesn't work anyway) it only detects a single click on the mouse and then it clicks by itself instead of clicking ONLY when the key is held down...

import pyautogui, time
from pynput import mouse
from pynput.mouse import Button,Controller
from tkinter import *
from tkinter import ttk


root = Tk()
root.geometry('500x400') 

combo = ttk.Combobox(root,values=['ctrl','shift','alt'],width=5)
combo.set('Key...')
combo.pack()



def on_click(x, y, button, pressed):
    if button == mouse.Button.left:
        while pressed:
            pyautogui.click()
            pyautogui.PAUSE = 0.1
        else:
            return False

with mouse.Listener(
    on_click=on_click
    ) as Listener:
         Listener.join()

root.mainloop()
jush456
  • 51
  • 5

1 Answers1

1

You can use the mouse module (pip install mouse) to setup mouse hooks (hotkeys) that will let you trigger the clicking globally. However, in order to manage the beginning and end of this clicking, you will need to use a new thread (here is a short intro to threading if you want to learn more about it). You will want to start a thread when you press down your hotkey. This thread will continuesly click until you trigger an event that stops it. You will trigger this event by releasing your hotkey. Thus, the thread (and with it the clicking) will begin when you press the hotkey down and end when you let it back up.

Here is a piece of code that does exactly that using the middle (scroll) mouse button as the hotkey:

import mouse  # pip install mouse
import threading
import pyautogui

pyautogui.PAUSE = 0.1  # set the automatic delay between clicks, default is 0.1
    
def repeat_function(kill_event):
    # as long as we don't receive singal to end, keep clicking
    while not kill_event.is_set():
        pyautogui.click()

while True:
    # create the event that will kill our thread, don't trigget it yet
    kill_event = threading.Event()
    # create the thread that will execute our clicking function, don't start it yet
    new_thread = threading.Thread(target=lambda: repeat_function(kill_event))

    # set a hook that will start the thread when we press middle mouse button
    mouse.on_button(new_thread.start, (), mouse.MIDDLE, mouse.DOWN)
    # set a hook that will kill the thread when we release middle button
    mouse.on_button(kill_event.set, (), mouse.MIDDLE, mouse.UP)

    # wait for user to use the hotkey
    mouse.wait(mouse.MIDDLE, mouse.UP)
    # remove hooks that used the killed thread and start again with a new one
    mouse.unhook_all()

If you want to use the right mouse button instead, replace mouse.MIDDLE with mouse.RIGHT. I would not recommend using the left mouse button as the hotkey, as pyautogui will simulate clicking this button and likely break the program. If you want to use a key on the keyboard as the hotkey, check out the keyboard module. The concept there is the exact same.

Note that as this code is implemented, it will not be able to do anything else while waiting for the hotkey and processing it. You will need to use it as a separate python program if you want to use it as-is. You could also implement this code to run in a separate thread during another program, but it would definitely be easier to just launch it as a stand-alone script.

Filip Müller
  • 1,096
  • 5
  • 18
  • Thank you very much Filip Muller ! Just one last question I can run this script while doing another task (like typing on t and y for example with keyboard module) or with a GUI in tkinter ? it's just going to be more complicated like you said? – jush456 Aug 05 '22 at 05:22
  • And sorry but why mouse.LEFT isn't working ? there's a possibility to make it work or not ? If pyautogui can right click why left isn't working ? (just asking) – jush456 Aug 05 '22 at 05:38
  • @jush if you want to run other tasks along the script I provided, the easiest solution will be to make this script a solo program and run it seperately. You can have it run in the background for as long as you want, it will keep waiting for the hotkey. And for the clicks, yes sure you can have the hotkey on left button if pyautogui is going to right click instead. Just make sure pyautogui doesn't click the same button as is set for the hotkey as that will cause pyautogui to trigger this hotkey and completely mess up you program. – Filip Müller Aug 05 '22 at 08:33