-
Notifications
You must be signed in to change notification settings - Fork 9
Version History
241014-1943
- macro sequence reset via
|(*macro name*)
now also interrupts an active macro - small improvement on releasing all keys that are not currently pressed on window change and on hitting esc
- only reset a macro sequence counter if not already at 0
- easy evaluation for False ->
|()
or|(!)
is the same as|(False)
- removed
esc
combination to release all keys and stop all repeated keys, can now be used as invocations as needed- new invocations
|stop_all_repeat()
|release_all_keys()
# will never replace original esc due to |(!) but the invocations will be executed
(esc_repeat_stop) +esc|(stop_all_repeat())|(release_all_keys())|(!) : +esc
241015-1227
- macro playback: key event constraints will now again be evaluated a time to be played
- to make reset invocation work as expected
- removed playback of delay for None and empty ke
- updated ReadMe
- moved function documenattion in Wiki
- updated default FSTconfig.txt
Bugfix:
- error handling for repeat updated
Bugfixes:
- empty/None key not correctly handled - now should work and only ever correspond to +ke
- now:
..., |(eval), ....
works correctly on its own
- now:
- wrong default config file name returned to normal
- removed some superfluous debug output
- removed alt+tab key release of all currently pressed simulated keys
builds up on top of V1.1.0 link - so see there for how the write aliases and name macros
###NEW
-
Repeating of Alias Groups
-
ke|(toggle_repeat('<*name of alias*>, *time in ms*)
- e.g.ke|(toggle_repeat('<scan_alias>, 6000)
- repeated alias work the same as macros
- playback can be interrupted by stopping, toggling on/off and resetting
- entirely independent of the key_event it follows as constraint
- if used in rebind, use it on a ke with a prefix (
-
or+
) or else it will be started as press and release- use new
None
key_event (description see below)- e.g.
-None|*constraint to be fulfilled*|(toggle_repeat('<*name of alias*>, *time in ms*)
- e.g.
- use new
- can not be used in tap_groups, can be used anywhere else where constraints can be used
- alias will be played like a macro:
- constraints checked at start and with defined delays
- repeat_time in ms is the time between 2 playbacks of the same alias as macro
- if macro delays are longer than the repeat_time, the restart of the repeat will interrupt the previous repeat
- multiple repeats can be started from the same key_event
-
- repeating can be control via following Evaluations:
- all will evaluate to true and only be evaluated if previous constraints are True
ke|(toggle_repeat('<*name of alias*>, *repeat time in ms*)
ke|(start_repeat('<*name of alias*>, *repeat time in ms*)
ke|(stop_repeat('<*name of alias*>)
ke|(reset_repeat('<*name of alias*>)
ke|(stop_all_repeat()
- FROM NOW ON: ALL evaluation will always evaluate to True
- if key_event should not be played add a
|(False)
constraint at the end or useNone
key_event - it is just simpler to keep in mind if all will result in True
- if key_event should not be played add a
-
None
=none
=NONE
=*empty*
=_
key_event that will never be played but the constraints will be evaluated (included delay)- use it as reset replacement with the name of the Seq as constraint or for Alias Repeat Evaluations
-
empty -> e.g.
... , |(reset('sequence')), ...
- will always be seen as +None (release) so in a trigger it will always checked as True and only trigger Evaluations once
- default Names for Tap_Groups, Rebinds and Macros if no name is given (name is needed by macros to interrupt itself)
- names for macros MUST be unique and if used in other macros they will interrupting each other
- updated display of Macros and Macro Sequences: trigger group will be displayed on line with name of macro, key groups will each have its own line
- Evaluation can now also be used with functions calls that include commas - e.g. |(pow(2 , 2) can now be used to define now complex functions to calculate times (a byproduct of implementing alias repeat)
- the previously in V1.1.0 introduced syntax for reset a Macro Sequence via Evaluation is now the only allowed way to do it
ke|(*name of macro sequence to be reset*)
-
None|(reset('sequence'))
or simply... , |(reset('sequence')), ...
also possible - a bit more verbose - can also be combined with previous constraints to only reset if they evaluate to True
-
None
key_event should be convenient replacementNone|constraint|(*sequence_name*)
- removed all reset vk_codes
-
reset
,reset_all
,reset_*number*
- using any of them will result in an Error
-
<hello> x|400,y|400
-z : -z|(toggle_repeat('<hello>', 2000))
-u : -u|(reset_repeat('<hello>'))
(stop all repeat on esc) -esc : -esc|(stop_all_repeat())
(sequence) a :: b : c : d : e
(reset of it) d : d|(sequence)
(alternate reset via None) tab :: +shift, tab, +None|(reset('sequence'))
(alternate reset via empty ke) tab :: +shift, tab, |(reset('sequence'))
See Release Notes on V1.1.0 for the other changes link
<*name of alias*>
- Aliases are active for all Focus Groups
- Maybe will come to each focus group separately so you can have the same aliases with different key groups for each focus group
- mainly intended for Macro trigger_group and key_groups, but can be used in trigger_group of Rebinds (will not work in replacement keys :-) )
- Macro Sequences can be reset by using there name as a Constraint (will evaluate to True)
- e.g.
ke|(crouch_macro)
will reset the Macro Sequence with this name - this will always eval to True, so if you do not want this key to be played just add |(False) after
- e.g.
- for all else mostly just for better overview
- will be shown in CLI
- Eval of Constraints will only start if all key_events are fulfilled
- e.g. ´-c, +ctrl|(False), +space|(constraint2)´ :
-
- -c checked, 2. +ctrl checked, 3. +space checked ... if all True then constraints will be checked
-
- constraint (False) will always be False and 5. constraint2 will never be checked
-
- e.g. ´-c, +ctrl|(False), +space|(constraint2)´ :
- Eval of Constraints will abort as soon as one (starting from the first ke) will result in False
- in Macros will always take place at the start of the playback instead at the time of the key_event being played as before - so everything will be evaluated AT THE SAME TIME with the same internal state of pressed and released keys.
- lead to changed internal state when run and not deterministic behavior if other action where taken
- or the macro itself changed the state
- ap("key_string") : all press (checks if key is pressed for real AND simulated keys)
- a("key_string") and P("key_string") only check for real key press or release
- ar("key_string") : all release (same just for releases)
- stop_all_repeat() : will stop every active repeat; eval to False
- reset_timer() changed to reset_repeat() ; eval to True
- to make it easier for menu navigation in game and to hopefully not get stuck keys outside of the game any more
- e.g. holding shift can now no longer be released by shift release of a macro or rebind (simulated key)
- #59 fixed - can be run again without any focus group in config
- #60 fixed - focus group names will now be also stripped of comments and white spaces removed before and after
For details on smaller changes see WIP release notes after the example.
So here an example of my usage right now. :-D
#<arg>-debug
#<arg>-crossover=15
#<arg>-tapdelay=6,4
#<arg>-aliasdelay=6,4
<arg>-nomenu
#<arg>-nocontrols
<arg>-nodelay
<arg>-status_indicator=15
# Tap Groups
a, d
w, s
#----------------------------------------
### Horizon Forbidden West
<focus> Horizon
<arg>-tapdelay=6,4
<arg>-aliasdelay=50,50 # shorter delays lead to missed keys in game
<arg>-nomenu
<arg>-crosshair
# Aliases
<run_if_not> -shift|(ar('shift'))
<alias_in_alias> <run_if_not>, +ctrl|75|(ap('-ctrl')), -ctrl|150, +c|75|(ap('-c')), +ctrl, -shift
# Rebinds
(autospring_toggle) caps_lock : ^shift # naming possible for tap_groups, rebinds and macros
(autosprint_on_dc) +shift|(dc()<900) : +suppress # but only has added functionality of reset for macro sequences
(focus_toggle) p: ^alt # see also macro (stop_shift_on_menu_and_map_reset)
(esc_repeat_stop) -esc : -esc|(stop_all_repeat()) # easy way to stop ALL repeating keys still active
# example for reapting key `v`, reset repeat on manual v press and stop when holding v key for at least 500 ms
(repeat_scan) +v|(tr("+v")>500) :: +v, v|(stop_repeat())
(repeat_scan) u : v|(toggle_repeat(6500)) # stop also possible just by hitting again
(repeat_scan) v : v|(reset_repeat())
# Macros
(aiming) -left_mouse, -right_mouse :: -left_mouse|900, -alt|(p("right_mouse"))
(aiming_mod1) +left_mouse, -right_mouse :: +left_mouse, +alt, -reset_0
(aiming_mod2) +right_mouse, -left_mouse :: +left_mouse|50|(last('-ml')>800), +right_mouse, +alt, -reset_0
(crouch) -c :: <run_if_not>, +c|100|(ap('-c')), -c|100, +c, -shift # example of alias usage
(crouch_mod) +c : +suppress
(evade_1) -mouse_x2|(dc('mx2')<1000) :: <alias_in_alias> # example of alias usage: dc() -> double click (on same key it is like last key press)
(evade_2) -mouse_x2|(dc('mx2')>1000) :: <run_if_not>, +c|75|(ap('-c')), -c|150, +ctrl|75|(ap('-ctrl')), +c # example of alias usage
(heavy_attack) -mouse_x1 :: -g|50, +shift|50, -shift|50, +g
(heavy_attack_mod) +mouse_x1 : +suppress
(special_ability) i :: -f|50, space|50, +f
(map_open_close) -m :: m # the only macro sequence in this example
: esc
(map_open_close_mod) +m : +suppress
(stop_shift_on_menu_and_map_reset) -tab :: +shift|100, -tab|(map_open_close) # <- new reset option based on (names)
(interact_shift_mod) +e|(tr("+e")>500) :: +e, +shift
(interact_shift_mod) +e|(dc() < 1000) :: +e, -shift
# evade macro sequence as example
# see the usage of reset after long delays to reset them automatically before next
# sequence interrupts the reset if pressed in time
# first crouch slide and then 3 evades (with shorter reset times) instead of crouch slide
#-mouse_x2 :: -shift|200|(ar('shift')), +c|75|(ap('-c')), c |50, #c |50, +ctrl|(1000-last('-mx2')), -reset
# : -shift|(ar('shift')), +ctrl|75|(ap('-ctrl')), ctrl|50, #ctrl|50, +c|450, -reset
# : -shift|(ar('shift')), +ctrl|75|(ap('-ctrl')), ctrl|50, #ctrl|50, +c|450, -reset
# : -shift|(ar('shift')), +ctrl|75|(ap('-ctrl')), ctrl|50, #ctrl|50, +c|450, -reset
### Pls report or comment in discussion of the release on what is not working or what you would have expected to work differently
-trigger_groups can now be distinguished also via constraints - not only by the key_events in the trigger_group
-
-mouse_x2|(dc('mx2')<1000) and -mouse_x2|(dc('mx2')>1000) are now recognized as 2 different trigger for rebind or macros and the second will no longer overwrite the first one
-
reset can now also be used in a trigger_group to reset the macro sequence on trigger activation
- combined with constraints it can now work to flexibly reset a macro sequence
- e.g.
-c, +reset|(dc('c')>1000):: ...
(dc = double click to get the time since last press, when using it with the same key; last() should be used when using it with another key) - use always
+reset
because it is handled like a key event and must be fulfilled (in this case must be released which is for all reset keys always True) before the constraints will be checked - only if the constraints all result in True will the reset activated
- reset key_events that reset macro sequences now also work in rebinds as replacement key
-
the constraint check of a played group (rebind or macro) (not trigger group) will be all checked at the same time now.
- before it was always checked at the exact time of playback and could be way later than the original start of the macro due to before applied delays - this lead to some very strange behavior when using time evaluations because they could be updated while the macro was still running
- now it has consistent behavior
-
removed toggle option from played macro groups
- (maybe unnecessary????)
- I want to rework that because the key states tracking now allows a better solution for this
- stop_repeat will now again evaluate to False to suppress the playback of the stopped keys
-
all key states (press or release) are now tracked - real keys states as well as simulated key states
- can now be used in invocations as
ap('key_string')
(all keys press) andar('key_string')
(all keys release) - with this now also the simulated key states can be used to create more complex macros/rebinds
- can now be used in invocations as
-
simulated key events that would release real key presses are now suppressed with the exception of the keys defined in the tap groups to allow the snap tap behavior.
- status indicator now has the option on doubleClick or middleClick to open the config file like in the contextmenu - just to get to it easier
- crosshair now will redraw itself if left clicked on it (hard to hit :-D )
- crosshair now waits 1 extra second after switching focus groups due to window changes to make it more likely to recognize the right window and its size better
- all currently pressed simulated keys will be released on window change
- dependent on rebinds or macros it was possible to get stuck keys until the real key was pressed again to release the key state
- will ignore currently pressed real keys and not release these
-
esc
now also releases all not currently pressed simulated keys- even if manually paused
-
alt+tab
will now also try to release all currently pressed simulated keys
- renamed everything with delay as constraint to better fit the evolved functionality
- separated execute_key_event into its functional parts to realize more flexible reset and constraint handling
- refactoring of all global mutable states
- creation of manager classes to handle different aspects of the functionalities
- class FST_keyboard binds it all together and offers access to the managers
- the reset key_event did not work before (reset_0 to reset_30 and reset_all did work)
- reset will now reset the macro sequence it was started from/in
- fix focus lines comments not being stripped
- fixed and upgraded to also stripping leading or trailing white spaces
- reset of toggle via real key is working again
- not working when using no focus name
- toggle key is broken - fixed ... broken AGAIN ... - fixed
- stop_all_repeat() eval (useful on esc ingame to stop them all when in menu)
- eval to True
- aliases
- names and
- resets for sequences with names and ke|(name)
- eval to True
- eval of constraints will abort following constraints if one results in False
???: -should every invocation or reset as invocation result in True?
- can always be stopped from sending by following up with a False eval .. e.g. |(False)
- (start_repeat()), (toggle_repeat()) MUST eval to False, because a Repeat_thread takes constraints[1:] with it into the repeat ...
- so v|(start_repeat)|(False) would try to repeat v|(False) and never send anything - learning by trial xD
- and (stop_repeat()) eval to False - because is needs to be used with the same ke to be stopped and when you want to stop something you do not want to execute it first again ...
- lots of doc_string missing
- use aliases for repeat input: e.g. ke|toggle_repeat('<repeat_scan>')
- would be no longer dependent on actual ke and way more flexible and easy to use
- reset press state before releasing all keys to prevent suppression because of contradiction a real key state
QOL:
- helpful error handling when reloading from files - now shows the error message and the tap_group, rebind or macro the error happened in.
- crosshair and indicator no longer trigger focus change if clicked on it
- indicator now has context menu entries to open config file and reload file
- added some transparency to indicator to no longer be so prominent and position changed to upper right corner
Bugfix:
- fixed: 2 reloads needed to apply changes from file; now one reload or focus change is needed like before V1.0.0
Maintenance:
- cleaned up crosshair code
Known bugs/limitations:
- centering of crosshair is off sometimes (may be because it updated the crosshair position when the window was not fully open or recognized the wrong window)
- toggling it 2 times over the menu from the game is a workaround atm
- not working with FACEIT AntiCheat since the last update of FACEIT
New:
- <arg>-crosshair (to be used together with the <arg>-status_indicator)
- shows a simple crosshair as an overlay in the middle of the main screen
- can be used for for each <focus> group separately or will be always active if used before the first <focus> as a default start arg
- only works if the status indicator is active, because it is controlled by the same GUI loop
- status indicator now has in the context menu the option to toggle the indicator - but a change of the active window will reset the setting due to application of the start arguments of the default group or a focus group.
- <arg>-crosshair=x,y sets a delta to the window middle (same constraints as above argument apply)
- e.g. <arg>-crosshair=-20,-20 sets the middle of the crosshair 20 pixel left and above the center point of the window
- I use this for third person games where sometimes the middle target point for aiming is not in the middle point of the window
Bug fix:
- while holding a key that is a trigger of a rebind or macro, I could happen that on repeating the keys the original key was not intercepted
- for all key_events that are triggers of rebinds and macros the repeat on holding the key is deactivated. The key will only be send once.
New:
- listening now also for vertical and horizontal mouse scroll wheel input (vk_code 6 and 7); only listening, no sending of scroll events.
Bug fix:
- key event filter was active at start even without hitting enter to start. if you used -nomenu there was nothing different
- Option for a small graphical Indicator that simply shows if the program is active or not. It changes color to red if key listener is inactive and green if active.
- use <arg>-status_indicator=size in pixel in config before the first <focus>
- e.g. <arg>-status_indicator=20 # indicator circle with 20 pixel diameter
- control it via:
- left click to drag indicator to new position
- right click opens a context menu
- controls like on alt+* key combination: Toggle Pause, Return to Menu, Exit Program
- to separately close the overlay use: Close Indicator; the program will continue like normal without the indicator
- the indicator always stays on top, even in full screen apps
- atm it only works at the start, if you close it you have to restart FST to get it back
- it starts in the upper left corner of your main screen, so if you have your taskbar on the left side of the screen and clicked on the task bar after starting FST it can be obstructed by the task bar
-
When holding a key, now it will again send repeated keys like one would expect. Before the repeated keys on hold were intercepted to prevent multiple executions of a macro by holding the trigger key.
- Now every key hold should send repeated keys and only the first press or release will be able to trigger a macro
- Rebinds work for each key event on hold - so keys will be always replaced not only on first press or release
- Tap Groups only allow the repeating of keys if they are not contrary to the actual tap group state which decides which key should be send as idealized input
-
active window names should now be shortened to the actual program name
- so instead of "free_snap_tap.py - Untitled (Workspace) - Visual Studio Code" it should now only show "Visual Studio Code" and comparable
Bug fix:
- Toggle Pause control on ALT+DELETE that was unreliable in combination with the new <focus> groups
If you find any bugs or have ideas or request for features - just open an issue or discussion.
- all settings in one file (except start arg:
-file=...
to define from which file to load at start)- all start arguments supported via
<arg>*startargument*
- multi focus apps with own groups via
<focus>*name of focus app*
- all start arguments and groups before first
<focus>...
will be interpreted as default and applied to all focus app settings - every start argument and groups until the next <focus> will be added to the current focus name and applied AFTER the default start arguments and groups
- e.g. tap group
a, d
before first <focus> will be applied to all focus groups
- all start arguments and groups before first
- all start arguments supported via
- adapted cli output of groups to always show the currently active groups
- if a ke/key had more then one suffix, following suffixes of a ke or a trigger_group were not checked/executed as soon as one suffix evaluated to False (was a measure to prevent unnecessary checks) - fixed, now all will be checked
- starting times for keys was set to start time - now will be set 1000 seconds in the past, to guarantee first time execution of macros/rebinds with boolean time evaluations
- my cause problems in delay times if the key was not pressed before a time evaluation for a delay of this key
- reset_repeat() and repeat_stop() now evaluates to True
- file now supports multi line macro sequences, when new lines starts with
:
it will be added to the line above
- macro playback interruption and replaying by retriggering the same macro
- macro sequences and reset functionality
- macro notation now with
::
instead of:
- mouse buttons now also tracked,
- right_mouse, left_mouse, middle_mouse, mouse_x1, mouse_x2 now usable as constraints, and in suffixes
- repeating keys at set interval and management of the repeating function
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- toggle_repeat()
- stop_repeat()
- reset_repeat()
- function invocation (similar to evaluations but will always return False, but execute the function to manage the repetition of the suffixed key_event or Key)
- added evaluations:
- last(): returns time since last press or release
- dc(): "double click": on press returns time since last press, on release returns time since last release
- many other smaller improvements :-)
V0.9.4
-
NEW:
- formula evaluation now extended to rebind trigger
-
c|(p("0")) : ctrl
- only rebind c to ctrl if 0 is pressed- in combination with toggle function
0 : ^0
the 0 key can be toggled and the rebinds for a set of keys then change with just one key press or while just holding the key. (that is a functionality I always wanted to have in MMOs :-) - rebind everthing with a button press)
- in combination with toggle function
-
- 2 new evaluation functions to be usable
-
p("key")
- checks if the key is Pressed (current real key press) -
r("key")
- checks if the key is Released - literallynot p()
-
- multiple formula can now be added to any key and will be evaluated
-
+w|(not p("s"))|(tr("+w")>100)
- only trigger on +w if +s is not pressed and w was pressed for at least 100 ms
-
- False/True Evaluation now also usable in played keys of macro
-
+s|(not p("s"))|100|100
- only release s if s is not pressed (current real key press) and if played will delay for 100 ms (100ms max and 100 ms min)- delays can still be added as numbers but only the first 2 will be used for min and max random delay
-
-s|(r("w"))|(cs("+w"))
- only press s if w is released (current real key state) and then use custom delay defined by the function cs("+w")
-
- formula evaluation now extended to rebind trigger
-
Bugfixes:
- Macros triggered with every key event when trigger was fulfilled even if key event was not part of the trigger - bug introduced in V0.9.3 by fixing non evaluation of formula if there was only one key in trigger group
- If time of a key in a formula was not pressed before could lead to an undefined state - will now return 0/False if no valid value for time pressed or time released exist yet
-
QOL:
- removed '"unknown start argument: ", arg' outputs if start arguments were commented out in batch file. Now ':' or '#' will be seen as commenting out and the argument that is still received will not be printed out any more
- toggle modifier '^' was not shown in display of rebinds
- toggle state will now be overwritten by actual manual input of the same key - behavior is now no longer independent of real key press/release state as before
- toggle states will be reseted and toggled keys released if manual paused or focusapp paused
V0.9.3
- See: #### New with 9.3: dynamic evaluation of delays - programmable delays dependent on key press and release times
V0.9.2
- See: #### New with 9.2: toggle option (^ modifier) in rebinds and macros
V0.9.1
- Bugfix: Tracked released keys were not removed from states list and every key event could trigger macros that used key releases as triggers.
V0.9.0
-
NEW: Key combinations for Macros/Aliases
-
NEW: Key prohibition via
! notation
for trigger key combination of a macro- see example down below
-
NEW: simplified CLI Menu
- now with option to directly open the config file in your default txt editor
- (didn't want to further support that cumbersome edit option) :-)
-
NEW: One file now for all settings
- NEW: start argument
-file=*filename*
- start argument
-tapfile=
and -keyfile=
removed
- NEW: start argument
-
NEW: Changed formatting of rebinds and macros
- now uses
:
to differentiate between key groups- for Rebinds:
left_windows : ctrl
- for Macros:
+w, !left_control : +w|15|5, -s|100|100, +s|0|0
- for Rebinds:
- now uses
-
NEW: Controls are now default activated per
ALT+Control key
combination -
NEW: nearly completely rewritten :-)
-
probably some more things I have just forgotten to mention ^^
-
+d, !ctrl, !space: +d|15|5, -a|100|100, +a|0|0
: when d is released and control and space are not pressed then release d, wait 5-15ms, make counter strafe by pressing a for 100 ms and then releasing without further delay after- the fun part is now you could define
+d, -space, !ctrl: +d|15|5, -a|150|150, +a|0|0
with different counter strafe duration which will only be applied if you jump and release the movement key
- the fun part is now you could define
-
V0.8.5
- NEW: Tap Groups have always priority before Alias execution
- Alias will be played as normal but only key events that are not interfering with the actual state of the tap group will be send
- following example does now work without interfering with actual real input and the function of the tap group
+w, +w|5|2, -s|25|15, +s|0|0 #stop_forward
+s, +s|5|2, -w|25|15, +w|0|0 #stop_back
+a, +a|5|2, -d|25|15, +d|0|0 #stop_left
+d, +d|5|2, -a|25|15, +a|0|0 #stop_right
- Tap delay and Alias delay can now be adjusted separately via the 2 start arguments:
-
-tapdelay=8,2
and-aliasdelay=8,2
(min delay 2ms and max delay 8 ms) - replaces
-delay=
-
- To easier find the name name for
-focusapp
: if focusapp (with any name) is activated and the evaluation of key events is auto paused then the active windows name will be printed into the command line and updated with every change of the active window.
V0.8.4
- NEW: Auto Focus on a active Window specified by part of the name of the app/game/program
- script will only evaluate keyboard input when a window with this name is in focus
-
-focusapp=*part of the app name*
- e.g. for Counterstrike, only Count is enough to recognize it - control on Del now also pauses Auto focus, so evaluation can be activated outside of app or deactivated in app.
- auto focus will restart with restarting script from menu again
- when resumed the tap and key group files will be reloaded and so changes in them applied
- only active when this start argument is used
V0.8.3
- NEW: threading for Alias execution
- prevents original key to be send because of long delay before actual suppression takes place
- prevents interfering with real input
- not much else :-D
V0.8.2
- delays were applied one key later - should now work correctly
- removed my notes from py file :-)
- vk_codes.py now contains key codes
- vk_code print (menu option 7) is now much more verbose and helpful :-D
- when using controls:
- resume will now reload tap and key files
- (so tap out of game, change groups, save and resume in game will reload groups)
V0.8.1
- delay is now active as default
-
-nodelay
start argument can be used to disable delay and crossover
-
- min max delay per start argument settable
-delay=20,10
- comments now work in the group files
- use
#
to set a comment - line comment
#.....
- comment out some keys
..., h , #e, l, #l, o,... -> hlo
- comment after key sequence
a,d # sidestepping tap group
- use
- reverse now marked with
!
instead of#
(used now for commenting) - option to suppress key events via key group (with 2 keys only)
-
-n, suppress
-> n press will be suppressed, n release still be send
-
V0.8.0
Tested on new VAC policy and working so far without being kicked for input automation. Use delay of at least 5 ms, better a more to be on the save side and do not spam snap tap extremely often in 2 seconds or you will still be kicked. ;-)
-
NEW: updated random delay and crossover to tap_groups to simulate a more natural (or harder to detect) way to use snap tap
- works with the new policy of Valve Anti Cheat (VAC)
- start_argument
-delay=*time_in_ms*
will set the max delay to time_in_ms.- overwrites the default of max = 10 ms delay
- min delay value of 2 ms can be changed in py file if needed
- crossover will also use this as delay
- start_argument
-crossover=*probability*
will set the probability of a crossover (release will be send now and based on delay the new key press will be send later)- to have another way to simulate a form of imperfect snap tap to circumvent VAC
-
NEW: introduces Aliases aka Null binds that are specifically designed with customizable random delays for each key event
- to define in Key_Groups as groups with more than 2 keys.
- mouse output for mouse_left, mouse_right, mouse_middle works
- NEW: key event modifiers that changes how the key will be evaluated
-
-
in front a the key - as first key, following keys will only executed when key pressed, else only send key press (no key release send) -
+
in front a the key - as first key, following keys will only executed when key released, else only send key release (no key press send) -
-
in front a the key - as first key, following keys will only executed when key pressed, else only send key press (no key release) -
executed on key press and release!!
, else send a key press and release - NEW: delay per key (not for first key = trigger)
- random delay will default to 2 ms min and 10 ms max (in py file changeable) and uses the same delay as defined by start_argument
-delay=*time_in_ms*
-
+l, -left_shift|20|10, h|10,e|5,l|50,l,o, +left_shift
will print HELLO when l is released with varying delay for key events: left_shift, h, e and l-
*modifier**key*|*delay_in_ms*
marks the delay that will be set as max delay -
*modifier**key*|*delay1_in_ms*|*delay1_in_ms*
marks the delay that will be set as max and min delay (order is free - uses the bigger one as max and smaller as min)
-
- random delay will default to 2 ms min and 10 ms max (in py file changeable) and uses the same delay as defined by start_argument
See ### Example Use Cases for Aliases (to show what is possible right now) for how it might look like
-
updated reverse key replacement
-
#
in front a the key - does nothing to first key, as second key send a release when key pressed and a press when key released
-
-
activation of crossover now forces delay to be active (with default settings 2ms and 10 ms in py file)
V0.7.0
- fixed a bug due which the key replacement was never send
Some measures to lighten the precision of snap tap to maybe circumvent some Anti Cheat.
- NEW: random delay for snap tap
- Start argument
-delay=50
for max delay of 50 ms (can be set in a range of 1-500) - Without the start argument no delay will be used
- Start argument
- NEW: crossover of input for snap tap
- Start argument
-crossover=50
for a probability of 50% (can be set in a range of 0-100) - I call "crossover" the act of releasing one key before the press - but just simulated. In a way to simulate a too early release of one key before the press of the actual pressed key (immediate release of last key and delay of pressed key as result).
- Same random delay used as defined by -delay="number"
- Without the start argument no crossover will be used
- Start argument
V0.6.0
- NEW: Key Replacements will now be tracked in tap groups
- NEW: Menu option: 7. Print vk_codes to identify keys
- Will print out the corresponding vk_codes of a key event. Useful for finding your own vk_codes when used with different keyboard_layouts.
- Added requirements.txt - see #19
- Removed exe from repo and put it into releases: see #19
- Some edits in README.md
V0.5.1
- Fixed direct interpretation of number strings, e.g.
1
,2
, ... as a vk_code. Fixed by first looking up in dict if a string entry for that number exists and if not then cast it as an int an use it directly as a vk_code.
V0.50
- Fixed not working -txt= start argument; changed it to:
-
-tapfile=
replaces-txt=
-
- NEW: Starting argument for custom key replacement file
-keyfile=
- NEW: Control for returning to the menu on
PAGE_DOWN
key - NEW: Mouse Buttons (1: left, 2: right, 4: middle) can now be the output key of a key replacement pair
- NEW: key replacements can now reverse there output
- declared by just using a
-
before any or both keys in the key pair - (e.g.
k, -k
or-k, -k
would reverse the press of k to a release and vise versa)- originally intended for the right mouse button (looking around) in MMO's
- e.g.
k, 2
/k, mouse_right
to simulate a right mouse click with a keyboard keyk
- e.g.
k, -2
then reverses to output and lets me lock the right mouse button on release of keyk
- e.g.
- but can also be used for toggling auto movement on and off with another key (e.g.
left_windows, -w
)
- originally intended for the right mouse button (looking around) in MMO's
- declared by just using a
- removed implementation parts of the attempt to make it work on Linux
- most of the functionality was not working due to the Linux limitation of not being able to suppress events
V0.40
- NEW: Management of key replacements
- I had the functionality to suppress keys, so why not replace some.
- Managed in the same manner as the tap groupings
- Better or more complete error handling in the menu
- if someone still finds a way to crash the program via the menu, then congratulations :-D
- Linux user will not see the new key replacement options
- selective key suppression is simply not working on Linux
V0.37
- bug fix where program control were not working due to changed key up and down recognition introduced in V0.36
- first Linux test implementation
- feedback needed - might not work due to still using win32_event_filter, but now without suppression of key events for Linux
V0.36
- corrected a bug where the ALT key and (ALT GR) changes the msg values for up and down keys (really weird behavior)
V0.35
- fixed bug that disabled snap tapping in V0.34
V0.34
- added start argument
-nocontrols
to start it without the controlsDEL
andEND
enabled
V0.32
- added option to load and save tap groupings to custom files.
- add
-txt=
followed with filename (e.g. -txt=starcitizen.txt) to the bat file or the link to the execution file
- add
- small edits in py file
- some comments
V0.31:
- added small fixes
- no handling of a single key in multiple tap Groups any more - resulted in strange behavior
- added option to start without menu
- just ad -nomenu or use prepared bat file to start directly with defined Tap Groupings in tap_groups.txt
V0.3:
- Added CLI UI to manage tap groupings.
-
tap_groups.txt
is used to save actual tap groupings, can be edited by hand if needed.
V0.22:
- Renamed to Free Snap Tap.
V0.2:
- Now special keys like Ctrl, Space, Alt, Win, Numpad keys, F-keys usable in Tap Groups.
- Just use the string representation (found in py_file in vk_codes dict) or directly the vk-codes. Mixing of both in the same Tap Group is possible.
- Added an icon! :-D (icons created by Vector Squad - Flaticon)