Releases: spyoungtech/ahk
v1.0.0.post1
Post-release to address some packaging issues. Updates readme and fixes the "binary" extra.
v1.0.0
V1
Version 1.0 is a nearly-complete rewrite of the library, includes a major overhaul of the internals, bringing major improvements (as well as some breaking changes in the public API).
Major features/improvements
Here are some of the big improvements coming in 1.0
(code samples are preliminary and subject to change)
Python callbacks for hotkeys
Previously, hotkeys could only be setup to run AutoHotkey scripts as callbacks. Now, Python callables are supported as callbacks.
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 foreverNow whenever you press your hotkeys, the python callback will fire.
You can also add an exception handler for your callback:
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)Hotstrings are now supported
Hotstrings can also be added to the hotkey process thread.
In addition to Hotstrings supporting normal AHK string replacements, you can also provide Python callbacks (with optional exception handlers) in response to hotstrings triggering.
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 hotstringMore of the AutoHotkey API is available
- Support for controls is added
win_methods are now available and can be called without aWindowobjectTitleMatchMode,CoordMode,DetectHiddenWindowsnow exposed, both as parameters to functions affected by these settings as well as default change viaset_methods e.g.,set_title_match_mode.- clipboard support is added
block_inputis implemented
Improvements for 'Nonblocking' API
- Virtually all methods that call into AutoHotkey now support the
blockingkeyword argument (previously, only select methods could do this) - Nonblocking functionality is now supported in the Async API
- Instead of returning a process object, nonblocking calls now return a
concurrent.futures.Futureobject or aasyncio.Taskobject (for the Async API), allowing you to more easily get results from nonblocking calls and/or await their completion.
Fully type-hinted API (PEP 561 compliant)
Enjoy all the benefits of a completely type-hinted API. Great for type-hinting and validating your own code, as well as just getting the various intellisense/IDE features that typically come with type-hinted code.
AutoHotkey process is now run as a daemon for performance
This is mostly an internal API change, but it has some impacts on users as well. Mainly, this brings a significant performance boost, stability, and the ability to implement a few more methods that were not possible in the previous execution model.
In v0.13.0, the daemon mode feature was released. Daemon mode uses a single AutoHotkey process to run all of the code (rather than creating a new AutoHotkey process for every method invocation). This is now the default execution model. Additionally, the underlying AutoHotkey code interacts with Python through an explicit messaging protocol, allowing for AutoHotkey to explicitly indicate return types.
Other minor improvements
run_scriptcan now alternatively accept a path to an autohotkey script instead of only accepting a literal script as a string.
Deprecations and Breaking Changes
While most of the Public API is the same as in v0, there are some significant changes
- Support for Python 3.6 - 3.7 is dropped. The new minimum Python version is 3.8
- Original
HotKeyimplementation has been removed and replaced byadd_hotkey. AHK script strings are no longer supported for hotkeys -- only python callbacks are allowed (but your callback can callrun_scriptif you wish). ActionChainhas been removed- For clarity, many parameters like
blockinghave become keyword-only - The behavior of
send/send_inputis slightly different - escaping sequences like`n,`r,`t`,, and similar are no longer required to be escaped. However, braces and similar sequences still need to be escaped -- e.g., in 0.x you would doahk.send_input('hello`, world{!}')-- in 1.x you would doahk.send_input('hello, world{!}') find_window[s][_by]methods no longer use generators. Usinglist_windowsis recommended instead (which is what is now used by these methods).- In the async API, property setters (e.g.,
win.title = 'new title') are no longer supported. Useset_methods (e.g.,win.set_title('new title')instead. Setters are still supported in sync API. - In the async API, property getters (e.g.,
await win.title) are deprecated. Useget_methods (e.g.,await get_title()) instead. Properties are not deprecated in the sync API. run_scriptno longer accepts thedeocdeparameter (all output is expected to be in UTF-8) use ofPopenkeyword arguments have also been removed.- All
encodingkeyword arguments have been removed. Encoding is now correctly handled for you and expected to be UTF-8 for inputs and outputs.
v1.0.0b
Pre-release of v1
v0.14.2
What's Changed
- fix typo by @forestsource in #168
- remove unused imports in utils by @spyoungtech in #180
Full Changelog: v0.14.1...v0.14.2
v0.14.1
What's Changed
- specify UTF8 for all outputs by @spyoungtech in #165
Getting non-ascii output should now be more reliable
Full Changelog: v0.14.0...v0.14.1
v0.14.0
What's Changed
- add pre-commit by @spyoungtech in #128
- Code style pre-commit hooks by @spyoungtech in #129
- Implement win_wait and make win_get consistent with find_window by @spyoungtech in #149
- Add UTF-8 codepage explicitly by @spyoungtech in #150
This release has some potential breaking changes, as the API for win_get and (async) find_window have changed slightly.
New Contributors
- @pre-commit-ci made their first contribution in #130
Full Changelog: v0.13.0...v0.14.0
v0.13.0
v0.12.0
Adds base asyncio support.
While the existing user-facing APIs remains mostly untouched, there are some significant and potentially breaking changes in this version:
- Default parameter of blocking for a couple functions is changed from False to True
- Internal API has shifted around quite a bit. Template generation and script running have been split in all (or most) methods
- Typos in classes and modules were corrected (registry.py and RegistryMixin)
v0.11.1
Adds support for adding directives to all scripts
v0.11.0
Adds fixes for key state
Adds set_capslock_state
Other improvements