Un emballage Python entièrement tapé autour d'AutoHotKey.
pip install ahk
Nécessite Python 3.8+
Prend en charge AutoHotKey V1 et V2. Voir aussi: dépendances non-python
from ahk import AHK
ahk = AHK ()
ahk . mouse_move ( x = 100 , y = 100 , blocking = True ) # Blocks until mouse finishes moving (the default)
ahk . mouse_move ( x = 150 , y = 150 , speed = 10 , blocking = True ) # Moves the mouse to x, y taking 'speed' seconds to move
print ( ahk . mouse_position ) # (150, 150)Exemples non exhaustifs de certaines fonctions disponibles avec ce package. Voir la documentation complète pour les références API complètes et les fonctionnalités supplémentaires.
Les raccourcis clavier peuvent être configurés pour exécuter les fonctions Python comme des rappels.
Par exemple:
from ahk import AHK
def my_callback ():
print ( 'Hello callback!' )
ahk = AHK ()
# when WIN + n is pressed, fire `my_callback`
ahk . add_hotkey ( '#n' , callback = my_callback )
ahk . start_hotkeys () # start the hotkey process thread
ahk . block_forever () # not strictly needed in all scripts -- stops the script from exiting; sleep forever Maintenant chaque fois que vous appuyez + n , la fonction de rappel my_callback sera appelée dans un thread d'arrière-plan.
Vous pouvez également ajouter un gestionnaire d'exceptions pour votre rappel:
from ahk import AHK
ahk = AHK ()
def go_boom ():
raise Exception ( 'boom!' )
def my_ex_handler ( hotkey : str , exception : Exception ):
print ( 'exception with callback for hotkey' , hotkey , 'Here was the error:' , exception )
ahk . add_hotkey ( '#n' , callback = go_boom , ex_handler = my_ex_handler )Il existe également des méthodes pour éliminer les raccourcis clavier:
# ...
ahk . remove_hotkey ( '#n' ) # remove a hotkey by its keyname
ahk . clear_hotkeys () # remove all hotkeysNoter que:
ahk.start_hotkeys() )ahk.stop_hotkeys() (ne s'arrêtera pas activement à exécuter des rappels)Voir aussi la documentation AHK pertinente
HotStrings peut également être ajouté au fil du processus de hot-clé.
En plus des HotStrings prenant en charge les remplacements de chaîne AHK normaux, vous pouvez également fournir des rappels Python (avec des gestionnaires d'exceptions en option) en réponse au déclenchement de HotStrings.
from ahk import AHK
ahk = AHK ()
def my_callback ():
print ( 'hello callback!' )
ahk . add_hotstring ( 'btw' , 'by the way' ) # string replacements
ahk . add_hotstring ( 'btw' , my_callback ) # call python function in response to the hotstringVous pouvez également supprimer les coups de chaud:
ahk . remove_hotstring ( 'btw' ) # remove a hotstring by its trigger sequence
ahk . clear_hotstrings () # remove all registered hotstrings from ahk import AHK
ahk = AHK ()
ahk . mouse_position # Returns a tuple of mouse coordinates (x, y) (relative to active window)
ahk . get_mouse_position ( coord_mode = 'Screen' ) # get coordinates relative to the screen
ahk . mouse_move ( 100 , 100 , speed = 10 , relative = True ) # Moves the mouse reletave to the current position
ahk . mouse_position = ( 100 , 100 ) # Moves the mouse instantly to absolute screen position
ahk . click () # Click the primary mouse button
ahk . click ( 200 , 200 ) # Moves the mouse to a particular position and clicks (relative to active window)
ahk . click ( 100 , 200 , coord_mode = 'Screen' ) # click relative to the screen instead of active window
ahk . click ( button = 'R' , click_count = 2 ) # Clicks the right mouse button twice
ahk . right_click () # Clicks the secondary mouse button
ahk . mouse_drag ( 100 , 100 , relative = True ) # Holds down primary button and moves the mouse from ahk import AHK
ahk = AHK ()
ahk . type ( 'hello, world!' ) # Send keys, as if typed (performs string escapes for you)
ahk . send_input ( 'Hello, {U+1F30E}{!}' ) # Like AHK SendInput
# Unlike `type`, control sequences must be escaped manually.
# For example the characters `!^+#=` and braces (`{` `}`) must be escaped manually.
ahk . key_state ( 'Control' ) # Return True or False based on whether Control key is pressed down
ahk . key_state ( 'CapsLock' , mode = 'T' ) # Check toggle state of a key (like for NumLock, CapsLock, etc)
ahk . key_press ( 'a' ) # Press and release a key
ahk . key_down ( 'Control' ) # Press down (but do not release) Control key
ahk . key_up ( 'Control' ) # Release the key
ahk . set_capslock_state ( "On" ) # Turn CapsLock on
if ahk . key_wait ( 'x' , timeout = 3 ): # wait for a key to be pressed; returns a boolean
print ( 'X was pressed within 3 seconds' )
else :
print ( 'X was not pressed within 3 seconds' )Vous pouvez également faire des trucs avec Windows.
from ahk import AHK
ahk = AHK ()
win = ahk . active_window # Get the active window
win = ahk . win_get ( title = 'Untitled - Notepad' ) # by title
all_windows = ahk . list_windows () # list of all windows
win = ahk . win_get_from_mouse_position () # the window under the mouse cursor
win = ahk . win_get ( title = 'ahk_pid 20366' ) # get window from pid
# Wait for a window
try :
# wait up to 5 seconds for notepad
win = ahk . win_wait ( title = 'Untitled - Notepad' , timeout = 5 )
# see also: win_wait_active, win_wait_not_active
except TimeoutError :
print ( 'Notepad was not found!' ) from ahk import AHK
ahk = AHK ()
ahk . run_script ( 'Run Notepad' ) # Open notepad
win = ahk . find_window ( title = 'Untitled - Notepad' ) # Find the opened window; returns a `Window` object
# Window object methods
win . send ( 'hello' , control = 'Edit1' ) # Send keys directly to the window (does not need focus!)
# OR ahk.control_send(title='Untitled - Notepad', control='Edit1')
win . move ( x = 200 , y = 300 , width = 500 , height = 800 )
win . activate () # Give the window focus
win . close () # Close the window
win . hide () # Hide the window
win . kill () # Kill the window
win . maximize () # Maximize the window
win . minimize () # Minimize the window
win . restore () # Restore the window
win . show () # Show the window
win . disable () # Make the window non-interactable
win . enable () # Enable it again
win . to_top () # Move the window on top of other windows
win . to_bottom () # Move the window to the bottom of the other windows
win . get_class () # Get the class name of the window
win . get_minmax () # Get the min/max status
win . get_process_name () # Get the process name (e.g., "notepad.exe")
win . process_name # Property; same as `.get_process_name()` above
win . is_always_on_top () # Whether the window has the 'always on top' style applied
win . list_controls () # Get a list of controls (list of `Control` objects)
win . redraw () # Redraw the window
win . set_style ( "-0xC00000" ) # Set a style on the window (in this case, removing the title bar)
win . set_ex_style ( "^0x80" ) # Set an ExStyle on the window (in this case, removes the window from alt-tab list)
win . set_region ( "" ) # See: https://www.autohotkey.com/docs/v2/lib/WinSetRegion.htm
win . set_trans_color ( "White" ) # Makes all pixels of the chosen color invisible inside the specified window.
win . set_transparent ( 155 ) # Makes the specified window semi-transparent (or "Off" to turn off transparency)
win . always_on_top = 'On' # Make the window always on top
# or
win . set_always_on_top ( 'On' )
for window in ahk . list_windows (): # list all (non-hidden) windows -- ``detect_hidden_windows=True`` to include hidden
print ( window . title )
# Some more attributes
print ( window . text ) # window text -- or .get_text()
print ( window . get_position ()) # (x, y, width, height)
print ( window . id ) # the ahk_id of the window
print ( window . pid ) # process ID -- or .get_pid()
print ( window . process_path ) # or .get_process_path()
if win . active : # or win.is_active()
...
if win . exist : # or win.exists()
...
# Controls
edit_control = win . list_controls ()[ 0 ] # get the first control for the window, in this case "Edit1" for Notepad
edit_control . get_text () # get the text in Notepad
edit_control . get_position () # returns a `Postion` namedtuple: e.g. Position(x=6, y=49, width=2381, height=1013) Diverses méthodes de fenêtre peuvent également être appelées directement sans créer d'abord un objet Window en utilisant les méthodes win_* sous-jacentes sur la classe AHK . Par exemple, au lieu de win.close() comme ci-dessus, on pourrait appeler ahk.win_close(title='Untitled - Notepad') à la place.
from ahk import AHK
ahk = AHK ()
ahk . image_search ( 'C: \ path \ to \ image.jpg' ) # Find an image on screen
# Find an image within a boundary on screen
ahk . image_search ( 'C: \ path \ to \ image.jpg' , upper_bound = ( 100 , 100 ), # upper-left corner of search area
lower_bound = ( 400 , 400 )) # lower-right corner of search area
ahk . pixel_get_color ( 100 , 100 ) # Get color of pixel located at coords (100, 100)
ahk . pixel_search ( color = '0x9d6346' , search_region_start = ( 0 , 0 ), search_region_end = ( 500 , 500 )) # Get coords of the first pixel with specified color Obtenir / définir les données Clipboard
from ahk import AHK
ahk = AHK ()
ahk . set_clipboard ( 'hello N{EARTH GLOBE AMERICAS} ' ) # set clipboard text contents
ahk . get_clipboard () # get clipboard text contents
# 'hello ?'
ahk . set_clipboard ( "" ) # Clear the clipboard
ahk . clip_wait ( timeout = 3 ) # Wait for clipboard contents to change (with text or file(s))
ahk . clip_wait ( timeout = 3 , wait_for_any_data = True ) # wait for _any_ clipboard contents Vous pouvez également obtenir / définir ClipboardAll - cependant, vous ne devez jamais essayer d'appeler set_clipboard_all avec toute autre donnée que exactement comme le renvoyé par get_clipboard_all ou des problèmes inattendus peuvent se produire.
from ahk import AHK
ahk = AHK ()
# save all clipboard contents in all formats
saved_clipboard = ahk . get_clipboard_all ()
ahk . set_clipboard ( 'something else' )
...
ahk . set_clipboard_all ( saved_clipboard ) # restore saved content from earlier Vous pouvez également définir un rappel pour exécuter lorsque le contenu du presse-papiers change. Comme pour les méthodes de piste de tête mentionnées ci-dessus, vous pouvez également définir un gestionnaire d'exceptions. Comme les raccourcis clavier, les rappels on_clipboard_change nécessitent également que .start_hotkeys() est appelé pour prendre effet.
La fonction de rappel doit accepter un argument de position, qui est un entier indiquant le type de données du presse-papiers.
from ahk import AHK
ahk = AHK ()
def my_clipboard_callback ( change_type : int ):
if change_type == 0 :
print ( 'Clipboard is now empty' )
elif change_type == 1 :
print ( 'Clipboard has text contents' )
elif change_type == 2 :
print ( 'Clipboard has non-text contents' )
ahk . on_clipboard_change ( my_clipboard_callback )
ahk . start_hotkeys () # like with hotkeys, must be called at least once for listening to start
# ...
ahk . set_clipboard ( "hello" ) # will cause the message "Clipboard has text contents" to be printed by the callback
ahk . set_clipboard ( "" ) # Clears the clipboard, causing the message "Clipboard is now empty" to be printed by the callback from ahk import AHK
ahk = AHK ()
ahk . sound_play ( 'C: \ path \ to \ sound.wav' ) # Play an audio file
ahk . sound_beep ( frequency = 440 , duration = 1000 ) # Play a beep for 1 second (duration in microseconds)
ahk . get_volume ( device_number = 1 ) # Get volume of a device
ahk . set_volume ( 50 , device_number = 1 ) # Set volume of a device
ahk . sound_get ( device_number = 1 , component_type = 'MASTER' , control_type = 'VOLUME' ) # Get sound device property
ahk . sound_set ( 50 , device_number = 1 , component_type = 'MASTER' , control_type = 'VOLUME' ) # Set sound device property Info-bullets / traytips
import time
from ahk import AHK
ahk = AHK ()
ahk . show_tooltip ( "hello4" , x = 10 , y = 10 )
time . sleep ( 2 )
ahk . hide_tooltip () # hide the tooltip
ahk . show_info_traytip ( "Info" , "It's also info" , silent = False , blocking = True ) # Default info traytip
ahk . show_warning_traytip ( "Warning" , "It's a warning" ) # Warning traytip
ahk . show_error_traytip ( "Error" , "It's an error" ) # Error trytipBoîte de dialogue
from ahk import AHK , MsgBoxButtons
ahk = AHK ()
ahk . msg_box ( text = 'Do you like message boxes?' , title = 'My Title' , buttons = MsgBoxButtons . YES_NO )
ahk . input_box ( prompt = 'Password' , title = 'Enter your password' , hide = True )
ahk . file_select_box ( title = 'Select one or more mp3 files' , multi = True , filter = '*.mp3' , file_must_exist = True )
ahk . folder_select_box ( prompt = 'Select a folder' ) Vous pouvez modifier divers états mondiaux tels que CoordMode , DetectHiddenWindows , etc. afin que vous n'ayez pas à passer ces paramètres directement aux appels de fonction
from ahk import AHK
ahk = AHK ()
ahk . set_coord_mode ( 'Mouse' , 'Screen' ) # set default Mouse CoordMode to be relative to Screen
ahk . set_detect_hidden_windows ( True ) # Turn on detect hidden windows by default
ahk . set_send_level ( 5 ) # Change send https://www.autohotkey.com/docs/v1/lib/SendLevel.htm
ahk . set_title_match_mode ( 'Slow' ) # change title match speed and/or mode
ahk . set_title_match_mode ( 'RegEx' )
ahk . set_title_match_mode (( 'RegEx' , 'Slow' )) # or both at the same time
ahk . set_send_mode ( 'Event' ) # change the default SendMode Vous pouvez ajouter des directives qui seront ajoutées à tous les scripts générés. Par exemple, pour empêcher l'apparition du trayicon AHK, vous pouvez ajouter la directive Notrayicon.
from ahk import AHK
from ahk . directives import NoTrayIcon
ahk = AHK ( directives = [ NoTrayIcon ])Par défaut, certaines directives sont automatiquement ajoutées pour garantir la fonctionnalité et sont fusionnées avec toutes les directives fournies par l'utilisateur.
Les directives ne sont pas appliquées pour le processus AHK utilisé pour gérer les raccourcis clavier et les saccages (discuté ci-dessous) par défaut. Pour appliquer une directive au processus de raccourcis clavier à l'aide de l'argument du mot-clé apply_to_hotkeys_process=True :
from ahk import AHK
from ahk . directives import NoTrayIcon
directives = [
NoTrayIcon ( apply_to_hotkeys_process = True )
]
ahk = AHK ( directives = directives )Comme discuté ci-dessus, vous pouvez masquer l'icône du plateau si vous le souhaitez. De plus, certaines méthodes sont disponibles pour personnaliser l'icône du plateau.
from ahk import AHK
ahk = AHK ()
# change the tray icon (in this case, using a builtin system icon)
ahk . menu_tray_icon ( 'Shell32.dll' , 174 )
# revert it back to the original:
ahk . menu_tray_icon ()
# change the tooltip that shows up when hovering the mouse over the tray icon
ahk . menu_tray_tooltip ( 'My Program Name' )
# Hide the tray icon
ahk . menu_tray_icon_hide ()
# Show the tray icon that was previously hidden by ``NoTrayIcon`` or ``menu_tray_icon_hide``
ahk . menu_tray_icon_show ()Vous pouvez lire / écrire / supprimer des clés de registre:
from ahk import AHK
ahk = AHK ()
ahk . reg_write ( 'REG_SZ' , r'HKEY_CURRENT_USERSOFTWAREmy-software' , value = 'test' )
ahk . reg_write ( 'REG_SZ' , r'HKEY_CURRENT_USERSOFTWAREmy-software' , value_name = 'foo' , value = 'bar' )
ahk . reg_read ( r'HKEY_CURRENT_USERSOFTWAREmy-software' ) # 'test'
ahk . reg_delete ( r'HKEY_CURRENT_USERSOFTWAREmy-software' )Si une clé n'existe pas ou si un autre problème se produit, une exception est soulevée.
La plupart des méthodes de cette bibliothèque fournissent une interface non bloquante, de sorte que vos scripts Python peuvent continuer à s'exécuter pendant que vos scripts AHK s'exécutent.
Par défaut, tous les appels bloquent - chaque fonction s'exécutera complètement avant l'exécution de la prochaine fonction.
Cependant, vous pouvez parfois exécuter un autre code pendant que AHK exécute du code. Lorsque l'argument de mot-clé blocking est fourni avec False , les appels de fonction reviendront immédiatement pendant que la fonction AHK est effectuée en arrière-plan.
À titre d'exemple, vous pouvez déplacer lentement la souris et signaler sa position lorsqu'elle se déplace:
import time
from ahk import AHK
ahk = AHK ()
ahk . mouse_position = ( 200 , 200 ) # Moves the mouse instantly to the start position
start = time . time ()
# move the mouse very slowly
ahk . mouse_move ( x = 100 , y = 100 , speed = 30 , blocking = False )
# This code begins executing right away, even though the mouse is still moving
while True :
t = round ( time . time () - start , 4 )
position = ahk . mouse_position
print ( t , position ) # report mouse position while it moves
if position == ( 100 , 100 ):
break Lorsque vous spécifiez blocking=False vous recevrez toujours un objet FutureResult spécial (ou un objet AsyncFutureResult dans l'API asynchronisé, discuté ci-dessous) qui vous permet d'attendre la fonction pour terminer et récupérer la valeur de retour via une fonction get_result . Même lorsqu'une fonction n'en renvoie normalement None , cela peut être utile pour s'assurer qu'AHK a fini l'exécution de la fonction.
appels non bloquants:
set_coord_mode ou similaires) - cela peut changer dans une future version.FutureResult spécial (ou un objet AsyncFutureResult dans l'API asynchronisé, discuté ci-dessous) qui vous permet d'attendre la fonction pour compléter et récupérer la valeur de retour via la fonction result . Même lorsqu'une fonction n'en renvoie normalement None , cela peut être utile pour s'assurer qu'AHK a fini l'exécution de la fonction. from ahk import AHK
ahk = AHK ()
future_result = ahk . mouse_move ( 100 , 100 , speed = 40 , blocking = False )
...
# wait on the mouse_move to finish
future_result . result ( timeout = 10 ) # timeout keyword is optional Une API asynchronisée est fournie afin que les fonctions puissent être appelées en utilisant async / await . Toutes les mêmes méthodes de l'API synchrones sont disponibles dans l'API asynchrone.
from ahk import AsyncAHK
import asyncio
ahk = AsyncAHK ()
async def main ():
await ahk . mouse_move ( 100 , 100 )
x , y = await ahk . get_mouse_position ()
print ( x , y )
asyncio . run ( main ())L'API asynchrone est identique à celle de l'API normale, avec quelques différences notables:
.mouse_position ou .title pour Windows) peuvent être await , des méthodes supplémentaires (comme get_mouse_position() et get_title() ) ont été ajoutées pour une API plus intuitive et sont recommandées sur l'utilisation des propriétés.ahk.mouse_postion = (200, 200) ) ne sont pas autorisés dans l'API asynchronisée (une Everror Runtime est augmentée). Les setteurs de propriétés restent disponibles dans l'API Sync.AsyncFutureResult (renvoyés lors de la spécification blocking=False ) fonctionnent de la même manière que les objets FutureResult dans l'API SYNC, sauf que le mot-clé timeout n'est pas pris en charge pour la méthode result ).Notez également que:
AsyncAHK ne s'exécuteront pas simultanément. Vous devez soit utiliser blocking=False , comme dans l'API Sync, soit utiliser plusieurs instances d' AsyncAHK . Cette bibliothèque est entièrement introduite par type, vous permettant de tirer parti des outils comme mypy pour aider à valider la correction du type de votre code. Les IDE qui implémentent les fonctionnalités de vérification de type sont également en mesure de tirer parti des conseils de type pour vous assurer que votre code est sûr.
Vous pouvez également exécuter un code AutoHotKey arbitraire en tant que fichier de script .ahk ou comme une chaîne contenant du code AHK.
from ahk import AHK
ahk = AHK ()
my_script = '''
MouseMove, 100, 100
; etc...
'''
ahk . run_script ( my_script ) from ahk import AHK
ahk = AHK ()
script_path = r'C:PathTomyscript.ahk'
ahk . run_script ( script_path ) Pour utiliser ce package, vous avez besoin de l'exécutable AutoHotKey (par exemple, AutoHotkey.exe ). Il devrait être sur le chemin par défaut ou dans un emplacement d'installation par défaut ( C:Program FilesAutoHotkeyAutoHotkey.exe pour V1 ou C:Program FilesAutoHotkeyv2AutoHotkey64.exe pour V2)
AutoHotKey V1 et V2 sont tous deux entièrement pris en charge, bien que certaines différences comportementales se produisent en fonction de la version que vous utilisez. Voir les notes ci-dessous.
La façon recommandée de fournir le binaire AutoHotKey (pour V1 et V2) est d'installer le supplément binary pour ce package. Cela fournira les exécutables nécessaires et aidera à s'assurer qu'ils sont correctement placés sur le chemin.
pip install "ahk[binary]"
Alternativement, vous pouvez fournir le chemin du code:
from ahk import AHK
ahk = AHK ( executable_path = 'C: \ path \ to \ AutoHotkey.exe' ) Vous pouvez également utiliser la variable d'environnement AHK_PATH pour spécifier l'emplacement exécutable.
set AHK_PATH=C:PathToAutoHotkey.exe
python myscript.py Par défaut, lorsqu'aucun paramètre executable_path (variable d'environnement AHK_PATH ) n'est défini, seuls les noms binaires AutoHotKey V1 sont recherchés sur des emplacements de chemin ou d'installation par défaut. Ce comportement peut changer dans les versions futures pour permettre à V2 d'être utilisée par défaut.
Pour utiliser AutoHotKey version 2, vous pouvez faire l'une des choses suivantes:
executable_path avec l'emplacement du binaire AutoHotkey V2AHK_PATH avec l'emplacement d'un binaire AutoHotkey V2version avec la valeur v2 qui permet de trouver l'exécutable à l'aide de noms binaires AutoHotKey V2 et d'emplacements d'installation par défaut.Par exemple:
from ahk import AHK
ahk = AHK ( executable_path = r'C:Program FilesAutoHotkeyv2AutoHotkey64.exe' )
# OR
ahk = AHK ( version = 'v2' ) Lorsque vous fournissez l'argument de mot-clé version (avec "v1" ou "v2" ), un chèque est effectué pour s'assurer que le binaire fourni (ou découvert) correspond à la version demandée. Lorsque le mot clé version est omis, la version est déterminée automatiquement à partir du binaire exécutable fourni (ou découvert).
L'API de ce projet est à l'origine conçue contre AutoHotKey V1 et les signatures de fonction sont les mêmes, même lors de l'utilisation d'AutoHotKey V2. Bien que la plupart du comportement reste le même, un certain comportement change lors de l'utilisation de AutoHotkey V2 par rapport à V1. Cela est principalement dû aux différences sous-jacentes entre les deux versions.
Certaines des différences notables que vous pouvez ressentir lors de l'utilisation de AutoHotkey V2 avec cette bibliothèque comprennent:
None retourner (comme dans AutoHotKey V2, une targetorror est lancée dans la plupart des cas où la fenêtre ou le contrôle ne peut être trouvé)ControlSend ( ahk.control_send ou Window.send ou Control.send ) diffère dans AutoHotKey V2 lorsque le paramètre control n'est pas spécifié. Dans V1, les clés sont envoyées aux commandes les plus hautes, ce qui est généralement le comportement correct. En V2, les clés sont envoyées directement à la fenêtre. Cela signifie que dans de nombreux cas, vous devez spécifier explicitement le contrôle lorsque vous utilisez V2.secondstowait Paramater pour TrayTip ( ahk.show_traytip ) a été supprimé dans V2. La spécification de ce paramètre dans l'emballage Python entraînera l'émission d'un avertissement et le paramètre est ignoré.Input plutôt que sur Event dans V1 (en conséquence, par exemple, les paramètres de vitesse de souris vers mouse_move et mouse_drag seront ignorés dans V2 à moins que le mode d'envoi ne soit modifié)2 dans AutoHotKey V2. Il est 1 dans AutoHotkey V1. Utilisez les arguments de mot-clé title_match_mode pour win_get et d'autres méthodes qui acceptent ce mot-clé pour contrôler ce comportement ou utilisez set_title_match_mode pour modifier le comportement par défaut (les appels non bloquants sont exécutés dans des processus distincts et ne sont pas affectés par set_title_match_mode ) Vous pouvez développer des extensions pour étendre les fonctionnalités d' ahk - c'est-à-dire: écrire votre propre code AutoHotKey et ajouter des méthodes supplémentaires à la classe AHK. Voir les documents d'extension pour plus d'informations.
Toutes les contributions sont les bienvenues et appréciées.
N'hésitez pas à ouvrir un problème GitHub ou des relations publiques pour les commentaires, les idées, les demandes de fonctionnalités ou les questions.
Ce sont des projets similaires qui sont couramment utilisés pour l'automatisation avec Python.
keyboard , pur pur python me souris Control!