Stimulate REAL mouse release event - python

I am trying to trigger a mouse left click event then release that click so it should be like a real mouse click.
I am currently doing it like that:
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)
I've also tried pynput like that:
mouse.click(Button.left)
and:
mouse.press(Button.left)
mouse.release(Button.left)
So, all the three codes works fine and they almost work the same way... But try a real mouse click on https://cookie.riimu.net/speed/ then try the click made using Python on the same site.
The real mouse click is like that (GIF picture): https://i.vgy.me/l6JMtn.gif
But, the click made using Python is like that (GIF picture): https://i.vgy.me/dHSkux.gif
So as you can see, in the real mouse click: the circle pops in then pops out. But in the Python mouse click, the circle pops in and doesn't pop out again.
What can be causing that? And is there's any possible fix?

30 milliseconds is a correct delay between the click and the release.
So this would stimulate a real left mouse click and release:
def click(x,y):
win32api.SetCursorPos((x,y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
time.sleep(30 / 1000)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

Related

pyautuogui click(button="left') right clicking in MacOS Monterrey

Using pyautogui in macOS to automate a click using the click(button="left") method but this is result in a right click... Any ideas how to fix?
import pyautogui
pyautogui.moveTo(1200,60)
pyautogui.click(button="left")
Expecting the method to generate a left mouse click. Instead it is generating a right mouse click

Pyautogui not properly moving the mouse in Roblox

I'm writing code in python to help me accomplish something in a Roblox game. I won't go into too much detail, but basically, the objective is to automatically click at certain points in the screen. To try to accomplish this, I am using pyautogui.click(). So for instance if the point I needed to click at was (300, 500), I'd do pyautogui.click(300, 500)
Outside of Roblox, pyautogui works just fine. However, whenever I have Roblox open and I use the commands, it doesn't work properly. So, let's say the mouse starts out at (0, 0), and I activate a click at (300, 500). When that happens, the mouse cursor doesn't move, and the click happens at (0, 0) where the mouse originally was. However, as soon as I move my actual mouse even slightly, the mouse cursor teleports back to (300, 500) where it was supposed to be.
This makes it impossible to do what I want because I want the program to click at certain spots without me having to move my actual, physical mouse. Does anyone know how I can use python to actually move the mouse properly?
You have to use win32api and win32con for moving and clicking the mouse, as pyautogui is sometimes slow, so I am using win32api instead.
This is the code I used.
from pyautogui import *
import pyautogui
import time
import win32api, win32con
def click(x,y):
win32api.SetCursorPos((x,y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
time.sleep(0.1) #uses time api, to simulate normal input.
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
you have to use pyautoit to make it work inside of roblox, i used autoit.mouse_click("left",x, y) to make the mouse go to an x and y position in your screen and click the left or right click.
Yes I've been getting the same problem so I switched up to AHK(Auto Hotkey). I think (Idk what's happening in the background) the win32 api calls made by python is not using a deep method as you have to download and give permission to AHK to achieve that. So Roblox might have found a way to detect physical input tho they still can't detect deep api calls made by AHK

Simulating longer mouse button press in python

Okay, so I want to make mouse macro in Python 3.8 that will automatically press and release mouse buttons (combination for fishing game, so that I don't have to manually repeat clicking mouse buttons). I have read descriptions for both mouse module and PyAutoGUI module, and from what I can see, PyAutoGUI seems more powerful, but I don't know how to set time how long mouse button will be pressed in either of those. From what I can see they have "click" function, but I want to set how long the mouse button will be pressed. Regards
here there is the parameters for pyautogui.click()
x=None, y=None, clicks=1, interval=0.0, button=PRIMARY, duration=0.0, tween=linear, logScreenshot=None, _pause=True
as you can see you can modify the duration by saying
pyautogui.click(your_x, your_y, duration=5.0)
i have put five but you can put any float value

Pyautogui mouse clicks without actually moving the mouse

I'd like to know if it's possible to automate clicks with pyautogui without compromising the funcionality of my cursor. I automate clicks with pyautogui but my cursor becomes useless while the script is running as the cursor moves around the screen. I was wondering if it is possible to either 1) have two cursos and have pyautogui automating one while I operate the other myself, or 2) have pyautogui click on the screen without actually moving my cursor.
I'm guessing the OS (like most of them) does not have support for multiple mouse pointers. This means that pyautogui does not have it either. The closest you can get to the behavior you are describing is to save your current mouse position with pyautogui.position(), then pressing where you want to press and then jumping back to that position. When done quickly you will have control of your mouse pointer between the automated clicks.
Example:
# Save mouse position
(x, y) = pyautogui.position()
# Your automated click
pyautogui.click(200, 300)
# Move back to where the mouse was before click
pyautogui.moveTo(x, y)
PyAutoGui to my knowledge does not support this functionality, however, at least according to this thread here, using autoit with the function ControlClick allows simulated mouse clicks without any associated cursor movement.
first solution is to save the current mouse location then return to it after mouse click as follows
import pyautogui
(x,y)=pyautogui.position()
pyautogui.click(600,300)
pyautogui.moveTo(x,y)
second solution is to make a keyboard shortcut for the button then simply pressing the button without moving the mouse

How to get mouse button controls?

I trying to work out how to get the mouse button controls.
I tried looking in pygame docs but it doesn't say; it just returns the state of the mouse. I do understand this but I don't know how to use that info to control the buttons on the mouse.
I have made a game where you could shoot bullets. Whenever you place the MOUSEBUTTONDOWN command in my python script and you try clicking the buttons on the mouse, the right and the left shoots bullets. How can I make it so that only the left mouse button only shoots bullets while the right button does something else?
Also, can you add automatic on the mouse? Instead of clicking the mouse button several times, whenever the left or the right mouse button is pressed the bullet shoots automatically instead of clicking on the button several times.
It starts to get annoying when you're playing a game. Any help is appreciated.
You can use pygame.mouse.get_pressed() (link to docs) to get a
sequence of booleans representing the state of all the mouse buttons. A True value means the mouse is currently being pressed at the time of the call.
As far as "automatic" fire goes, each time round your pygame.event loop you can check if the button is still pressed and fire another bullet.

Categories