I wanted to create an autoclicker that would "remember" current position of my mouse pointer, move to specific location on the desktop, perform a double click and then come back to where it was and will do this randomly every 1 to 4 seconds. This way I wanted to achieve an autoclick in a specific place and more or less be able to use my mouse to browse other stuff.
What I want to click is in a different window, it is a program that I leave open visible on one half of my desktop and on the other half I want to do other things. The problem is that auto clicker does not make the program an active window and the click does not work.
import pyautogui
import threading
import random
def makro():
z = random.randint(1,4) #timer set to random value between 1 and 4 seconds
(x, y) = pyautogui.position() #remember current position of mouse pointer
threading.Timer(z, makro).start()
pyautogui.doubleClick(1516, 141) #perform a double click in this location (this clicks do not make the window active and clicks do not work)
pyautogui.moveTo(x, y) #come back to original mouse pointer location
makro()
Thank you for help
I think adding
pyautogui.click(1516, 141) before pyautogui.doubleClick(1516, 141) could activate the window.
Related
I'm trying to use pyautogui and click at a certain area on my screen, but I want it to click without physically moving my cursor, kind of like an invisible click. So far, I have no idea how to do it, only the typical automate clicking and moving of cursor position to the area.
I used the following:
pyautogui.click(x=100, y=13)
But, it moved the cursor to that specific position instead of sending click. Is there any possible way to do so with pyautogui or any other module ?
import pyautogui
# Get the x and y coordinates of the target location
x = 100
y = 13
# Move the cursor to the target location
pyautogui.moveTo(x, y)
# Simulate a left mouse button down at the target location
pyautogui.mouseDown(button='left', x=x, y=y)
# Simulate a left mouse button up at the target location
pyautogui.mouseUp(button='left', x=x, y=y)
This usually works on the primary monitor. I tested with the right click.
import pyautogui
# Get the size of the primary monitor.
screenWidth, screenHeight = pyautogui.size()
print(screenWidth, screenHeight)
pyautogui.click(100, 200, button='right')
The pyautogui.click() function can simulate a mouse click without moving the cursor. You can use it by specifying the x and y coordinates of the location you want to click.
Here's an example code snippet:
import pyautogui
# Click at position (100, 13)
pyautogui.click(x=100, y=13)
This will simulate a left mouse click at the coordinates (100, 13) on the screen, without moving the cursor. Note that you may need to adjust the coordinates to match the position where you want to click on your specific screen.
I made a program with tkinter to make groups of apps in taskbar
I want to open it above its icon in the taskbar but I think there isn't a specific function (after research) for it in tkinter so I made it to get mouse position using this code
to get x coordinate of the mouse (subtract 65 to be on the middle)
x = root.winfo_pointerx() - 65
and for y it will get the work area using win32api and then subtracts 60 so it can be above the taskbar a little
monitor_info = GetMonitorInfo(MonitorFromPoint((0,0)))
work_area = monitor_info.get("Work")
constant_y = work_area[3] - 60
and this the geometry
root.geometry(f'100x50+{str(x)}+{str(constant_y)}')
but the problem that the program take a few seconds to open so if you move the mouse it won't open in the right place
https://drive.google.com/file/d/1jjFTB4xDM21yEV2Mn9nD1YLb9GSu8Fhd/view?usp=sharing
first this how I want it to open
second is the problem
my questions:
is there any function to do it directly without all this calculation?
or can I do all of this algorithms but the code will take the x and y when clicked the program and be constant even if you move the mouse?
I searched for the answer but nothing comes up. I want to make a script for the game, but i also want to make my mouse movement more unpredictable so i want to record my own mouse movement. Or record macro mouse movement in another program and run it via python maybe? How can i do it?
There is a library called pyautogui which you can download using the pip command in your terminal pip install PyAutoGUI
import pyautogui
a = pyautogui.position()
print(a)
>>> Point(x=1290, y=342)
you can run pyautoqui.position() anytime you want to get the mouse coordinates on the screen or create a loop which repeatedly gets the position of the mouse. In the loop below I added a sleep(0.5) so that it waits a small second jsut to show taht it works since without the sleep function it would run so fast I didn't have time to move my mouse and show that it worked.
import pyautogui
from time import sleep
for i in range(10):
print(pyautogui.position())
sleep(0.5)
>>>Point(x=689, y=540)
>>>Point(x=820, y=503)
>>>Point(x=1122, y=698)
>>>Point(x=528, y=608)
>>>Point(x=1316, y=301)
>>>Point(x=937, y=288)
>>>Point(x=734, y=529)
>>>Point(x=1055, y=310)
>>>Point(x=584, y=763)
>>>Point(x=740, y=298)
To move the mouse use:
>>> pyautogui.moveTo(100, 200) # moves mouse to X of 100, Y of 200.
>>> pyautogui.moveTo(None, 500) # moves mouse to X of 100, Y of 500.
>>> pyautogui.moveTo(600, None) # moves mouse to X of 600, Y of 500.
Here none means to keep the x or y the same.
To move gradually over time use this:
>>> pyautogui.moveTo(100, 200, 2) # moves mouse to X of 100, Y of 200 over 2 seconds
use moveTo to move to a coordinate, you can change moveTo to move and set the pixels to how many pixels you want to move from the current location.
I am using pynput based listener to detect and record mouse clicks using python.
def on_click(x, y, button, pressed):
if pressed:
on_release("clicked")
button = str(button).replace("Button.","")
inverted_comma = "'"
button = f"{inverted_comma}{button}{inverted_comma}"
mouse_values = [x, y, button]
macro_writer('click',mouse_values)
#image based click
time.sleep(1)
pyautogui.moveTo(1,1)
time.sleep(2)
x = x-50
y = y-50
im3 = pyautogui.screenshot(r"D:\Library\Project\Project\theautomater\src\macro\prett2.png",region=(x,y, 100 , 100))
I am able to record the coordinates of the mouse. Problem is I want to record the image/icon where the mouse clicks and as you can see the last line, I can do that but it happens AFTER the click.
This creates the problem that the icon is in "clicked" or "hover" state.
The solution I am thinking of implementing is pausing the click function taking screenshot then clicking.
For this, I need to figure out how to delay the mouse click using python. Can anyone suggest something?
The other question on SO, does not work as intended (Delay mouse click 0.5 second), please do not mark as duplicate.
I created a small Python script using win32api to use on the popular game Cookie Clicker (a game where you have to click on a Big Cookie to gain points) just for fun. It has a function called "auto_clicker" that do just that: keeps clicking on the screen on the point the user defined. This is the script:
# -*- coding: utf-8 -*-
import win32con
import win32api
def clicker(x,y):
"""Clicks on given position x,y
Input:
x -- Horizontal position in pixels, starts from top-left position
y -- Vertical position in pixels, start from top-left position
"""
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 auto_clicker(x = -1,y = -1):
"""Keep clicking on position x,y. If no input is given, gets from actual
mouse position.
"""
if x == -1 | y == -1:
x,y = win32api.GetCursorPos()
while True:
clicker(x,y)
It works nicely, but I want to make some improvements:
How can I get the cursor position only when the user clicks instead when the function is called? I would prefer to not add another module
since win32api seems to contain everything I needed. Tried this
method without success.
How can I detect a keypress like "Escape", so I can exit from my program without the ugly hack I am using now (Ctrl+Alt+Del seems to give SetCursorPos denied access, so Python throws a error and exit the program).
Can I make this program portable? Seems like I can do using Tkinter and generating a invisible Tk window, but I tried to write something without success.
I don't think with win32api you can listen to clicks you can just generate them (not sure though). However, try using pyHook, it's a simple api easy to use and can be found here http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=Main_Page. With pyhook you can create a listener to listen to a mouse event and upon a mouse click you can do whatever you want, the example in the link shows you how. As for key press, you can use the same api for that too, also an example is provided, good luck!
use pynput . It can control mouse, keyboard, etc.
examples:
from pynput.mouse import Button, Controller
mouse = Controller()
# Read pointer position
print('The current pointer position is {0}'.format(
mouse.position))
# Set pointer position
mouse.position = (10, 20)
print('Now we have moved it to {0}'.format(
mouse.position))
# Move pointer relative to current position
mouse.move(5, -5)
# Press and release
mouse.press(Button.left)
mouse.release(Button.left)
# Double click; this is different from pressing and releasing
# twice on Mac OSX
mouse.click(Button.left, 2)
# Scroll two steps down
mouse.scroll(0, 2)