Имитация кликов на 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 шт):
Реализация при помощи модуля 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))
однако выход осуществляется не при отпускании, а при ином действии. Надо наверное какнить очистить очередь событий
Если установить "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
Следовательно можно отслеживать физическую мышку для старта\остановки кликера, а сами клики пускать программно.