Имитация кликов на python

Мне нужно чтобы программа продолжала кликать !левой! кнопкой мыши, пока я удерживаю эту же кнопку, но как только я её отпускаю - клики прекращались. Проблема в том, что имитация нажатий кнопки в цикле изменяет её состояние и программа считает, что я физически отпустил её (хотя это не так) и прекращает выполнение кода. Мне нужно что-то, чтобы узнавать состояние кнопки именно на мыши, или имитировать её нажатия так, чтобы состояние при проверке не менялось. Опробовал много различных библиотек, но результата 0, программно выполняется только один клик, а после проверки состояния кнопки она получает False и выходит из цикла.

Код:

import mouse
import keyboard
import time
import win32ui
import win32api
from configparser import ConfigParser
import os.path
from tkinter import *

def lbmc():
    state = win32api.GetAsyncKeyState(0x01)
    while state != 0:
        state = win32api.GetAsyncKeyState(0x01)
        print('works')
        mouse.click('left')
        time.sleep(1/5)

mouse.on_button(lbmc)

Этот код довольно легко реализуем на АХК, там цикл не прерывается после имитации нажатия, возможно кто-то знает каким образом там реализованы sendinput / GetKeyState, что такой проблемы не возникает


Ответы (2 шт):

Автор решения: ganz

Реализация при помощи модуля pynput

import pynput
mouses=pynput.mouse.Controller()
mouses.move(1366,768) #для кликов по часам, измени на своё разрешение
from pynput import mouse
with mouse.Events() as events:
    for event in events:
        if event.button == mouse.Button.left:
            mouses.click(pynput.mouse.Button.left,1)
            print('Received event {}'.format(event))

однако выход осуществляется не при отпускании, а при ином действии. Надо наверное какнить очистить очередь событий

→ Ссылка
Автор решения: Amgarak

Если установить "Low Level Hook", то можно отслеживать кто отправляет ввод, программа или физическая мышка.

Обычная мышка генерирует:
0x201: 'key_down', # WM_LBUTTONDOWN - 513
0x202: 'key_up', # WM_LBUTTONUP - 514
Cкан код: None 

Ваш код генерирует:
0x201: 'key_down', # WM_LBUTTONDOWN - 513
0x202: 'key_up', # WM_LBUTTONUP - 514
Cкан код: 4294967296

Следовательно можно отслеживать физическую мышку для старта\остановки кликера, а сами клики пускать программно.

→ Ссылка