Automates mouse/keyboard, works with games like Roblox!
Project description
mousekey
-
Works with multi screens
-
Keyboard and mouse can be used in Games like Roblox
-
Has only a few dependencies (all of them pure python except NumPy)
-
Can simulate human-like mouse movement
-
Facilitates multi key presses
Check out the videos
Some methods
<a href="https://www.youtube.com/watch?v=1YugTBZBiyE">
<img src="https://img.youtube.com/vi/1YugTBZBiyE/0.jpg" style="width:100%;">
</a>
25 minutes of Roblox botting - 900x clicks / 900x keystrokes
<a href="https://www.youtube.com/watch?v=OGPoiBnsy1M">
<img src="https://img.youtube.com/vi/OGPoiBnsy1M/0.jpg" style="width:100%;">
</a>
Installation
$pip install mousekey
from mousekey import MouseKey
mkey = MouseKey()
Before you start, enable your guardian angel :)
# Kills the whole process, does always work (even with pure except)
mkey.enable_failsafekill('ctrl+e')
try:
while True:
try:
print('baba')
time.sleep(1)
except:
pass
except:
pass
baba
baba
baba
baba
# After pressing ctrl+e:
Process finished with exit code 1
How to click and move
The click methods should be able to handle any Game
I have tested it with Roblox, which is known for blocking almost everything.
As far as I know, there is no Python module that can handle Roblox (https://pypi.org/project/ahk/ works, but you need to download ahk.exe)
Absolute coordinates
mkey.left_click_xy_natural(
200,
200,
delay=.3, # duration of the mouse click (down - up)
min_variation=-3, # a random value will be added to each pixel - define the minimum here
max_variation=3, # a random value will be added to each pixel - define the maximum here
use_every=4, # use every nth pixel
sleeptime=(0.005, 0.009), # delay between each coordinate
print_coords=True, # console output
percent=90, # the lower, the straighter the mouse movement
) # A logarithm calculation lowers the speed when the cursor is getting close to the destination, like you do it in real life.
# Also available:
mkey.middle_click_xy_natural
mkey.right_click_xy_natural
# if you don't want to click, only move, use:
mkey.move_to_natural(100,100) # natural mouse movement
mkey.move_to(3100,100) = move # no delay
# Moving without delay and clicking:
mkey.left_click_xy(10,10)
mkey.right_click_xy(10,10)
mkey.middle_click_xy(10,10)
#Only clicking:
mkey.left_click()
mkey.middle_click()
mkey.right_click()
Relative coordinates
# For relative coordinates, use:
mkey.left_click_xy_natural_relative(
50,
50,
delay=0.1,
sleeptime=(0.00005, 0.00009),
print_coords=True,
)
mkey.right_click_xy_natural_relative(
x=500,
y=500,
delay=0.1,
sleeptime=(0.00005, 0.00009),
print_coords=True,
)
# move and click relatively
mkey.move_relative
mkey.middle_click_xy_relative(-100,-100)
mkey.move_to_natural_relative(300,-400)
Pressing keys
# press a single key
mkey.force_activate_window(10290540)
mkey.press_key('f', delay=1) # delay in seconds
# You can press as many keys simultaneously as you want.
# The first value in each tuple indicates the sleep time before the next key is pressed, and presstime is the delay of the whole action.
mkey.force_activate_window(10290540)
mkey.press_keys_simultaneously_own_interval(
keystopress=[(0.1, "ctrl"), (0.1, "v")], presstime=.5
)
# This method will calculate the sleep time between each key presses, so you don't have to worry about it.
mkey.force_activate_window(10290540)
mkey.press_keys_simultaneously(
keystopress=["alt", "f4", "enter", "enter"],
presstime=1.1,
percentofregularpresstime=100,
)
# You can get a list with all available keys here: mkey.show_all_keys
# I covered different writing styles ('volume_mute', 'VOLUME_MUTE', 'VOLUME MUTE', 'volume mute'),
{'control-break processing': 3,
'backspace': 8,
'tab': 9,
'clear': 254,
'enter': 13,
'shift': 16,
'ctrl': 17,
'alt': 18,
'pause': 19,
'caps lock': 20,
'ime hangul mode': 21,
'ime junja mode': 23,
'ime final mode': 24,
'ime kanji mode': 25,
'esc': 27,
'ime convert': 28,
'ime nonconvert': 29,
'ime accept': 30,
'ime mode change request': 31,
'spacebar': 32,
'page up': 33,
...}
# You can block the mouse/keyboard input while executing actions.
# That way, the user can't mess it up.
# If something goes wrong, press ctrl+alt+del
# This will automatically unlock the mouse/keyboard
# Here is one example. Always use mkey.block_user_input() / mkey.unblock_user_input()
if mkey.block_user_input():
try:
for k in range(3):
mkey.right_click()
sleep(1)
mkey.left_click_xy_natural(10, 10)
sleep(1)
finally:
mkey.unblock_user_input()
# You can send Unicode strings as well
mkey.force_activate_window(10290540)
mkey.send_unicode('bababöä')
# I have slightly modified 2 methods from pywinauto
# Most of the code is from pywinauto, I only changed the way the window gets activated
mkey.send_keys_to_hwnd(handle=7539468, keys='babadu')
mkey.send_keystrokes_to_hwnd(handle=7539468, '%{F4}') # alt+f4
# Here are all keystrokes for those 2 methods:
https://pywinauto.readthedocs.io/en/latest/code/pywinauto.keyboard.html?highlight=VK_SPACE#pywinauto-keyboard
{SCROLLLOCK}, {VK_SPACE}, {VK_LSHIFT}, {VK_PAUSE}, {VK_MODECHANGE},
{BACK}, {VK_HOME}, {F23}, {F22}, {F21}, {F20}, {VK_HANGEUL}, {VK_KANJI},
{VK_RIGHT}, {BS}, {HOME}, {VK_F4}, {VK_ACCEPT}, {VK_F18}, {VK_SNAPSHOT},
{VK_PA1}, {VK_NONAME}, {VK_LCONTROL}, {ZOOM}, {VK_ATTN}, {VK_F10}, {VK_F22},
{VK_F23}, {VK_F20}, {VK_F21}, {VK_SCROLL}, {TAB}, {VK_F11}, {VK_END},
{LEFT}, {VK_UP}, {NUMLOCK}, {VK_APPS}, {PGUP}, {VK_F8}, {VK_CONTROL},
{VK_LEFT}, {PRTSC}, {VK_NUMPAD4}, {CAPSLOCK}, {VK_CONVERT}, {VK_PROCESSKEY},
{ENTER}, {VK_SEPARATOR}, {VK_RWIN}, {VK_LMENU}, {VK_NEXT}, {F1}, {F2},
{F3}, {F4}, {F5}, {F6}, {F7}, {F8}, {F9}, {VK_ADD}, {VK_RCONTROL},
{VK_RETURN}, {BREAK}, {VK_NUMPAD9}, {VK_NUMPAD8}, {RWIN}, {VK_KANA},
{PGDN}, {VK_NUMPAD3}, {DEL}, {VK_NUMPAD1}, {VK_NUMPAD0}, {VK_NUMPAD7},
{VK_NUMPAD6}, {VK_NUMPAD5}, {DELETE}, {VK_PRIOR}, {VK_SUBTRACT}, {HELP},
{VK_PRINT}, {VK_BACK}, {CAP}, {VK_RBUTTON}, {VK_RSHIFT}, {VK_LWIN}, {DOWN},
{VK_HELP}, {VK_NONCONVERT}, {BACKSPACE}, {VK_SELECT}, {VK_TAB}, {VK_HANJA},
{VK_NUMPAD2}, {INSERT}, {VK_F9}, {VK_DECIMAL}, {VK_FINAL}, {VK_EXSEL},
{RMENU}, {VK_F3}, {VK_F2}, {VK_F1}, {VK_F7}, {VK_F6}, {VK_F5}, {VK_CRSEL},
{VK_SHIFT}, {VK_EREOF}, {VK_CANCEL}, {VK_DELETE}, {VK_HANGUL}, {VK_MBUTTON},
{VK_NUMLOCK}, {VK_CLEAR}, {END}, {VK_MENU}, {SPACE}, {BKSP}, {VK_INSERT},
{F18}, {F19}, {ESC}, {VK_MULTIPLY}, {F12}, {F13}, {F10}, {F11}, {F16},
{F17}, {F14}, {F15}, {F24}, {RIGHT}, {VK_F24}, {VK_CAPITAL}, {VK_LBUTTON},
{VK_OEM_CLEAR}, {VK_ESCAPE}, {UP}, {VK_DIVIDE}, {INS}, {VK_JUNJA},
{VK_F19}, {VK_EXECUTE}, {VK_PLAY}, {VK_RMENU}, {VK_F13}, {VK_F12}, {LWIN},
{VK_DOWN}, {VK_F17}, {VK_F16}, {VK_F15}, {VK_F14}
'+': {VK_SHIFT}
'^': {VK_CONTROL}
'%': {VK_MENU} a.k.a. Alt key
Activating windows
# lists all current windows and their hwnds, pid ...
mkey.get_all_windows()
WindowInfo(pid=24880, title='tooltips_class32', windowtext='', hwnd=38931464, length=1, tid=14156, status='invisible', coords_client=(0, 0, 0, 0), dim_client=(0, 0), coords_win=(0, 0, 0, 0), dim_win=(0, 0), class_name='tooltips_class32', path='C:\\Windows\\explorer.exe'),
WindowInfo(pid=24916, title='IME', windowtext='Default IME', hwnd=333592, length=12, tid=6716, status='invisible', coords_client=(0, 0, 0, 0), dim_client=(0, 0), coords_win=(0, 0, 0, 0), dim_win=(0, 0), class_name='IME', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(pid=24916, title='IME', windowtext='Default IME', hwnd=1706956, length=12, tid=20004, status='invisible', coords_client=(0, 0, 0, 0), dim_client=(0, 0), coords_win=(0, 0, 0, 0), dim_win=(0, 0), class_name='IME', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(pid=24916, title='MSCTFIME UI', windowtext='MSCTFIME UI', hwnd=35652702, length=12, tid=20004, status='invisible', coords_client=(0, 0, 0, 0), dim_client=(0, 0), coords_win=(0, 0, 0, 0), dim_win=(0, 0), class_name='MSCTFIME UI', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(pid=24916, title='Notepad', windowtext='*Untitled - Notepad', hwnd=10290540, length=20, tid=20004, status='visible', coords_client=(0, 840, 0, 519), dim_client=(840, 519), coords_win=(714, 1570, 196, 774), dim_win=(856, 578), class_name='Notepad', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(pid=24916, title='WorkerW', windowtext='', hwnd=984520, length=1, tid=6716, status='invisible', coords_client=(0, 120, 0, 0), dim_client=(120, 0), coords_win=(0, 136, 0, 39), dim_win=(136, 39), class_name='WorkerW', path='C:\\Windows\\System32\\notepad.exe')]
# pass and hwnd (code above) as argument.
mkey.activate_window(10290540) # usually this is enough to activate a window
#if not, use this method
# Activating a window is sometimes tricky. This method forces the activation of the window and works quite often when other methods don't
mkey.force_activate_window(17630556)
# Pins a window on top of all others.
mkey.activate_topmost(17630556)
# Restore the normal hierarchy.
# This method is helpful when one of your windows gets stuck during the automation in the topmost position
mkey.deactivate_topmost(17630556)
# Some apps hide the cursor, here can you check it
mkey.is_cursor_shown ()
True
# Shows you the coordinates of the current cursor position. Press ctrl+l when you have found the right coordinates.
mkey.start_showing_cursor_position(exit_keys='ctrl+l')
mkey.get_single_element_from_coords(200,200)
WindowInfo(parent=-1, pid=20440, title='Edit', windowtext='', hwnd=592576, length=1, tid=17252, status='visible', coords_client=(0, 1903, 0, 1007), dim_client=(1903, 1007), coords_win=(0, 1920, 43, 1050), dim_win=(1920, 1007), class_name='Edit', path='C:\\Windows\\System32\\notepad.exe')
mkey.get_elements_from_coords(200,200)
{'element': WindowInfo(parent=-1, pid=20440, title='Edit', windowtext='', hwnd=592576, length=1, tid=17252, status='visible', coords_client=(0, 1903, 0, 1007), dim_client=(1903, 1007), coords_win=(0, 1920, 43, 1050), dim_win=(1920, 1007), class_name='Edit', path='C:\\Windows\\System32\\notepad.exe'),
'family': [WindowInfo(parent=-1, pid=20440, title='Edit', windowtext='', hwnd=592576, length=1, tid=17252, status='visible', coords_client=(0, 1903, 0, 1007), dim_client=(1903, 1007), coords_win=(0, 1920, 43, 1050), dim_win=(1920, 1007), class_name='Edit', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(parent=-1, pid=20440, title='Notepad', windowtext='*Untitled - Notepad', hwnd=1051364, length=20, tid=17252, status='visible', coords_client=(0, 1920, 0, 1007), dim_client=(1920, 1007), coords_win=(-8, 1928, -8, 1058), dim_win=(1936, 1066), class_name='Notepad', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(parent=-1, pid=20440, title='msctls_statusbar32', windowtext='', hwnd=2886324, length=1, tid=17252, status='invisible', coords_client=(0, 484, 0, 23), dim_client=(484, 23), coords_win=(0, 484, 461, 484), dim_win=(484, 23), class_name='msctls_statusbar32', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(parent=-1, pid=784, title='#32769', windowtext='', hwnd=65552, length=1, tid=984, status='visible', coords_client=(0, 1920, 0, 1080), dim_client=(1920, 1080), coords_win=(0, 1920, 0, 1080), dim_win=(1920, 1080), class_name='#32769', path='')]}
mkey.get_elements_from_hwnd(2886324)
{'element': WindowInfo(parent=-1, pid=20440, title='msctls_statusbar32', windowtext='', hwnd=2886324, length=1, tid=17252, status='invisible', coords_client=(0, 484, 0, 23), dim_client=(484, 23), coords_win=(0, 484, 461, 484), dim_win=(484, 23), class_name='msctls_statusbar32', path='C:\\Windows\\System32\\notepad.exe'),
'family': [WindowInfo(parent=-1, pid=20440, title='Edit', windowtext='', hwnd=592576, length=1, tid=17252, status='visible', coords_client=(0, 1903, 0, 1007), dim_client=(1903, 1007), coords_win=(0, 1920, 43, 1050), dim_win=(1920, 1007), class_name='Edit', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(parent=-1, pid=20440, title='Notepad', windowtext='*Untitled - Notepad', hwnd=1051364, length=20, tid=17252, status='visible', coords_client=(0, 1920, 0, 1007), dim_client=(1920, 1007), coords_win=(-8, 1928, -8, 1058), dim_win=(1936, 1066), class_name='Notepad', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(parent=-1, pid=20440, title='msctls_statusbar32', windowtext='', hwnd=2886324, length=1, tid=17252, status='invisible', coords_client=(0, 484, 0, 23), dim_client=(484, 23), coords_win=(0, 484, 461, 484), dim_win=(484, 23), class_name='msctls_statusbar32', path='C:\\Windows\\System32\\notepad.exe'),
WindowInfo(parent=-1, pid=784, title='#32769', windowtext='', hwnd=65552, length=1, tid=984, status='visible', coords_client=(0, 1920, 0, 1080), dim_client=(1920, 1080), coords_win=(0, 1920, 0, 1080), dim_win=(1920, 1080), class_name='#32769', path='')]}
mkey.get_single_element_from_hwnd(10290540)
Out[18]: WindowInfo(parent=-1, pid=24916, title='Notepad', windowtext='*Untitled - Notepad', hwnd=10290540, length=20, tid=20004, status='visible', coords_client=(0, 840, 0, 519), dim_client=(840, 519), coords_win=(714, 1570, 196, 774), dim_win=(856, 578), class_name='Notepad', path='C:\\Windows\\System32\\notepad.exe')
# Gets the rgb values from coordinates and shows the values simultaneously, press ctrl+c when you are done, the method will return a list with all coordinates and colors.
rgblist = mkey.show_rgb_values_at_mouse_position(
sleeptime=0.01,
on_left_click=False,
on_right_click=False,
rgb_values=True,
rgba_values=True,
coords=True,
time_value=True,)
# Getting the screen resolution
mkey.get_screen_resolution()
(1920, 1080)
mkey.get_active_window()
WindowInfo(pid=11144, title='SunAwtFrame', windowtext='Python Console - dfdir', hwnd=30283760, length=23, tid=6976, status='visible', coords_client=(0, 1921, 0, 996), dim_client=(1921, 996), coords_win=(2039, 3976, 54, 1058), dim_win=(1937, 1004), class_name='SunAwtFrame', path='C:\\Program Files\\JetBrains\\PyCharm Community Edition 2020.3\\bin\\pycharm64.exe')
mkey.get_cursor_position() # executed only once
(2436, 994)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
mousekey-0.11.tar.gz
(32.0 kB
view details)
Built Distribution
mousekey-0.11-py3-none-any.whl
(31.4 kB
view details)
File details
Details for the file mousekey-0.11.tar.gz
.
File metadata
- Download URL: mousekey-0.11.tar.gz
- Upload date:
- Size: 32.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5107590cd6588072299eb6e20f2fe0e89c43594546510b753bce4eb43225b082 |
|
MD5 | 448acef69e85b04d1caae72719cb42cc |
|
BLAKE2b-256 | f0932d0d89d82c8298e140a319c383e2f156832444be8a1bd4a9f13d5d825497 |
File details
Details for the file mousekey-0.11-py3-none-any.whl
.
File metadata
- Download URL: mousekey-0.11-py3-none-any.whl
- Upload date:
- Size: 31.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 39705d4c93021a20f6a0816b3f1f0285d42f952e0501e24fffe28cac06fa548f |
|
MD5 | cf18c58a9a37a1305f8399bd4ef2cce9 |
|
BLAKE2b-256 | ba54c3f384df8dca9dd26c9178402bb0364dc40cc83adf60c22337de6fc5063b |