VoiceAttack Change Log


  - Bug Fixes

    -  Fixed an anomaly dealing with speech engine resets that may cause devices to 
       mute unexpectedly.


  - Bug Fixes

    -  Fixed an issue where resetting the speech engine with excessive noise would cause
       a hang until the noise was silenced.
    -  Fixed the issue with no commands being displayed in the list if migrating from an
       earlier version of VA to the latest version and the list was sorted by actions.


  - Bug Fixes

    -  Fixed an issue where disabling the speech engine would close the application.
    -  Fixed the ability to enter text in the 'Default text-to-speech voice' option in
       the Profile Options screen.
    -  Fixed an issue where resetting the speech engine would fail to complete.


  - Design Changes
    -  VoiceAttack is now primarily a WPF application.  That is, the user interface has gone through
       an almost 100% porting process.  Theming is consistent throughout the application, including, 
       'Cover of Darkness (Dark Mode)'.  Overall editor speed should seem a little bit snappier with
       this port.  The ability to override VoiceAttack's language is available, but still in its
       development phase.  
    -  VoiceAttack now requires .Net Framework 4.8.
    -  Token '{TXTRANDOM:}' no longer trims extra spaces from selected items.
    -  Resize grip bars are no longer visible in the corners of resizable windows within
       Windows 11.
    -  Comment action now only trims blank spaces from the end (right).

    - 'VA_DisplayInfo' function from the plugin interface will now display as a tooltip for the item
      represented in the plugin manager.

    - Recording screen minimum pause has been changed to 0.001 from 0.000.
    - If Windows Media Player is not installed, the Audio Output Type of 'Windows Media
      Components' will not be available on the Options screen > Audio tab.
    - Warning now displayed if internal sounds are played while using 'Windows Media
      Components' as the audio output type.

    - 'Use Nested Tokens' has been removed as an option from the 'Options' screen.  Nested tokens
      will now always be rendered.
    -  Increased pause maximum time to 9999.999 seconds.
    -  Moved 'Dark Mode' toggle from the system menu of the main screen to the Options screen,
       General tab in an effort to make it more discoverable.

  - Improvements
    -  Added, proxy property VA.DarkModeEnabled which returns true if VoiceAttack's dark mode
       is turned on and false if it is not.
    -  Added state token '{STATE_VA_DARKMODE}' which renders '1' if VoiceAttack's dark mode is 
       turned on and '0' if it is not.
    -  Added, proxy property VA.LogReversed which returns true if VoiceAttack's log is displayed
       in reverse order (new entries at bottom) and false if it is not.
    -  Added state token '{STATE_VA_LOGREVERSED}' which renders '1' if VoiceAttack's log is displayed 
       in reverse order (new entries at bottom) and '0' if it is not.

    -  Updated plugin samples to use .Net Framework 4.8.

    -  Added, '-minimizetosystemtray' command line parameter.  When VoiceAttack is minimized, its icon will
       be displayed in the system tray (works just like the 'Minimize to System Tray' option on the Options

    -  Updated audio components.
    -  Added Profile Option 'Exclude global profiles'.  This option will prevent global profiles
       from loading when a profile has this option selected.
    -  Added 'Utilities' button to the Profile Options > Advanced tab.  Three new utilities added:
       Clear all disabled keyboard, mouse and joystick shortcuts.

    -  Added, 'Do not render tokens in variable values' option to 'Set a Text Value' action.
    -  Added proxy function 'WriteToLogNoRender' which works exactly like proxy function 
       'WriteToLog', except that tokens will remain intact (not rendered) when output to the
    -  Added, 'Do not render tokens' option to 'Write to Log' action.
    -  Added command line parameters -logtostdout which will send log entries to STDOUT.
       You can pipe the output to a text file or to another app.  Note that the output is
       not consolidated or trimmed as sometimes displayed in the main screen's log.
    -  Added command line parameter -logtostdoutnotime which does the same as the one above,
       except omits the time portion of the log entry.
    -  Added proxy event 'LogEntryAdded' which is raised any time a new entry is written to the
       main screen log.
    -  Added 'Release All Keyboard Keys' feature to the Windows Misc Functions action.  This
       will attempt to release all keys that are detected as currently pressed down.
    -  Added 'Release All Mouse Buttons' feature to the Windows Misc Functions action.  This
       will attempt to release all mouse buttons that are detected as currently pressed down.
    -  Attempt to reset keyboard hotkeys on wake from Windows sleep/hibernate implemented.
    -  Attempt to follow latest default speech device when recording devices added/removed improved.
    -  Added, 'Execute a command each time a command phrase is recognized' to Profile Options.  To allow
       this to be bypassed by specific commands, the option 'Do not execute additional recognition
       command' has been added to the Command > Advanced screen.
    -  Added option 'Execute even if rejected for low confidence' to 'Execute a command each time
       a command phrase is recognized' to allow the selected command to execute even if the spoken
       command did not meet the set minimum confidence level.
    -  Added token '{CMDEXECREJECTED}' that can be inspected within an 'Execute a command each time a
       command phrase is recognized'-executed command.  The token will render "1" if the executed command
       was the result of the spoken command phrase being below the minimum set confidence level.  A value
       of "0" will be rendered if the spoken command phrase has met the minimum set confidence level.

    -  Added proxy utility function 'GetLanguageValue' that allows access to VoiceAttack's verbiage
    -  'WriteToLog()' proxy function now parses tokens.
    -  The 'Write a Value to the Event Log' action and the 'WriteToLog()' proxy function both allow
       for end of line characters '\r\n' in addition to the {NEWLINE} token when indicating line breaks
       in the log.

  - Bug Fixes

    -  Imported and duplicated profile information (author tags and ids) are now included in
       profile history.
    -  Fixed various proxy event handlers that would crash VA if an exception was thrown in user
       code (plugins/inline functions).
    -  Fixed issue where editing keypress modifier keys would get out of sync on edit.
    -  Bolstered plugin areas to try to deter some crashes.

    -  Fixed an issue with 'Execute a command each time a command phrase is recognized' 
       blocking the executed command if 'Allow other commands to execute while this one is running'
       was unchecked.
       if no input actions included in the command.
    -  Fixed issue with modifier keys (ctrl, alt, shift) not working when device condition 'Only Key Pressed'
       was used.
    -  Fixed issue with '-PassedText' command line parameter if used when VA set to run as
       an administrator and multiple literal values are passed in.
    -  Fixed issue with copying log messages sometimes resulting in an error.
    -  Fixed issue with default/demo profile not saving if changes were made and a new profile
       was created.
    -  Attempt to fix Quick Input missing characters when targeting VoiceAttack itself.

    -  Fixed issue where selecting multiple command actions would prevent certain right-click
       menu items from enabling.
    -  Fixed issue with setting 'on recognized' and 'on unrecognized' profile options would not
       be available until the profile was reloaded.
    -  Fixed issue with 'Write Text to a File' action not importing newline characters 
       properly if imported as binary.
    -  Fixed issue with 'Switch to another profile' by reference resetting profile if the profile
       being changed to happened to be the active profile.
    -  Fixed issue with saving variables with profile on profile switch.


  - Bug Fixes
    - Fixed an issue with long-running profile unload commands breaking if stopped.
    - Bolstered joystick device query to try to stem NTDLL.dll crashes when devices are
      not plugged in for an extended period.


  -  Design Changes

     -  Recent changes to Windows 10 (version 2004+) have affected the way applications
        handle timing in certain ways.  As a result, VoiceAttack's timings have been
        affected (adversely).  VoiceAttack will now adjust its timing automatically
        if it is run in Windows 10 version 2004+.  This *will* dramatically increase the
        execution speed of your commands for those that are affected.  In order to 
        keep the peace, the option, 'Auto-adjust cpu utilization during command execution'
        was added to Options>System/Advanced for those that need a little more time to make
        adjustments to their commands (if needed).  

     -  Profile edit screen's filter buttons will now only persist while the profile is
        active.  If the profile is changed or if VA is shut down, the filter buttons
        will have their state reset.

     -  Variable change events are no longer removed when a profile is changed.
     -  Subcommands that are not able to locate their target window/application will now
        stop the entire command tree.  This is indicated as a design change (and not
        just a bug fix) as not only would it not stop when target found, but would
        also continue running.  This may affect existing profiles.

     -  Installer will now attempt to install to the last location where VoiceAttack
        was installed, regardless if going between 32 and 64-bit installers.

  -  Improvements
     -  A 64-bit version of VoiceAttack is now available as a full release.
     -  Added token '{STATE_VA_IS64BIT}' which returns '1' if the VoiceAttack process
        is 64-bit, and '0' if it is not.

     -  Added proxy function State.Is64Bit() which returns true if the VoiceAttack
        process is 64-bit, and false if it is not.
     -  Naming of pasted commands in the, 'Edit Profile' screen has been updated to
        be more sequential. 

     -  Refactored/reorganized most code.  Probably not something anybody will notice -
        just want it to be indicated here.
     -  Generating a settings summary now has the option to either write to file or
        be copied directly to clipboard.

     -  Added, 'Set Always on Top' and 'Unset Always on Top' to the 'Perform a Windows
        Function' display selections.  These attempt to set/unset the target window's
        'always on top' state.
     -  Added, 'Change Opacity' option to 'Perform a Windows Function' action.  This
        will allow you to attempt to change the opacity of a target window to a
        set percentage.
     -  For loop with indexer now shows indexer name in action list.
     -  Plugin context now displayed in action list.
     -  Added proxy Utility functions MinimizeUI() and RestoreUI() for hiding/showing
        VA from inline functions or plugins.
     -  'Listen once then stop listening' hotkey, 'listening' sound has been restored
        for joystick and mouse control.
     -  Added command line parameter -bypassimpropershutdowncheck which will make 
        VoiceAttack not display the, 'Improper Shutdown' screen on launch.  This is
        to help with debugging plugins in cases where VA gets shut down improperly.

  -  Bug Fixes
     -  Fixed issue with 'Listen Once' where listening icon would get out of sync.
     -  Fixed issue with keyboard hotkeys not saving in certain situations.
     -  Fixed issue where rapidly clicking the, 'Apply' button on the Profile Edit screen
        could cause a crash.
     -  Fixed various minor UI glitches on mouse move screen.
     -  Fixed issue with Record screen hotkey selection screens allowing keys to be passed
        through to the recorder.
     -  Fixed issue where saving and recalling the mouse location in concurrently-executing
        commands could cause a crash.
     -  Fixed issue with Captured Audio file browser crash if path did not exist.
     -  Fixed issue where plugin selection on Plugin screen would allow free text to be entered
        (which would subsequently cause a crash).
     -  Fixed Set a Decimal Value random caption formatting issue with whole numbers ending with
        zero not displaying properly.

     -  Fixed issue with, 'Wait for spoken response' where items with additional
        spaces would not be recognized.
     -  Fixed issue with 'Set integer value' screen not disabling proper controls if
        'Clear value' was selected on edit.
     -  Fixed issue with composite (prefix/suffix) commands not being allowed to be added
        even if they were in different composite groups.
     -  Variable change events are no longer called twice when values are saved
        to the profile.
     -  Fixed issue where spamming a search character when opening the profile edit screen
        would cause a crash.
     -  Fixed issue with .vax import where an improper shutdown message may be presented
        when VoiceAttack restarts.

     -  Fixed issue where indicating a command trigger would allow a blank command
        'when I say' value.
     -  Included missing joystick 3 and 4 POV tokens.
     -  Fixed issue with restricted continuous recognition failing to execute command
        immediately following a spoken 'start listening' action.
     -  Fixed {WINDOWMINIMIZED} and {WINDOWMAXIMIZED} tokens not working against 64-bit
        processes (64-bit version only).
     -  Main screen now restores properly if minimized to system tray and a second
        instance of VA is launched.
     -  Fixed issue with passed values getting added multiple times, causing a crash.
     -  Stopping all commands now indicates any queues that are stopped.
     -  Fixed issue with {CMD_WILDCARDKEY} token not showing wildcard expression if the 
        expression was the full command.


  -  Design Changes
     -  Command queue stop actions on a non-started queue will now clear the queue.  
     -  Tokens in TTS ('Say Something With Text-to-Speech') will now be rendered before any dynamic
        TTS.  Previously this was the other way around.

     -  New installations of VoiceAttack will now have, 'Check for updates' selected by default.     
     -  Fixed issue with functions that involve window dimensions including dimensions of window shadows.
        Mouse move actions and mouse position tokens (and possibly other areas) will be affected by this
     -  Passed command values that are indicated as blank will now have their corresponding
        variable set to 'Not set' instead of just omitting the value.  For example, passing 
        "1;2;;3" to a command's, 'passed integers' will result in the following variable
        ~passedInteger1 = 1
        ~passedInteger2 = 2
        ~passedInteger3 = Not set
        ~passedInteger4 = 3

     -  Disabling profile initialization commands from the, 'Load Options' screen now also 
        prevents profile unload commands from being invoked.      

     -  Audio cleanup was made a little bit less eager in order to keep sounds from disrupting
        each other.  Added a command line argument of -eageraudiocleanup to revert back to the
        original method.

  -  Improvements
     -  Added a settings summary to Options > General > System Info.  This summary can be saved
        and referenced so you can view/share most of your settings in one list.
     -  'Send command to this target' can now accept tokens at the command and profile levels.

     -  Increased number of spoken responses for the, 'Wait for Spoken Response' action from 250 to 500.

     -  Added TextVariableChanged, IntegerVariableChanged, DecimalVariableChanged, BooleanVariableChanged and
        DateVariableChanged to the proxy.  This will allow variables with a suffix of '#' to raise change 
        events if their values change.
     -  Added, 'CommandExecuting' and 'CommandExecuted' events to the proxy object for use within inline
        functions so that your inline function can be notified when a command is about to execute and
        when a command has completed executing.  Note that the 'Enable proxy command events' option
        (Advanced/Experimental Command Options screen) must be selected for each command that is to fire
        either of these events.
     -  Added token, '{CMDEXISTS:name}' that renders '1' if a command (spoken phrase) exists. '0' if not.

     -  Added command line parameter '-loadoptions' which will launch VA with the load options
        screen (the same as holding down CTRL + Shift at startup).
     -  Key press and Recorder screens will now allow for key presses emitted from VA itself.
     -  Command-passed date and decimal values can now contain literal values, as long as the literal values
        are expressed using the invariant culture.
     -  Added option, 'Evaluate passed values when command is queued' to the Enqueue Command action.
        This option will allow the enqueued command's passed values to be evaluated when the command
        is queued (rather than when the command is executed).
     -  Added the ability to pass values to commands from the command line using -passedText, -passedInteger,
        -passedDecimal, -passedBoolean, -passedDate.
     -  Added item, 'Reset Keyboard Shortcuts' to the Windows Misc Functions actions.  This will attempt
        to reset VoiceAttack's keyboard shortcuts/hotkeys if something has caused VoiceAttack's keyboard hook
        to be overridden.

  -  Bug Fixes
     -  Fixed issue with command queue actions not rendering tokens.
     -  Fixed issue with command line parameters not being picked up when running VoiceAttack's
        registration screen.
     -  Fixed help document not showing up when F1 pressed on various screens.

     -  Fixed various threading issues with 'Get Input' actions.
     -  Fixed excessive overhead between down/up key sequence for quick input when delay is zero.
     -  Fixed issue with TTS mass update button not becoming available if volume or rate changed.
     -  Fixed issue with joystick options screen loaded from command screen's joystick setup
        not assigning a stick if no sticks were already assigned.
     -  Fixed issue with joystick options screen loaded from command screen's joystick setup
        crashing if all sticks were unassigned.
     -  Fixed issue with -passedText command line parameter losing quotes if the, 'Run
        VoiceAttack as an administrator' setting turned on.
     -  Fixed issue where '-listeningoff' and '-listeningon' command line parameters were being
        overridden by hotkey state on startup.
     -  Importing a profile now verifies that commands indicated on the, 'Profile Exec' tab
        actually exist within the exported profile.
     -  Fixed listening icon not updating if, 'Reject Pending Speech' was turned on and speech
        was occurring.
     -  Fixed issue with passed values in 'Execute another Command' screen and 'Enqueue command'
        screen were not cleared out on edit.
     -  Fixed issue with {TXTREPLACEVAR} token where if the, 'from' parameter was blank the 
        token replacement will freeze the command.
     -  Fixed an issue with joystick button screens not working until refreshed if more than two buttons
        were already down when the screen loads.
     -  Fixed issue with command actions dragging if mouse dragged from scrollbar.
     -  Fixed issue with system beep when hitting Alt + E from main screen.

     -  Fixed issue where semicolons in passed text values were not being processed properly if
        contained in a literal value.
     -  Fixed issue where InternalID (for both command and profile) was being copied on duplication.
     -  Fixed issue where dragging out of the condition builder list would cause an exception.

     -  Fixed issue where hitting Alt + K to open the key press screen would cause the Alt key
        to be held down.
     -  Fixed threading issue when using command-shared variables.
     -  Resolved a threading issue while using passed values for executing/queued commands. 
     -  Fixed an issue where using wildcards at the start of a phrase containing dynamic command segments
        would result in unrecognized phrases.
     -  Resolved issue with command hotkeys (keyboard, mouse, joystick) double-firing if 'release only'
        selected in conjunction with other options (long press, double tap).
     -  Fixed issue with joystick hotkey screen not picking up button presses when the options screen is
        opened and joystick is newly assigned.
     -  'Prevent Speech Engine From Changing Microphone Volume' feature crashes VA with some versions of
        Windows.  Some checks are done to help prevent this (hopefully).
     -  'Listen once then stop listening' hotkey, 'listening' sound has been restored.


  -  Design Changes
     -  The following tokens were returning 'Not Set' in error when the underlying function yielded a null value.
        In order to make these tokens more consistent with the rest of the system, they have been updated to return,
        'Not set': {TXTSUBSTR:}, {CMDSEGMENT:}

     -  The following tokens were returning blank '' in error when the underlying function yielded a null value.
        In order to make these tokens more consistent with the rest of the system, they have been updated to return,
        'Not set':  {TXTURL:}, {TXTNUM:}, {TXTALPHA:}, {TXTWORDTONUM:}, {TXTTITLE}

     -  The following tokens were returning blank '' in error when the variable passed was not set.  In order to make
        these tokens more consistent with the rest of the system, they have been updated to return, '0':

     -  Plugin and inline function execution in the unregistered version is restricted if the command that is
        executing is a multipart/dynamic/composite command or a subcommand.

  -  Improvements

     -  Added, 'Passed Values' feature to, 'Execute Another Command' and 'Enqueue Command' actions.  This allows
        for you to specify (via semicolon-delimited lists) sets of values to pass to commands.  The values that
        are passed to the commands are converted to a standard set of command-scoped variables that are accessible
        only to the executed command.  Think of this as being able to have parameters for commands o_O

     -  Added ability for passed values to indicate variable names fully or partially with tokens.
     -  Added passed value functionality to proxy command function Execute().
     -  Command actions can now be reordered by dragging.
     -  Added the ability to edit multiple commands at once, via the 'Command Multi-Edit' screen.

     -  Added the ability to delete multiple commands at once.       
     -  Added, 'Do not add command to queue if already enqueued' option to the 'Enqueue Command' action.  This
        will prevent a command from being added to a named queue if the command already exists in the queue.

     -  'Say Something with Text-To-Speech' action screen is now sizable.
     -  Export as HTML now allows you to filter out commands where, 'When I Say' is disabled.

     -  Snap to edge is back (for those that remember it years ago) for all VoiceAttack screens.
     -  Added command line parameter -snapdistance to allow you to adjust (in pixels) how close to
        the screen edge a VoiceAttack screen can be before it snaps to the edge.  Set this value to 
        zero to turn off snapping.  The default value is 20, with a maximum value of 500.
     -  Stopping command processing will now attempt to release mouse buttons left in a pressed-down
     -  Added Proxy attribute, 'Dictation'.  Dictation has four functions:  Start(out String Message),
        Stop(), IsOn() and ClearBuffer(Boolean LastStatementOnly, out String Message).  These 
        work similarly to the corresponding dictation actions.
     -  Added task bar and system tray item, 'Relocate to Primary Display' which moves all open forms
        over to the primary display.  This is useful when a VoiceAttack screen is opened on a monitor that
        has been turned off or disconnected and Windows still thinks it should be there ;)  There is also
        a new command line parameter, '-relocate' which can be used to perform this action as well.

     -  Added, 'Advanced' button to the Command edit screen to hold advanced and experimental
        command options.
     -  Added advanced/experimental command option, 'Resource balance offset' which controls
        VoiceAttack's action throttling in places where it may be needed (turbo switch for your
        command - at a cost ;)). 
     -  Added advanced/experimental command option, 'Do not execute this command if it is already
        running'.  This keeps the current command from executing if another instance is already
        in progress.
     -  Added option, 'Do not execute this command if it is already running' to the, 'Execute Another
        Command' screen.  This will prevent a command from executing if it's currently running.
     -  VoiceAttackFault.txt will now provide last execution information for each enabled plugin
        (Windows Event Log and VoiceAttackFault.txt).
     -  Added token, '{CMDACTIVECOUNT:}' that renders the number of running instances of the indicated
     -  Added proxy Command function ActiveCount(String name) and ActiveCount(Guid InternalId) which 
        return an integer count of the number of running instances of the indicated command.

     -  Added token '{CMDALREADYEXECUTING}' - This provides a way to test if the current command is
        already executing in another instance.  The rendered value will be, '1' if the command is
        already executing, or '0' if not.
     -  Added proxy Command function AlreadyExecuting() which returns a Boolean true if the current
        command is already executing in another instance.  False if it is not.
     -  Command line parameters -darkon and -darkoff have been updated to change, 'dark mode' on both
        the launched and running instance of VA.

     -  Added Loop Continue action which will cause a looping section to skip on to its next iteration
        without breaking the loop.

     -  Added option, 'Consolidate Duplicate Entries' to the right-click menu of the main screen's log.
        This will allow VoiceAttack's log to consolidate repeated items into one line, instead of filling
        up the log with the same item, over and over again.

     -  Added token, '{STATE_AUDIOOUTPUTTYPE}' which renders the currently-selected audio output type as
        indicated on the Options > Audio tab.  The rendered values are "Legacy", "Windows", and "Integrated".

     -  Added proxy State function 'AudioOutputType()' which returns the same values as the
        {STATE_AUDIOOUTPUTTYPE} token above.

     -  Added group header right-click option, 'Select All Items In This Category', which selects all items in
        a group on the Profile edit screen.

     -  Added, 'Prefetch' to random sounds.  This will load either the selected list or an entire directory
        (use with caution for obvious reasons).

     -  Improved timing of {STATE_AUDIOCOUNT} token to be a little bit more forgiving when checking for counts
        immediately following the playback of a sound file when using Windows Media Components.

     -  Counts added to groups on Profile edit screen.

     -  Added option, 'Disable F1 Help' to the Options > General tab.  This disables VoiceAttack's 
        reaction to pressing F1 for help.

  -  Bug Fixes
     -  Various scaling issues addressed, including initial resizable form sizes when scaling changes.      

     -  Renamed proxy command Execute() parameters to allow for named parameters.
     -  Fixed issue with proxy ProfileChanged event locking up if certain commands were executed
        with, 'WaitForReturn' set to true.

     -  Stability improvements for several proxy functions. 

     -  Fixed threading issue with proxy function, 'CommandExists()'.

     -  Fixed issue with reading resource sounds from VB.Net-based libraries.
     -  Fixed issue with lockup while previewing TTS while using the {CMDSEGMENT:} token.


  -  Bug Fixes

     -  Fixed issue with category grouping introduced in a late-arriving bug fix.

     -  Fixed issue with {NEXTPROFILE_AT2} and {NEXTPROFILE_AT3} showing contents of {NEXTPROFILE_AT1}.


  -  Design Changes

     -  Commands that have a value of, 'not set' for, 'When I say' will now be ignored.  This
        generally occurs when a token is used and a variable that the token references is not set.

     -  Prefetched audio will no longer display an error log entry if tokens are used and the resulting
        path results contains, 'Not set'.

     -  {CMDWHENISAY} token was only returning the lower-cased passed value (name) when command
        was executed via the, 'Execute another command' action by name.  This now returns the
        full, 'when i say' value for the command.  This is kind of a bug fix, but it is listed
        up here in case you are depending on this value for whatever reason.

  -  Improvements

     -  Added keyboard, joystick and mouse button shortcut, 'double tap' mode which will allow the execution
        of a command when a keyboard, joystick or mouse button shortcut is pressed twice.  Note that there is
        also an advanced additional option with this feature that will allow you to execute the same
        command with a single press.
     -  Added token, '{CMDDOUBLETAPINVOKED}' that renders, '1' if a command is executed as a result
        of a double tap and '0' if it is not.

     -  Added Boolean function, 'IsDoubleTapInvoked' to the proxy's Command object.  This will return
        true if the executing command was executed as a result of a double tap.  False if it was not.

     -  Added keyboard, mouse and joystick shortcut, 'long press' mode which will allow the execution
        of a command when a shortcut is pressed for a longer period.  Note that there is also an advanced
        additional option with this feature that will allow you to execute the same command with
        a short/standard press.
     -  Added token, '{CMDLONGPRESSINVOKED}' that renders, '1' if a command is executed as a result
        of a long press and '0' if it is not.
     -  Added Boolean function, 'IsLongPressInvoked' to the proxy's Command object.  This will return
        true if the executing command was executed as a result of a long press.  False if it was not.

     -  Added, 'bleem', 'glomm', 'hiccup', 'leaveit', 'lookatme', 'revfast', 'revslow', and 'smack' as
        sound resources.

     -  Added option, 'Stop after all commands complete' to the start action on the, 'Queue Action' screen.
        This tells the started queue to stop automatically once all the items in the queue finish executing.

     -  Enqueued commands now receive command-scoped variable values.

     -  Added, 'Always execute' command option that will allow a command to execute even if other commands
        are blocking.

     -  Added time stamp to inline function output log.

     -  Added option button to joystick button shortcut screen, plus a little bit of extra verbiage
        to indicate when no joysticks are enabled/assigned.

     -  Added token, '{STATE_TTSCOUNT}' which renders the number of actively playing text to speech
        synths.  Renders, '-1' if any error occurs.

     -  Added '{STATE_SPEECHCULTURE}' that returns the culture name for the speech engine
        (for instance, 'en-US' or 'de-DE').

     -  Added token, '{LASTSPOKEN}' which renders the value captured from the speech engine, recognized
	      as a command or not.

     -  Added token '{PREVIOUSSPOKEN}' which renders the previous value captured from the speech engine,
        recognized as a command or not.

     -  Added token {TXTOCCURRENCES} that will render the number of times a text string appears in
        another text string.
     -  Added token {TXTREGEXREPLACE} that will allow you to replace text in one string with the text
        of another using regular expression matching.

     -  Added profile-level author flag  which will allow you to specify a nice message to the 
	end user when commands are prohibited from being imported (used with the  flag).

     -  Added profile-level author flag  which will allow you to specify a nice message to the
	end user when profiles are are prohibited from being duplicated (used with the  flag).

     -  Added command line option -noexport that indicates when a profile is exported as a binary .vap
        that the resulting profile cannot be exported as binary or XML when imported.

     -  Command line parameter -datadir now parses environment variables.
     -  Added command line option, '-restore' that will restore the VA window to a normal 
        window state if minimized, maximized or minimized to the system tray.

     -  Added, 'Right Ctrl', 'Right Alt', 'Right Shift', 'Right Win' as selections when clicking the key
        icons on the, 'Key Press' screen.

  -  Bug Fixes

     -  Fixed issue with {CMDSEGMENT} token rendering spurious values if the command was executed in any
        way other than by spoken phrase.  If {CMDSEGMENT} is used in a command executed by mouse, keyboard
        or joystick, 'Not set' will be rendered.

     -  Fixed issue with many volume sliders appearing in the Windows volume mixer if Windows Media 
        Components was selected as the audio type.

     -  Fixed issue with profile change action not being ignored if withing a command being called
        on profile unload.

     -  Fixed issue with repeated commands holding on to locally-scoped variables.

     -  Fixed issue where if a TTS voice was invalid, TTS would not stop if commands were stopped.

     -  Fixed issue with category rename not changing if only letter casing changed.

     -  Fixed issue with 'ProfileChanged' event not firing if a command is called on profile unload.

     -  Fixed issue with, 'Get User Input' screens not getting focus when opened.

     -  Fixed issue with relative movement checkbox not saving properly on edit on the Mouse Move action

     -  Fixed issue with System.Threading.AbandonedMutexException being logged if two instances of VA
        were running and one of the instances was shutting down.

     -  Commands where, 'Ignore Command' actions exist did not include spoken phrase info for use in
        various tokens.  This has been fixed.

     -  Fixed issue with single-instance TTS not maintaining default TTS voice.

     -  Fixed issue with TTS UI not enabling certain controls if SSML error was encountered.

     -  Fixed issue with CLM author tag displaying blank when set.

     -  Fixed issue with prefetched audio failing to resume prefetching if an exception was raised.

     -  Fixed issue with browsing for file name with illegal characters in, 'Capture a Screenshot' action.

     -  Fixed issue where screen shot causing certain color values to be transparent.

     -  Fixed caption display issue with joystick buttons on command screen.
     -  Fixed Category Rename screen not trimming spaces.
     -  Several command line options were fixed to work when VoiceAttack is minimized to the
        system tray.
     -  Fixed issue with joystick hotkey profile override not including sticks 3 and 4 in configuration.
     -  Fixed issue with multipart dynamic composite command segments (say that five times) not fully
     -  Fixed issue when editing a command's command type was not updating the speech recognition engine.

     -  Fixed issue with internal sound resource file not being accessible if a startup path was used.
     -  Fixed low visual contrast on selected commands in profile list when command triggers were disabled.

     -  Fixed crash issue with, 'Execute command by name' screen.
     -  Fixed issue with log quiet mode not displaying log entry from, 'WriteToLog' proxy function
        even if option was set to do so.
     -  Fixed UI issue with highlight disappearing when adding specified pauses.
     -  Fixed issue with proxy method WriteToLog crashing VA in certain instances if null was passed in.
     -  Fixed issue with some resizable screens not displaying all controls when opened for the first

     -  Fixed issue with, 'Stop command if target window focus is lost' not working if the
        target app is not open.
     -  Fixed issue with, 'Resume command if focus is regained' not stopping the paused command if the 
        target process is terminated.

     -  Fixed right-click context menu not working right on export and import command screens.
     -  Fixed issue with multiple simultaneous sounds directed to multiple devices may cause
        the sounds to sometimes be played through the same device.

     -  Fixed issue with recorder actions not being picked up as changes.

     -  Recorder actions committed to the command screen now have an, 'undo'.

     -  Null values written to log no longer crash VA when tool tip is presented (now displays, 
        'Log entry is a null value').

     -  Fixed issue with actions modified warning not being the topmost form when, 'always on top'
        is selected.


  -  Bug Fixes

    -  Fixed an issue that caused some to not be able to have access to a working speech engine without
       running as an administrator.


  -  Improvements
    -  Added extra verbiage to speech engine error screen to suggest running VA as an admin
       (due to potential permission issues).  Not necessarily an improvement (but not a bug fix).

  -  Bug Fixes

    -  Fixed issue with minimize on startup and minimize to system tray not working together.

v1.8.1 - Steam version only

  -  Bug Fixes

    -  Fixed issue with export/import screens crashing application.


  -  Design Changes
    -  .Net Framework 4.7.2 is now required.  This is to aid in ongoing plugin / inline function development.
    -  Global targeting settings have been removed from the main screen.  You can still target applications by
       using the profile and command, 'Send commands to this target' options.  These options are located in the 
       Profile Options and Command screens, respectively.
    -  Complete UI overhaul using new controls to help with screen scaling.  The first round of updates is intended
       to reproduce the UI of the original controls as much as possible.
    -  'Compact Mode' button has been removed and replaced by, 'Compact Mode' menu option in the system menu (icon 
       in the top-left corner).       
    -  Default audio output type is now, 'Integrated Components' when VA is first installed (used to be
       Windows Media Components).

    -  Exporting a profile now defaults to exporting as a compressed binary.  This is labeled
       simply as, 'VoiceAttack Profile' in the profile export dropdown.  Exporting as XML has
       been renamed, 'VoiceAttack Profile Expanded as XML'.

    -  Creating a new profile will stop any running commands when the, 'Add Profile' screen is

  -  Improvements
    -  Added support for selecting from four joystick devices (up from 2).

    -  Added, 'Loop Start - Repeat Indefinitely (Infinite Loop)' that starts a looping block
       that loops continuously.
    -  Added text-to-speech effect sets.  Effect sets are a combination of sound effects that you can
       apply to tts voices for a custom sound.  You can manage effect sets in two ways:  from the Options
       screen and from the, 'Say something with TTS' screen.  Effect sets can be exported and imported
       and are saved in a new .dat file in VoiceAttack's .dat folder (named, VAEffects.dat).  Effects
       currently include echo, reverb, distortion, flanger, phaser, 'auto wah', chorus and pitch shift.

    -  Added access to VoiceAttack's internal sounds from the, 'Play a Sound' and 'Play a 
       Random Sound' screens.  The path to the internal sounds is, 'internal:', followed
       by the name of the sound.  For example, 'internal:Abinkle' will play the, 'Abinkle'
       sound.  For convenience, the file input box is now a drop-down list that will allow you
       to select the sounds.

    -  Added, 'Capture a Screenshot' action that allows you to capture the active window, primary screen,
       entire desktop or region to the clipboard, a file or to a folder (with automatically-named files).
    -  Updated Options > Audio > Feature On Sound, Feature Off Sound and Stop Commands Sound
       dropdowns to preview sounds when values are changed.
    -  Added some new sounds to VoiceAttack's internal sounds:  'cutsthru', 'hooweehoo', jarmouth',
       'later', 'pom', 'powerplus', 'quitter', 'sapsapsap', 'shieldhit', 'squeepatpat', 'tonk' and, 
       'why'.  'Stop' and, 'start' are added as selections (they used to only be available as default

    -  Added advanced ability to access sounds in your own resource files.

    -  Added, 'Active Window' as an option to, 'Set Audio Volume' action.

    -  First round of sound file caching has been added.  The maximum size of the cache (up to
       256 mb) can be set from the Options > Audio tab with the 'Audio Cache Size' option. Set
       to zero to disable audio caching.  Note that audio caching is only available when, 
       'Integrated Components' is selected as the audio output type.
    -  'Prefetch' option added to the, 'Play a sound' action.  This will allow a sound file to
       be loaded into memory when the profile is changed.  Prefetching audio is only available
       when 'Integrated Components' is selected as the audio output type.
    -  'Disable Audio Prefetch' option added to Options > System/Advanced tab.  This will allow
       an override of any profiles that have 'play a sound' actions that also have, 'prefetch'
    -  'Preserve Prefetched Audio on Profile Change' option added to Options > System/Advanced tab
       to allow the retention of prefetched audio between profile loads.  
    -  Added, '-prefetchstats' command line parameter that will display a brief summary of 
       prefetched items in the log on profile change.

    -  Added, 'Reset Active Profile' system menu item.  This works the same as the, 'Reset Active
       Profile' action, which means that this will invoke everything that normally occurs during
       a profile change (without actually changing the profile).
    -  Added proxy Profile function 'ProfileInternalIDs()' which returns an array of GUIDs of all
       profiles that have non-null internal ids.
       {STATE_JOYSTICK4ISGAMEPAD} tokens to indicate if the corresponding joystick has been designated
       as a gamepad controller in VA.  If the joystick is a gamepad controller, the rendered value will
       be "1".  If the joystick is not indicated as a gamepad controller, "0" will be rendered.
    -  Added proxy State.Joystick Boolean functions, 'Joystick1IsGamePad()','Joystick2IsGamePad()',
       'Joystick3IsGamePad()', 'Joystick4IsGamePad()' that correspond to the new tokens added above.
       the left and right triggers (gamepad controllers only).  The rendered value range is "0" 
       to "255".  If the stick is unavailable or not indicated as a a gamepad controller, the rendered
       value will be "-1".
    -  Added proxy State.Joystick integer functions, 'Joystick1LeftTrigger()',
       'Joystick2LeftTrigger()', 'Joystick3LeftTrigger()', 'Joystick4LeftTrigger()', 
       'Joystick1RightTrigger()', 'Joystick2RightTrigger()', 'Joystick3RightTrigger()',
       'Joystick4RightTrigger()' that return a value of 0 to 255 if the joystick is indicated as a
       gamepad controller, or -1 if the joystick is not indicated as a gamepad controller (or is
    -  Added proxy State.Joystick methods for joystick 3 and joystick 4.
    -  Added optional parameter, 'CompletedAction' to proxy.Command.Execute (both by command name
       and by internal id).  This parameter allows you to specify a callback function that is called
       when the executed command completes.  This is a test feature - which means it may or may not
       remain as an exposed feature.

    -  Command screen now has a warning box that is displayed if canceled with actions changed.
       joystick trigger values.  Note this is for devices listed as, 'Gamepad Controller (1-4)' only.

    -  Added, 'Toggle Listening', 'Toggle Hotkeys', 'Toggle Joysticks' and 'Toggle Mouse' actions.
       These toggle the various inputs - if they're on, they are turned off.  If they're off, they
       are turned on.
    -  Comment actions are now searched from the profile edit screen's filter box.

    -  'Set a Boolean Value' screen now includes a random ('coin flip') option.

  -  Bug Fixes

    -  Fixed issue with adding integer variables with names that had any uppercase characters.
    -  Improved some sound file handling when files are previewed and do not exist in the,
       'Play a Sound' and 'Play a Random Sound' action screens.
    -  Fixed issue where reading text into a variable from a stream that does not end would
       cause the command to not be able to be stopped.
    -  Fixed issue with {TXTLASXTPOS} not working right with an empty string and a variable
       that does not exist.
    -  Fixed issue with {RANDOM}, {CONDITIONFORMAT}, {INTFORMAT}, {SMALLFORMAT} always 
       returning a comma for the thousand separator regardless of locale.
    -  Fixed issue with sounds not stopping properly when stopped while using, 'Integrated 
    -  Fixed issue with keyboard hook disconnect after multiple, rapid, 'stop command' 

    -  Fixed mouse hook issue where loading may cause brief delay on startup.
    -  Fixed some issues with joystick z-axis tokens breaking when using a device designated as
       'Gamepad Controller (1-4)'.
    -  Fixed issue with TTS and blank entries resulting in an exception log entry or exception message box in 

  -  Design Changes
    -  Getting a target by window class name now requires the use of the prefix, '+'.  For example, if you
       are searching for a window that has a class name, 'foo', simply search for, '+foo'.

  -  Improvements

    -  Targeting for subcommands optimized.

    -  Added, SetOpacity(int value) method to the proxy object.  Works exactly like the -opacity command line


  -  Bug Fixes

    -  Fixed issue with users that have corrupt user.config files not working any more.
    -  Fixed issue with legacy plugins no longer working if the profile was changed or commands stopped.
    -  Fixed issue with proxy command Execute() method not executing commands referenced by internal id in
       linked profiles.

  -  Improvements

    -  Added proxy property, 'IsTrial' that returns true if VoiceAttack is in trial (non-registered) mode.


  -  Design Changes
    -  Replaced sliders for sound/tts offset on Options > Audio tab with numeric input boxes.

  -  Improvements
    -  Added character prefix helpers to targets.  If '^' is prepended to the, 'send commands to' target,
       the target search is limited to only window titles.  If '~' is prepended, only process names are
       searched.  If '+' is prepended, only class names are searched.  For example:  '^*notepad*' will
       only search all window titles that contain, 'notepad'.

    -  Added, 'End at Position' to, 'Play a sound' action. 	     
    -  Added workaround for wireless Xbox controllers.  Controllers identifying as gamepads will now show an additional
       option of 'Gamepad controller' in the selection list.  This also adds support for left and right triggers as
       buttons 11 and 12.
    -  Added joystick POV, 'button' support to conditions.       
    -  Speed improvement for importing profiles (more noticeable with profiles with a large number of commands).
    -  Updated main screen images to be a bit more scalable.
    -  Sounds folder and apps folder in Options > General are now browsable by clicking.
    -  Startup tip that advises to add more commands now a tiny bit smarter about displaying within
       default profile.

    -  Added, 'ProfileNames()' function to vaProxy that returns a string array of all profile names.
    -  Added action support for changing default communication recording and playback devices.

    -  Added -inputcomms, -inputcommsx, -outputcomms and -outputcommsx command line parameters that change
       Windows' default recording and playback communication devices.
    -  Added, 'Set Windows Default Communications Playback/Recording Device on Startup' option to 
       Options > Audio tab.
    -  Added tokens {STATE_DEFAULTPLAYBACKCOMMS} and {STATE_DEFAULTRECORDINGCOMMS} that render the names
       of the default communications playback and recording devices.
    -  Added proxy State string functions DefaultPlaybackComms() and DefaultRecordingComms() that return
       Windows' default communications playback and recording devices.
    -  Added token {TXTWORDTONUM} which replaces "zero" through "nine" with "0" through "9".  This is simply
       to help a bit with the way the speech engine interprets single-digit numbers.
    -  Added, 'Wait for X seconds between keys' option for Quick Input that allows a pause between key release
       and the next key press.
    -  Added command line parameter -priority which adjust the process priority of VoiceAttack.  The values can
       be, 'low', 'belownormal', 'normal', 'abovenormal', 'high', and 'realtime' (all without quotes).  Note that
       running with a value of, 'realtime' requires VA to be run as an administrator.  This only works against a
       newly-created instance of VA and does not work against a running instance.  Example:   -prority high
       runs VA with a high-priority process.
    -  Added token, '{CMD_WILDCARDKEY}' which returns the non-variable portion of a wildcard spoken phrase.
    -  Added proxy Command function, 'WildcardKey()' which returns the non-variable portion of a wildcard spoken phrase.
    -  Added proxy function, 'Close()' which closes VoiceAttack (same as clicking the close button on the main screen).

    -  Added a, 'stop commands' button to the profile screen that will stop commands/sounds (works just like the
       one on the main screen).
    -  VoiceAttackFault.txt is now written to C:\Users\YOUR_USER_NAME\AppData\Roaming\VoiceAttack if it cannot
       be written to the installation directory.
    -  Added, '{ACTIVEWINDOWPATH}' token that renders the executable path of the active window.
    -  Added 'ActiveWindowPath()' method to the proxy's Utility object.  This returns the executable path of the
       active window.
    -  Added, 'Execute(string CommandName, optional Boolean WaitForReturn, optional Boolean AsSubcommand) and
       Execute(Guid InternalID, optional Boolean WaitForReturn, optional Boolean AsSubcommand) methods to the
       proxy's Command object.  This overload adds the, 'AsSubcommand' option which allows the executed command
       to be executed as a subcommand to the calling command.  This allows the executed command to gain certain
       attributes, such as the command-shared variables as well as non-blocking when the calling command is
       executed synchronously.
    -  Log message regarding privileges not being elevated and running as admin on startup now has a right-click,
       'Stop showing this message' which hides the message.  This can be reset by running VA with the
       (new) -resetwarnings command line parameter.

    -  Startup tip that advises to add more commands can now be right-clicked and switched off (use -resetwarnings
       to turn this back on).
    -  Updated the System Info button on the Options > General tab to include shortcuts to MSInfo and DxDiag. 	     
    -  Increased the line height of profiles exported as html.
    -  Added information links to the bottom of the, 'Perform a Window Function' action screen that allow you
       to view information about the active window such as the window title, process name, location, size
       and underlying class name.  Clicking each of these will copy their values into their respective input boxes.
    -  Added option, 'Run VoiceAttack as an Administrator' to the Options > System/Advanced tab.  This will
       attempt to allow running as an administrator (without all that right-clicking).
    -  Added command line parameter, '-clearasadmin' to clear the, 'Run as an Administrator' setting (in case
       'Run as an Administrator causes some type of situation that cannot be broken).
    -  Added command line parameter, '-asadmin' to attempt to launch VoiceAttack as an administrator for
       the current session.
    -  Reduced the overall height of the Options screen to help with lower-resolution setups.

  -  Bug Fixes
    -  Fixed issue with {CMD_BEFORE} token sometimes truncating output.       
    -  Fixed issue with Utilities flyout menu items not working if speech engine is not enabled.
    -  Fixed issue with copying and pasting commands into a profile that has an  flag set.
    -  Fixed issue when deleting a command that is referenced within the profile's options page not also 
       removing the reference.
    -  Fixed issue where selecting the same profile from the dropdown list would still fire the profile
       unload command.
    -  Fixed mouse shortcut threading issue that would cause VA to momentarily hang under certain conditions.

    -  Attempt to not briefly display red, 'mute' icon when speech engine goes unavailable in certain configurations.    
    -  Fixed issue with KeyPress screen mass update dialogs sometimes causing VA to crash.
    -  Fixed an issue with pasting/duplicating condition builder items.

    -  Several action caption corrections.
    -  Fixed issue with restricting mouse movement not working unless other mouse actions are turned on.
    -  Restrict mouse movement/block mouse input is now cancelled if a, 'Stop all commands' action is executed.
       (Not implemented on a single command kill - the check would be too costly to see if other commands overlap).


 -  Improvements
   -  Added option, 'Allow command segment info for composite commands' to System/Advanced screen.  This option will
      allow the bypass of processing command segments for composite (prefix/suffix) commands.  This will prevent
      performance bottlenecks imposed on those that do not use command segments for composite commands.


 - Design changes
   -  Changed, 'Profile Options' button from icon to an actual button that says, 'Options' - this is to make
      the button more noticeable as the icon kind of escapes notice.

   -  Changed proxy GetCommand() to Command.Name().  GetCommand() is still available at the proxy level for backward
   -  Changed proxy CommandExists(String commandName) to Command.Exists(String commandName).  CommandExists(String commandName)
      is still available for backward-compatibility.
   -  Changed proxy CommandActive(String commandName) to Command.Active(String commandName).  CommandActive(String commandName)
      is still available for backward-compatibility.

   -  Changed proxy GetProfileName() to Profile.Name().  GetProfileName() is still available at the proxy level for backward
   -  Changed proxy ExecuteCommand(String commandName, Boolean waitForReturn = false) to 
      Command.Execute(String commandName, Boolean waitForReturn = false).  ExecuteCommand() is still available at the
      proxy level for backward compatibility.
   -  Moved proxy ParseTokens(string Value) to the proxy Utility class.  ParseTokens(string Value) is still 
      available at the proxy level for backward compatibility.

   -  Moved proxy GetAuthorID(), GetProductID(), GetAuthorTag1(), GetAuthorTag2(), GetAuthorTag3() to 
      Profile.AuthorID(), Profile.AuthorTag1(), Profile.AuthorTag2(), ProfileAuthorTag3(). 
      GetAuthorID(), GetProductID(), GetAuthorTag1(), GetAuthorTag2(), GetAuthorTag3() are all still
      available for backward-compatibility.
   -  Moved proxy ExtractPhrases(string Phrases) and ExtractPhrases(string Phrases, optional Boolean TrimSpaces, 
      optional Boolean Lowercase) to the proxy Utility class.  Both are still available for backward-

   -  Moved proxy CapturedAudio(int Type) to Utility.CapturedAudio(int Type).  CapturedAudio(int Type) is still
      available for backward-compatibility.   

 -  Improvements
   -  Added a somewhat experimental option, 'Recognition' on the command edit screen as a test to try to
      get a little bit more speed out of speech recognition.  The three options are:
      'Normal' - which processes the command the same way VA always has which is waiting until the speech
      engine fully completes a speech event before, 'recognizing' a spoken phrase.
      'Continuous Speech' - which attempts to find your spoken phrases within continuous speech (that is, 
      *while* the speech engine is still engaged in the speech processing).
      'Restricted continuous speech' - which works just like, 'continuous speech' (above), but restricts
      what is detected as a spoken phrase to the start of the speech event.  Hands down, this option is
      my new favorite thing could have justified a full release on its own ;)
   -  Rearranged command screen in order to accommodate those with a screen height of 768 pixels.

   -  Added -running command line parameter that writes 0 to stdout if no instances of VoiceAttack are
      currently running, and 1 if an instance of VoiceAttack is running.  
   -  Added, 'Evaluate 'Not Set' as false' to the Set a True/False (Boolean) Value screen's toggle option.
   -  Added command line parameters '-darkon' and '-darkoff' to turn on and off the dark mode setting on 
      the main screen ('Cover of Darkness').  Note these only affect the launched instance.
   -  Added experimental command line parameters '-noclasses' and '-noprocs' to exclude class names and
      process names when searching for applications, respectively.  This is to help speed up processing
      by eliminating items that are not used (that is, if a window is not found by window title, the check
      will conclude sooner rather than continuing to check for either processes or class names).
       These are considered experimental as they are included for various testing.  If testing is positive 
      for these items, they will become UI elements in a future release.
   -  Added, 'Reset Speech Recognition' menu item to the system menu on the main screen.  Selecting
      this will reset the speech engine (and not reset the entire profile).
   -  Added media keys to Quick Input / Variable Keypress / Variable Hotkeys - [VOLUMEMUTE], [VOLUMEDOWN], 
   -  Added  author flag element to the command-level flags.  This flag will allow the author to 
      indicate a friendly message for the command if the  flag is set to lock the command.  This
      overrides the  element at the profile level.
   -  Added  author flag element to the profile-level flags.  This flag will allow the author to 
      indicate a message for all commands that have their  element set at the command level.
   -  Added  author flag element to the profile-level flags.  This flag indicates that no new commands
      may be added to the profile.  This was implemented to prevent data loss for profiles that should be, 
      'included' rather than edited directly.
   -  Added  author flag element to the profile-level flags.  This flag can be used to indicate a 
      friendly message to the end user that explains why the new commands are not allowed.
   -  Added tip to log to add some commands if there are only a few commands in your profile and the
      spoken phrase is unrecognized.

   -  Added, 'Mute Speech Recognition Device' to system menu.  This mutes/unmutes the recording device that
      the speech engine is currently using.

   -  Added, 'Speech Engine Recording Device' as an option to, 'Recording Device' on the 'Set Audio Level'
      screen.  This is so you can just specify whatever the speech engine is currently using without
      having to know exactly what device it is.

   -  Added command line parameter, '-showcommandnames' that will make the VA log entries display the
      current command name when a command is executing (for debug purposes).
   -  Added tokens, '{STATE_JOYSTICK1ENABLED}' and, '{STATE_JOYSTICK2ENABLED}' which render as '1' or '0(())' 
      depending on whether or not the joystick is enabled.  These have actually always been in there, just
      did not get documented o_O.
   -  Added, '{STATE_JOYSTICKSHORTCUTS}' that renders "1" if joystick button shortcuts are on, "0" if not.
      Somehow this was missed long ago when these tokens were added.

   -  Added token, '{STATE_SPEECHDEVICEMUTE}' to test if the recording device that the speech engine is using
      is muted or not.  This renders '1' if muted, '0' if not.
   -  Added token '{STATE_SPEECHDEVICEVOL}' this returns the volume of the recording device that the speech
      engine is currently using rendered as a value from '0' to '100'.

   -  Added, 'InternalID' author flag to profiles.  This is a nullable Guid (GUid?) value that 
      can be supplied by authors to identify individual profiles.

   -  Added, 'InternalID' author flag to commands.  This is a nullable Guid (Guid?) value that can
      be supplied by authors to identify individual commands.

 -  Proxy Updates  
   -  Added proxy property, 'InstallDir' to the root proxy object.  This indicates the installation directory of VA.
   -  Added proxy properties, 'SoundsDir', 'AppsDir' and 'AssembliesDir' to the root proxy object.  These indicate VA's
      sounds directory, apps directory and assemblies directory.
   -  Added proxy property, 'IsRelease' to the root proxy object.  This is a boolean value to indicate whether or
      not the current version of VA is a released version.
   -  Added proxy property, 'PluginsEnabled' to the root proxy object.  This is a boolean value to indicate if
      plugins are enabled (from within an inline function, of course (lol)).
   -  Added proxy property, 'NestedTokensEnabled' to the root proxy object.  This is a boolean value to indicate if
      the nested tokens option is turned on or not.
   -  Added, 'Command' object to the plugin/inline function proxy that contains a set of methods that pertain
      to VoiceAttack commands.  There are new methods as well as a set of methods that were previously only
      available through token rendering.
   -  Added, 'Profile' object to the proxy that contains methods that pertain to VoiceAttack profiles.  There are 
      new methods as well as a set of methods that were previously only available through token rendering.
   -  Added, 'Queue' object to the proxy that contains methods that pertain to VoiceAttack command queues.
   -  Added, 'State' object to the proxy that contains methods that relate to various VoiceAttack/system
      states.  These are almost all direct ports of the state tokens that are currently available.
   -  Added a 'Joystick' object to the new, 'State' object that has direct ports of all the joystick state tokens
      into typed methods.
   -  Added, 'Utility' object to the proxy that contains some (hopefully) helpful functions.  There are new
      methods as well as a set of methods that were previously only available through token rendering.
   -  Added optional parameters, 'trimspaces' and 'lowercase' to the VAProxy, 'ExtractPhrases' function (both default 
      to false).  Passing in a true value for, 'trimspaces' will return all elements without leading or trailing 
      spaces.  Passing in a true value for, 'lowercase' will return all elements as lowercase.
   -  Added, 'CommandsStopped' event to the proxy object for use within inline functions so that your
      inline function can be notified when the, 'Stop All Commands' action has been executed (or the
      button on the main screen has been pressed).  

   -  Added, 'ProfileChanging' and 'ProfileChanged' events to the proxy object for use within inline
      functions so that your inline function can be notified when a profile is changing or has changed.
   -  Added, 'ApplicationFocusChanged' event to the proxy object for use within inline functions so that your
      inline function can be notified when a focused application has changed.  This takes advantage of the
      auto profile switching thread, so, auto profile switching must be turned on for this event to fire.
 -  Bug Fixes
   -  Command not able to be executed on paste has been corrected.

   -  Installer now removes legacy files that may cause conflicts for some users.

   -  Fixed issue with not preventing last profile from being deleted.

   -  Fixed command screen ui anomalies introduced in prior releases.

   -  'Copy To' feature from the Profile edit screen not respecting  flags has been fixed.
   -  Fixed issue where [LSHIFT] was excluded from variable hotkey processing.
   -  'Reset the Active Profile' action now works again when adding it.
   -  Registry settings for Last Run now updated when options updated.

   -  Pressing, 'F1' on the Recorder screen no longer shows the help doc if recording.
   -  Increased 'Get User Input' text size from 64 characters to 32767.
   -  Scroll bar for, 'Set a Text Value to the Windows Clipboard' is now turned on.
   -  Added some crash prevention when mouse scrolling through profile list.
   -  Fixed issue where importing commands from other profiles was not updating the speech engine.
   -  Fixed issue where {CMDSEGMENT} token not working with composite (prefix/suffix) commands.


 -  Design Changes

     -  Text-to-speech (TTS) simultaneous voices have been limited to three total when, 'Single TTS Instance'
        is not enabled.

     -  Duplicate, 'when I say' phrases are no longer allowed when there are duplicate, disabled commands.

     -  Moved, 'Disable Speech Recognition' from Options > System/Advanced to Options > Recognition.

 -  Improvements
     -  Added, 'Use variable hotkey' feature to keyboard shortcuts.  This will allow you to specify a 
        text variable to indicate the hotkey(s) to monitor for the selected command.  The notation to
        indicate the keys to use is the same that is used for Quick Input and variable keypresses. Note
        that any variable changes will require the use of the newly-added, 'Refresh variable hotkeys' action.
        Note that only global and profile-scoped variables will work with this feature.

     -  Added, 'Command Queues - Enqueue Command' and 'Command Queues - Queue Action' actions to the
        VoiceAttack Action menu.  These will allow creation and control over command execution queues.
        Command execution queues execute commands serially (that is, one after the next) as each is 
        completed.  Queues can be named so that you can have multiple queues for various purposes.
     -  Added, 'Refresh Variable Hotkeys' action to update VoiceAttack's hotkey monitoring after a
        text variable value has been changed.  
     -  Added balance (pan) feature to, 'Play a Random Sound' action.

     -  Added variable volume and balance to the, 'Play a Random Sound' action that will override the setting
        of each slider bar.

     -  Added variable volume and balance to the, 'Play a sound' action that will override the setting
        of each slider bar.
     -  Execute command by name will now include composite commands (prefix + suffix).
     -  Added, 'AuthorID' and 'ProductID' to profiles.  These are GUID values that can be modified within
        exported XML.  These values can be accessed by calling proxy methods, 'GetAuthorID()' and 
        'GetProductID()', respectively.     
     -  Added, 'Block potentially harmful profile actions' to Profiles Options > Advanced tab.
        When selected, this works to prevent the following from occurring:
          - Profile switch actions (action prevented)
          - Profile startup command execution  (command not executed)
          - Profile unload command execution  (command not executed)
          - Commands locked by author flag (command not executed)
          - Run an application actions (action prevented) 
          - Stop process actions (action prevented)
          - Inline function actions (action prevented)
          - Plugin execution actions (action prevented)
          - Unrecognized catch-all command execution (command not executed)
          - Dictation recognized command execution (command not executed)
     -  Added option, 'Upon import, profiles will have, 'Block potentially harmful profile actions'
        selected'.  This will flag each imported profile so that they may be inspected prior to use.
     -  Added, 'Advanced' tab to Profile Options screen.
     -  Added option, 'Prevent speech engine from changing microphone volume' to Options >System > Advanced 
        screen.  This will attempt to prevent the speech engine from changing the mic volume to compensate
        for a quiet or loud training environment.  This is a Windows-level adjustment and
        affects all running instances of the speech engine.  *Not a replacement for a properly trained 
        speech engine.

     -  Added the ability to use tokens in the Responses for the, 'Wait For Spoken Response' action.
        There is an experimental element to this, where the speech engine is initialized to accept the
        variable responses WITHOUT having to reset the profile (and subsequently the speech engine).
        Note that the limit for responses is still 250 items.
     -  Added mouse button down/up toggle option (Mouse > Click screen).
     -  Updated joystick component to .Net framework 4.5 and merged libraries into one dll (VAJS.dll).

     -  Added, 'ExtractPhrases' function to VAProxy for use in plugins and inline functions.  This accepts a 
        string containing single, multipart and dynamic phrases and will break it up into a string array of
        single phrases.  For example, 'hello;hi;howdy' will result in an array with three elements:  hello, 
        hi and howdy.  'good[morning;day;night;gravy]' will result in an array with four elements: good
        morning, good day, good night, good gravy.
    -  Added Pause shortcuts on the Command screen.  The last pause value entered is now a menu item
       that can be added without opening the pause screen.  Also, a flyout containing some common pause
       values is now available.  This pause set can be configured by adding a semicolon delimited string
       to the SpecificPauseValues element in the user.config file (e.g. 0.25;1.2;3.7;88).  Not sure if
       that's going to be officially documented or not.
     -  Added, 'CommandActive' function to VAProxy for use in plugins and inline functions.       

     -  Added token, '{CMDACTIVE:}' to test if a command is active or not.  If the command is active, '1'
        is rendered.  If the command is not active, '0' is rendered.

     -  Updated, '{CMDACTION}' token to also include, 'DictationRecognized' which will be rendered if
        the command was invoked due to a dictation phrase being recognized.
     -  Added token, '{STATE_CULTURE}' and '{STATE_UICULTURE}' to indicate the default user locale of
        the system and the default user interface language, respectively.
     -  Added tokens, '{EXPDECINV}' and '{DECINV}' to provide invariant culture support for decimal
     -  Added token, '{QUEUESTATUS:name}' to indicate the status of the indicated queue (Such as
        running, idle, paused, stopped, etc.).
     -  Added token, '{QUEUECMDCOUNT:name}' to indicate the number of commands added to the
        indicated queue.
     -  Added token, '{QUEUEACTIVECMD:name}' to indicate the name of the command running within
        the specified queue (if applicable).
     -  Added token, '{QUEUECOUNT}' to indicate the number of created queues.
     -  Added token, '{CMDLASTUSEREXEC}' that indicates the number of seconds since the last command 
        executed by spoken phrase, keyboard key press, mouse click or joystick button press.  That is, 
        it does not include subcommands, commands executed externally, right-click execute, etc.

 -  Bug Fixes
     -  Set Audio Level screen OK button not enabling when, 'Application' selected has been fixed.
     -  Fixed issues with text-to-speech being easily overloaded and not completing.
     -  Various range checking and messages regarding range checking updated for setting small int, int and
        decimal values.

     -  {AUDIOPOS} token not working correctly when sounds set to, 'wait until complete' has been fixed.       
     -  Fixed radio button grouping issue on mouse click screen when involving the scroll options.
     -  Fixed issue on mouse move screen not selecting default options when changing from mouse click to 
        mouse move.
     -  Fixed parsing error in {EXP} that was not using the invariant culture.
     -  'Wait for spoken response' and 'Restrict Mouse Movement' as favorite actions now working.


 -  Emergency Bug Fix

     -  Fixed issue with settings conflict keeping some users from changing options.


  -  Design Changes
     -  Added new, 'Profile Exec' tab to Profile Options/Overrides screen.  Moved the command exec options
       to this tab (page was getting way too tall).
     -  Removed 'Exit VoiceAttack' icon from task bar jump list.

  -  Improvements

     -  Added, 'Wait for Spoken Response' action to, 'Other Stuff'.  This is to help provide a simple 
        way to wait for a response from the user (without having to make several commands).  Just indicate
        the possible responses that the user may provide (dynamic, multipart), the text variable name to
        hold the response and a timeout.
     -  Added, 'Profile Unload Command' to Profile Options.  This is a command that can be specified to
        execute immediately before a profile is unloaded.  A profile is unloaded when another profile is
        selected, or, when VoiceAttack is shutting down.  You can distinguish between the two types of
        unloading by checking the value of the {CMDACTION} token (see below).  Note that the profile that
        is selected to be loaded will wait until the unload command completes, and any startup command
        will execute after the unload command.  Note that VA's shutdown will be delayed until the command
     -  Added, 'Convert a Variable Value' screen to, 'Other Stuff'.  This provides a slightly more direct
        (and somewhat faster) approach to converting values from one type to another (without having to use 
     -  Added individual playback and recording device selection in the, 'Set Audio Level' screen.
     -  TTS output channel is now selectable if you are using, 'integrated components' (also included
        in mass update).
     -  Added "\Shared\Assemblies" folder to VoiceAttack installation directory to serve as an additional
        assembly repository.  This becomes an alternate location to just putting assemblies in VA's root
        directory.  This will help mostly with inline functions that are not precompiled and with plugins/
        inline functions that access common assemblies.  Updated the documentation in regards to references
        (both inline functions and plugins).
     -  Added, 'Block Keyboard Input' feature to, 'Other Stuff > Windows'.  This will allow you to block,
        unblock and toggle block/unblock on various keyboard keys.

     -  Added, 'Block Mouse Input' feature to, 'Other Stuff > Windows'.  This will allow you to block,
        unblock and toggle block/unblock various mouse actions (click, scroll, move).  This kind of does
        double-duty to allow speed reduction of the mouse.
     -  Added, 'Stop command by name' option to, 'Stop another command' screen.
     -  Added, 'Captured Audio' screen to, 'Other Stuff' screens.  This is basically for fun as it gives a
        UI element to the plugin/inline function's CapturedAudio() function.  You can play back or save
        the audio captured by VoiceAttack's input.
     -  Moved/added often-used Windows speech utilities to Options > Recognition tab, 'Utilities' 
        button.  Might save a few clicks.

     -  'Run an application' parameter box now accepts environment variables.        
     -  Added 'Override Default Playback Device' to Options > Audio tab.  This will allow you to 
        specify a playback device to override the playback channel for all, 'Play a sound' 
        actions when, 'Default' is selected ('Default' is what is set as Windows' default device).
     -  Added 'Override Default Text-to-Speech Device' to Options > Audio tab.  This will allow you to 
        specify a playback device to override the playback channel for all, 'Say Something with TTS' 
        actions when, 'Default' is selected ('Default' is what is set as Windows' default device).

     -  Added basic plugin manager to options screen to allow enabling/disabling of individual plugins.
     -  Device conditions now include joystick X & Y positions and mouse X & Y positions (screen and app).

     -  Added, 'ClearLog()' method to VAProxy that simply clears the log on the main screen.

     -  Added, 'Get User Input - Text', 'Get User Input - Choice', 'Get User Input - Integer' and
        'Get User Input - Decimal' screens.  These will allow you to present the user with a very basic input
        screen and be able to capture that input in a variable.

     -  Main screen log can now select all with Ctrl + A and copy with Ctrl + C.
     -  Updated import warning messages to include inline functions and plugin access.
     -  Added, 'Disable speech recognition (this session only)' option to the load options screen.
     -  The option, 'Show window titles' on the, 'Load Options' screen changed to, 'Show window info'.
        The feature that this enables will now show both the window title and the process name in the log.
     -  Added, 'Extract Multipart and Dynamic Commands' option to HTML export.  This will expand multipart
        and dynamic commands on to separate lines.
     -  Last run info written to registry:  HKCU/Software/

     -  Added {STATE_AUDIOLASTFILE} token which renders the file name of the last-played audio file.
     -  Added token, '{SPACE}'.  Just renders a space o_O
     -  Added token, '{NEWLINE}'.  Just renders as a new line (\r\n).
     -  Added token, '{PROCESSEXISTS:}' that renders a '1' if the process name exists and '0' if it does not
        (wildcards accepted).
     -  Added token, '{PROCESSCOUNT:}' that renders the count of processes that match the name given (wildcards 
     -  Added token, '{NEXTPROFILE}' that can be used within a profile unload command to get the name
        of the profile that has been selected to load after the current profile is unloaded.  This token
        will render as empty if the profile is not unloading or if the profile is unloading due to VA
        shutting down.
     -  Added tokens, '{NEXTPROFILE_AT1}', '{NEXTPROFILE_AT2}', and '{NEXTPROFILE_AT3}' that can be used
        within a profile unload command to get the author tags of the profile that has been selected to
        load after the current profile is unloaded.  These tokens will render as empty if the profile is
        not unloading or if the profile is unloading due to VA shutting down.
     -  Updated, '{CMDACTION}' token to also include, 'ProfileUnloadChange' and 'ProfileUnloadClose'.
        The command will have these action types if the profile has an unload command specified.
        'ProfileUnloadChange' will be rendered if the profile is changing to another profile. 
        'ProfileUnloadClose' will be rendered if VoiceAttack is shutting down.
     -  Added tokens '{PROFILE_AT1}', '{PROFILE_AT2}', and '{PROFILE_AT3}' that render each of the three
        author tags within the current profile.

     -  Added tokens '{PROFILE_AT1:value}', '{PROFILE_AT2:value}', and '{PROFILE_AT3:value}' that render
        each of the three author tags for previously-loaded profiles specified by, 'value'.

     -  Added tokens '{PREVIOUSPROFILE_AT1}', '{PREVIOUSPROFILE_AT2}', and '{PREVIOUSPROFILE_AT3}' that render
        each of the three author tags within the last-loaded profile.     

     -  Added token, '{STATE_SYSDIR}' which renders the path of the system directory.
     -  Added token, '{STATE_WINDIR}' which renders the path of the windows directory.
     -  Added token, '{STATE_ENV:textValue}' token which will render the Windows environment variable for the
        value indicated in, 'textValue'.

     -  Added token, '{VA_ASSEMBLIES}' which renders the path of VoiceAttack's Shared\Assemblies

        render '1' if the current command's target is minimized, maximized or the foreground window. '0' if

        render '1' if the windows searched for is minimized, maximized or the foreground window. '0' if
        render '1' if the process searched for has a main window that is minimized, maximized or the 
        foreground window. '0' if not.
     -  Added tokens, '{GUID}' and '{GUIDCLEAN}'.  '{GUID}' renders a GUID (unique identifier), and 
        '{GUIDCLEAN}' renders a GUID without any dashes.
     -  Added tokens, '{DATETIMEFORMAT:textFormatVariable}' and '{DATETIMEFORMAT:dateVariable:textFormatVariable}'.  
        This returns a date/time as a user-formatted string, using standard format strings.
     -  Added tokens, '{TIMESTAMP}' and '{TIMESTAMP:dateVariable}'.  This returns either the current date/time
        or variable date/time formatted as a four-digit year, two-digit month, two-digit day, two-digit hour
        (24 hour), two-digit minute, two-digit second and three-digit millisecond: 20180101123020500.
        This could easily be done with {DATETIMEFORMAT}, but it's more of a matter of convenience (and not
        having to know that the format is yyyyMMddHHssmmfff o_O).        

     -  Added function CapturedAudio(int type) to the VoiceAttack proxy object for use in plugins and inline
        functions.  You can specify the type of audio, and what is returned is a memory stream (wave stream).
     -  Added, 'AuthorTag1', 'AuthorTag2', 'AuthorTag3' to profile-level author flags.  These are text values
        and can be accessed via VA proxy methods, 'GetAuthorTag1()', 'GetAuthorTag2()', 'GetAuthorTag3()' 
        (plugins and inline functions).
     -  'CommandExists' function of VAProxy expanded to return all referenced commands and not just the active 
        profile's commands.        


-  Bug Fixes

     -  Fixed issue with closing certain dialog boxes also closing Profile edit screen.
     -  Fixed issue with inline function references not rendering tokens on test compile.

     -  Fixed compile issue with assemblies located inside of, 'Shared\Assemblies'.
     -  Fixed issue with -command parameter not working when, 'minimize to system tray' is active.

     -  'Train speech engine' link on, 'Tips' screen has been fixed.
     -  Highlighted TTS remains highlighted after preview.
     -  Fixed issue where exporting profiles as HTML would not work if expanding an, 'execute another command'
        if the target was a multipart/dynamic command.
     -  Fixed issue where copying a command to another profile was not saved if the target profile was not 

     -  Fixed issue with repeat last command feature not updating the repeated command on edit.
     -  Fixed some issues with, 'dictation' that caused actual recognized commands to get mixed in with the dictation
     -  Fixed issue with 'Run an application' not working with combined environment variables and tokens (path and
        working directory).

     -  Fixed Condition Builder summary horizontal expanding issue.

     -  Minimize to system tray on startup no longer shows icon in task bar.
     -  Fixed issue with options screen resetting listening.
     -  Fixed command screen repeating radio button selection issue.


  -  Design Changes
     -  Options > General > Display Size is no longer applicable.  What VoiceAttack will now do
        is allow Windows to adjust the sizing based on scale.  If automatic sizing does not fit
        your needed requirements, v1.6.9 will still be available for use.  See the VA user forum
        for more info.

     -  Moving the form by dragging from open space on the form has been removed.

     -  The 'Snap to edge' feature when moving a window to the edge of a screen has been removed.     

     -  'Select a special action' list on, 'Other stuff' screen has been removed.

  -  Improvements
     -  Added device state checks to conditions.  You can now check to see if your keyboard keys/
        mouse button/joystick buttons are down or up.  You can also check if they are the only
        keys/buttons down as well as check if any keys/buttons are down (or none at all).  This
        will allow you to do stuff like say, 'Fire Weapons' and VA can react based on what keys are
        down.  Or, if you are using a hotkey to execute a command, you can control flow of your 
        command based on a mouse button or joystick button or keyboard key or all or none or whatever 
        lol.  For a while, this could be done with tokens, but now can be done right in the condition 
        screen (or condition builder).
     -  Added ability to export a VoiceAttack profile (.vap) as a compressed binary (it's still a .vap, just
        a binary .vap).
     -  Added some author flags for use within VoiceAttack.  See the help document section, 'VoiceAttack 
        Author Flags' for more info.
     -  Added, 'Global Profiles' option to the Options>General tab.  This works exactly like the profile
        includes option that is in the profile options screen.  This will allow you to pick a cascading
        set of profiles that will be included with when ANY profile loads.  The commands in these selected
        profiles will be overridden by commands in the profile options and then by the commands in the 
        active profile:
           - Active Profile
           - Referenced, included profiles from the Profile Options screen
           - Referenced, included profiles from the Global Profiles option on the Options screen

     -  The main screen is now sizable.
     -  Added, 'Repeat Command Phrases' to the Options>Recognition tab.  This will allow you to specify
        'repeat' phrases in a semicolon-delimited list.  So, instead of saying, 'increase front shields'
        over and over again, you can simply say, 'repeat' or 'repeat that'.

     -  Added an, 'Apply' button to the Profile screen.  Been needing that for some time o_O

     -  Load speed improvements for most, 'Other Stuff' screens.
     -  Yet another attempt to allow even larger sets of commands to be added to profiles.  In this go-round,
        dynamic commands are placed more efficiently into the speech engine for use.  This will hopefully 
        allow for a lot more dynamic commands, as well as a quicker load time.

     -  'Cover of Darkness' option is now in the main screen's menu.  This will allow you to toggle the 
        main screen's, 'dark mode', which was only available as a command-line parameter (the command line
        parameter has been removed).
     -  Added, '-exit' command line argument to tell VoiceAttack's running instance to exit.  

     -  Added, 'MainWindowHandle' property (get) to VAProxy for use with plugins and inline functions.
     -  Turned on basic code folding and rudimentary autocompletion (keywords and VA.*) and brace matching
        for inline functions.
     -  Added some very basic auto-indenting for inline functions.
     -  'Perform a Window Function' Window Title box now processes text variables and tokens.
     -  'Perform a Window Function' Window Title has been overloaded to also search for windows by process id
        if the value resolves to an integer.
     -  Automatic profile switching now allows for process name to be included.  Works exactly the same as 
        the window title stuff that's already in there (wildcards).  Search priority is window title, then 
        process name.

     -  Adding/updating command duplicate check is now a little quicker.

     -  Added, 'Min Unrecognized Confidence Level' option to the Options>Recognition tab.  Setting this 
        value allows you to filter the, 'Unrecognized' log items a bit.  The higher the value, the more
        likely your, 'unrecognized' log items will be filtered out.
     -  Added, Export/Import Settings facilities on Options>System/Advanced tab.  This will allow you to 
        backup your VoiceAttack settings and restore if needed.  Note that your registration details and
        profile data is not saved with this information.  Also, your profiles and registration data will 
        be unaffected by an import of settings.

     -  Added link to Options>System/Advanced tab to browse VoiceAttack's data folder.  Might save a 
        few steps explaining here and there ;)
     -  Added token, '{PREVIOUSSPOKENCMD}' as a quick way to retrieve the previously-spoken command phrase.
     -  Added token, '{SPOKENCMD:X}' as a way to access the history of spoken commands, starting at zero.  
        A value of zero ({SPOKENCMD:0}) is the same as getting the value of the {LASTSPOKENCMD} token.  A 
        value of 1 is the same as getting the value of {PREVIOUSSPOKENCMD} ({SPOKENCMD:1}).  A value of 2 
        would get the spoken phrase that was issued before the previous spoken command and so on.  If
        no history exists for the value, a blank (empty string) is rendered.  The maximum number of items
        in the history is 1000.
     -  Added token, '{PREVIOUSPROFILE}' as a quick way to retrieve the previously-loaded profile name.
     -  Added token, '{PROFILE:X}' as a way to access the history of loaded profiles, starting at zero.  
        A value of zero ({PROFILE:0}) is the same as getting the value of the {PROFILE} token.  A 
        value of 1 is the same as getting the value of {PREVIOUSPROFILE} ({PROFILE:1}).  A value of 2 
        would get the name of the profile loaded before the previous profile and so on.  If no history 
        exists for the value, a blank (empty string) is rendered.  The maximum number of items in the 
        history is 1000.
     -  Moved, 'Reset Screens' button over to the System/Advanced tab of the Options screen.
     -  Exposed, '-reverseprofilepriority' command line argument to allow for reversing, 'included' profile
        priority.  So, for example, your active profile's commands are lower priority than the included
        and the included are lower than the global.  

     -  Removed restriction on global, 'Stop All Commands' hotkey that required that the selected keys
        are the only keys down in order for, 'Stop All Commands' to fire.
     -  Added, 'Silence' as a choice in feature sounds (Options => Audio).  Now you don't have to turn 
        ALL the sounds off if you don't want just one of the sounds.
     -  Added, 'Reset the Active Profile' action to reload the current profile.  The profile will be reloaded, 
        which means that any profile-scoped variables (variables prefixed with ONE '>') will be cleared. Persistent
        profile variables (variables prefixed with '>>') will be retained.  All commands will be reloaded and
        any tokenized, 'when i say' phrases will be reevaluated.  The speech engine will also be reloaded
        (of course), and any executing commands will be stopped.  As you can see, this is whatever a, 'change 
        profile' action does, just without actually changing.

     -  Made startup a little more forgiving (well... less crashy) when selecting, 'Lightweight' 
        variants of the Speech Platform 11 engines.

  -  Bug Fixes
     -  Fixed issue where playing a random sound from a directory would sometimes crash the app.
     -  Fixed inline function indenting issue.
     -  Fixed issue where clicking, 'Ok' on Options screen would enable listening if listening was disabled.

     -  Fixed issue when accessing, 'not set' command-scoped variables when using subcommands. 
     -  Fixed issue where, 'Active Window' selection in, 'Perform a Windows Function' ceased to work.
     -  Fixed inline functions set as asynchronous not showing function exception messages.     


 - Improvements
     -  Added audio channel selection when playing random sounds.  Just like single audio file playback, you will 
        need to have, 'Integrated Components' selected as your audio output type in order for this feature to 
        be available.

  - Bug Fixes

    -  Fixed critical issue with Recorder screen causing an error on save.


 - Improvements
    -  Profile set load/save time performance increased.  This will be mostly noticeable on larger profiles and/or
       profile sets.
    -  Profile edit load time improved for larger profiles (lots of commands and/or lots of actions).      

    -  Added new action, 'Add a Loop Break' which will cause control flow within a loop to move to the End Loop action
       (breaking the loop).
    -  Added, 'Default' override text-to-speech voice at the profile level.  You can now specify a default voice for
       your profiles (instead of Microsoft David o_O).  This should work when you select, 'Default' as the voice as 
       well as if your token/variable name does not resolve to a valid voice name... that is, if the override also resolves
       to a valid voice name (otherwise, it's Microsoft David for you lol).
    -  Added, 'Enable Sleep Mode' option on Systems/Advanced tab of the Options screen.  When the Windows speech 
       engine is active, Windows is prevented from going to sleep on its own.  When this option is enabled, VoiceAttack 
       will attempt to put the speech engine to sleep ('Sleep Mode') if no audio is detected after the number of seconds 
       you specify.  When the speech engine is off, Windows will then be able to sleep if it is able.  To wake up the 
       speech engine out of, 'Sleep Mode' just move the mouse, click a mouse button or press a keyboard key.
    -  Added, 'Windows Speech Recording Device' option to options screen.  This will allow you to easily view and/or modify 
       the device that the speech engine is using (this is essentially a shortcut to the Windows setting so you don't have to dig
       for it).
    -  Added the ability to provide a custom, 'interrupt' sound in place of the default sound (for stop all commands).  Just
       provide a, 'sys_stop.wav' to the VA install directory and that sound will be used.  For more info, see the, 'For fun...
       maybe' section in the help doc.
    -  Also for fun (maybe)... Added three new options to the Audio tab of the Options screen:  'Stop Commands Sound', 'Feature On
       Sound' and, 'Feature Off Sound'.  This will let you set the three base sounds (stop commands, listening on/off, mouse on/off, 
       etc.) in VA to something maybe more similar to your setup other than the default sound ;)

    -  Mouse clicks are a little bit more context menu friendly when not using the, 'bypass mouse targeting' option.
    -  Export as HTML will now respect the column order from the Export screen.
    -  Export as HTML now limits the height of all the rows to a single line (except for rows where, 'Actions' is
    -  Holding down the Alt key while clicking the, 'Move Up' or, 'Move Down' buttons on the Command screen will move
       the selected actions to the top or to the bottom.
    -  Removed restriction for, 'listen once' and 'toggle' options of the global listening hotkey that required the 
       selected hotkeys to be the only keys down to operate.    
    -  Added a modifier to the, 'check for updates on startup' option which will allow you to check for new beta 
       versions along with the usual full-release versions.
    -  'Active window' now a selection in the dropdown list for the, 'Perform a Window Function' action.  This is so
       you don't have to use the '{ACTIVEWINDOWTITLE}' token to get the same result.

    -  Removed byte order marker (BOM) from beginning of text when, 'Write to text file' is used.  If this is somehow 
       needed out there by somebody, I'll make sure to put an option in to include it.  For now, it's gone.      
    -  Added token, 'STATE_VA_NESTEDTOKENSENABLED' to indicate whether or not the setting for using nested tokens
       is on or not.  "1" will be the rendered value if nested tokens are on, "0" if they are not.
    -  Added token, 'STATE_DIRECTORYHASFILES:textVariable' to indicate whether or not a directory contains any files.  
       "1" will be the rendered value if files exist, "0" if not.  Note that if the directory that is queried does not
       exist, "0" will be returned.

  - Bug Fixes

    -  Fixed issue with Plugin interface v4's session state not retaining values set during, 'Invoke'.
    -  Fixed issue with command-scoped variables not not maintaining 'not set' state when returning from
       a subcommand.
    -  A little less crashy when updating the task bar icon (especially when options are changed). 
    -  Fixed issue where, 'Stop Sounds' action would not stop sound if, 'wait until complete' was checked.
    -  Fixed issue where a disabled multi-part command would allow single elements of the multipart command to be added.
    -  Fixed issue where environment variables would not be rendered properly when previewing sounds.
    -  Fixed issue where columns were missing from html export sheet when columns were moved around.
    -  Fixed issue where hitting ctrl+z (undo) or ctrl+y (redo) on command screen when, 'when I say' is focused, the
       command actions would be modified.


  - Design change
    -  Instead of forcing to use legacy audio, the default output type will be, 'Integrated Components' if Windows
       Media components are not installed.
  - Improvements
    -  Steam security update.
    -  Added, 'Integrated Audio' support as an audio output option.  This will allow VoiceAttack to play a wide range of
       sound files and not require Windows Media Player (and its components) to be installed.  Two additional benefits
       of using 'Integrated Audio' are the ability to choose the output channel (speakers, headphones, monitor, etc.) and
       adjust the balance (left/right) of the audio.
    -  New tokens: '{STATE_ANYKEYDOWN}' renders "1" if any keyboard button is pressed, "0" if no keys are down. 
       '{STATE_ANYMOUSEDOWN}' renders "1" if any of the five standard mouse buttons are pressed and "0" if no mouse
       buttons are pressed.  '{STATE_JOYSTICK1ANYBUTTON}' renders "1" if any of the buttons on joystick 1 are down, "0"
       if no buttons are down.  '{STATE_JOYSTICK2ANYBUTTON}' renders "1" if any of the buttons on joystick 2 are down, "0"
       if no buttons are down.

  - Bug Fixes
    -  'Kill a process by name' feature now processes tokens as it says it should.

    -  Calculating integer values with capitalized variable names would cause the variables to not calculate.
       This has been fixed.
    -  Mass update of TTS actions not updating everything within the same command has been fixed.


  - Improvements
    -  Steam security update.
    -  Added option, 'Load Profile on Startup' to the options page.  Select a profile to load at startup,
       regardless of last-used profile.  I'm thinking this has been on the request list the longest ;)
    -  Removed token restriction on variable pause screen.  You can now use any number of tokens/literals
       that can resolve to either a decimal value or a decimal variable that resolves to a decimal value.
    -  Added token, {RANDOMDEC:lowValue:highValue} - This renders a random decimal between a low value and a 
       high value (inclusive).
  - Bug Fixes
    -  Composite (prefix/suffix) commands that also have a profile override not allowing the override to be
       optional has been fixed.
    -  Mic unplugged during edit no longer crashes the application.
    -  Package import (.vax) false warnings fixed.
    -  Profile global listening hotkey, 'prevent key from passing through' not working has been fixed.


    -  Improvements
       -  VoiceAttack can now detect and use Microsoft Speech Platform 11 speech engines and text-to-speech synthesizers.    
       -  Added, 'Condition Builder' feature to allow compound conditions.  You can now, 'AND' and 'OR' your
          conditional statements (If, Else If, Start Loop), and make your conditions a little easier to read
          with fewer duplicated actions.  You can also convert your existing conditional statements by right-
          clicking on the action and selecting the, 'Edit with condition builder' menu item.  There's a LOT going
          on, so I'll defer to the help document (there's a new section titled, 'Using the Condition Builder').

       -  First round attempt to bulk load dynamic and composite (prefix/suffix) commands more efficiently.
       -  Added, 'Start Loop - Repeat Certain Number of Times'.  There are two options.  The first is to just
          repeat a certain number of times.  The second is to repeat a certain number of times using a range with an
          optional specified indexer variable.  This can be found in the, 'Add a Loop Start' submenu.

       -  Added mouse event recording to the, 'Recorder' screen.  You can toggle the capture of mouse click/scroll/
          tilt wheel by pressing a hotkey (assignable from the recorder screen).  Also, mouse position is captured
          via separate hotkey with application-relative coordinates available as an option.
       -  Changed, 'Set a Date/Time' value action to allow for a variable/token when adding time.
       -  First round attempt to isolate Steam VoiceAttack from the Steam environment to help with things like running 
          as an admin, starting with Windows and not showing, 'in app' when VA is started last.

       -  The "Say something with text to speech" screen voice selection dropdown now allows you to also type whatever you 
          want in the box.  This can be a text variable or literal text and/or tokens that can also resolve to a variable 
          name.  When the tts is rendered, an attempt is made to derive a voice from the name.  If no valid voice is found 
          with the rendered name, the default voice will be used.  Just a note... the voice names must match exactly with 
          what is installed in the system.
       -  Added start/stop recording hotkey to, 'Recorder' screen, plus audio feedback for when recording starts and stops.
       -  Added small, live coordinates update to the mouse position capture screen as a source of additional feedback.
       -  Removed, 'Mouse Capture Hotkey' option from Options screen (Hotkey tab), since this is now configured from the 
          mouse position capture screen.
       _  Updated 'capture mouse position' screen to allow for a single-key capture hotkey, configurable from the mouse capture screen.
       -  Added a, 'mass update' feature to the Say Something with Text-To-Speech screen.  Right now, this updates the
          voice, volume and rate only, and only across the entire profile.
       -  Switch to another profile by name has been added as an option to the, 'Switch to another profile' action.  Note that the
          input box can take any number of tokens to render a valid profile name.  Also note that if your profile names change, this
          value will not be updated.
       -  Added first-round take on importing, 'packages' (.vax) files.  Packages are zipped-up profiles, sounds and apps/plugins that
          can be imported in one shot (see help doc section, 'VoiceAttack Profile Package Reference' and updated, 'Importing Profiles' 
       -  Option added to allow VoiceAttack to minimize when close button is clicked.          
       -  Added a version check for newer profiles on import.  If the imported version is from a newer version of VoiceAttack,
          the user will get a message box stating so.
       -  Added state token, '{STATE_SPEECHACTIVE}' which will render "1" if the speech engine is detecting speech,
          or "0" if the speech engine is not detecting speech.

       -  Added new tokens, '{STATE_SYSMUTE}', '{STATE_APPMUTE}' and '{STATE_MICMUTE}'.  These work exactly like
          '{STATE_SYSVOL}', '{STATE_APPVOL}' and '{STATE_MICVOL}', except that the test is for mute/unmute (instead
          of just volume being zero).  A rendered value of "1" means the device/app was muted, "0" means the device/app 
          was not muted.
       -  Added check for NeoSpeech voices to offer warning for users to use the, 'Single TTS Instance' option.           
    -  Bug Fixes
       -  Fixed an issue where if a jump and jump marker were in a suffix command together, and the
          marker preceded the jump the position pointer would be offset incorrectly.

       -  Set Text variable by invalid URI was causing VoiceAttack to crash.  This has been fixed.
       -  Crash resulting from key up/mouse up/joystick up shortcuts when combining profiles has been fixed.

       -  Switching profiles with startup command no longer blocked by synchronous calling command.           

    -  Steam version update, security.

    -  Steam version update, security.


   -  Design Changes

      -  Replaced, 'include profile' with the ability to include multiple, prioritized profiles on
         the Profile Options screen.  Just click the, '...' button and add profiles to include.  The 
         higher the profile is on the list, the higher its priority.  Duplicate-named commands in higher-
         priority profiles will be retained.  Note: The current, active profile always has the highest 
   -  Improvements

      -  Added, 'Execute an Inline Function - C# or Code' command action.  This will allow you
         to write C# or code in a function to be compiled and executed on the fly.  This is
         for use when you want to do something a little more complicated but a plugin would just be
         too much to work with.  From within this class (yeah... the action is named poorly... it's
         better than saying, 'Instantiate an inline class and execute a function') you have access
         to the VoiceAttack proxy object (just like you do with plugins)... execute commands, parse
         tokens, get/set variables, etc.  There is a very basic editor included that may or may not improve 
         over time.  I've been resisting requests for a long time for this, since plugins were available.
         Hoping I don't regret this lol  o_O

      -  Added, 'Build Output' to the, 'Execute an Inline Function - C# or Code' screen.  What this
         does is make the, 'Execute an Inline Function - C# or Code' screen dual-purposed by
         allowing you to specify a file name in which to compile your code into (the resulting file is
         also called an, 'assembly').  This is so you can have precompiled versions of your inline functions
         for whatever reasons you may need.
      -  Added, 'Execute an Inline Function - Precompiled' action to execute the file you create using the,
         'Build Output' feature outlined above.

      -  Added token, '{CMDSEGMENT:segment}' which will allow you to extract specific portions
         of dynamic commands (commands that contain dynamic sections), indicated by, 'segment'.
         This will allow you to make more precise decisions based on what was spoken.  
         For instance, let's say you have a complex dynamic command that you use to build several 
         kinds of items like this:
         'build [1..10][bulldogs;wolves;strikers][please;]'  
         Then, you say, 'build 5 bulldogs' to execute that command.  To find out what was built, 
         you can check {CMDSEGMENT:2} (note that the specified, 'segment' is zero-based.  So, the 
         first segment is 0.  The second is 1, and so on).  The rendered value will be, 'bulldogs'.  
         Then, you can find out how many items to build by checking {CMDSEGMENT:1}.  The rendered 
         value will be, '5' (which you can convert and use in a loop, for instance).  For bonus 
         points, you can check {CMDSEGMENT:3} and see if, 'please' was spoken and then thank the 
         user for being so polite (or chide them if they didn't say, 'please') ;)

      -  First pass at, 'scoped' variables.  Variables can now be, 'scoped' globally
         (as they always have been), profile-level and command-level.  In order to not
         triple up the user interfaces, variable names will now have a prefix associated
         with them.  Profile-level variables will be prefixed with the, '>' character,
         and command-level variables will be prefixed with, '~'.  Global variables will
         be unprefixed.  So, 'myTextVariable' will be globally-scoped, '>myTextVariable' 
         will be profile-scoped and '~myTextVariable' will be scoped at the command
         When a profile is switched, the profile-scoped variables are lost.  If you want 
         to retain a profile-scoped variable between profile changes, prefix your variables 
         with two '>' characters.  For example, '>myTextVariable' (single, '>') will be lost, 
         '>>myTextVariable' (double '>') will be retained and will be available when you switch
         back to that profile.
         Command-scoped Variable names that are prefixed with two '~' are considered
         command-shared.  That means that the variable will be, 'shared' among commands that
         are executing in the same execution chain.  Basically the values are passed from one 
         command to any subcommands and then back when control is released.  Clear as mud?
         Some examples...  First, WITHOUT command-shared variables:
         Command A sets text variable ~myText to 'hi'.  Command A then executes Command B as a
         subcommand.  Command B reads ~myText and it is, 'Not Set' (null).  That is because
         ~myText is command-scoped.  It is only available to Command A.
         WITH command-shared variables:
         Command A sets a shared text variable, '~~myTextVariable' to 'hello'.
         Command A then executes subcommand Command B.  Since ~~myTextVariable is shared,
         Command B can then read and write ~~myTextVariable.  Command B reads ~~myTextVariable
         as, 'hello' and then decides to set ~~myTextVariable to, 'greetings'.  When Command B 
         completes its execution and control returns to Command A, Command A will read 
         ~~myTextVariable updated as 'greetings'.
         Another example is Command A executes Command B.  Command B executes Command C.  
         Command C initiates the creation of ~~myTextVariable and sets its value to 'welcome'.  
         When Command C completes, it releases control to Command B.  Command B completes and
         releases control to Command A.  Command A reads ~~myTextVariable as, 'welcome'.
         The idea here is that even though the variable was created two levels down from
         Command A, it is still accessible to Command A.
         The only things that you need to be aware of is that all shared variables are passed
         down to subcommands.  If you want values to be passed back up to the calling command,
         the, 'Wait until this command completes before continuing' option MUST be selected
         for the subcommand.
         This is kind of an unorthodox way to be able to pass private information between 
         commands without having to use global variables or establish parameters or return
         values.  Note this is experimental and will get pulled if it causes issue.
         Added a section to the help document called, 'Advanced Variable Control (Scope)'
         in regards to this.
      -  Dynamic range has been updated to optionally accept a multiplier.  This way, you can
         have ranges that, 'step' by the multiplier value.  For instance, if you would like to
         specify a dynamic range that uses only 10s, you would use the following: [1..10,10].
         The result would be 10, 20, 30,..., 100.    
      -  Added, 'Duplicate Profile' to the main screen.  This will only be available to registered
         users as you can only have one profile in trial mode.
      -  Added, 'Repeat command while keys are held down' option to command hotkey screen.  If this
         option is selected, the invoked command will loop as long as the keys that invoked the
         command are held down.
      -  Added, 'Repeat command while joystick buttons are held down' option to command hotkey screen.  
         If this option is selected, the invoked command will loop as long as the joystick buttons that 
         invoked the command are held down.  
      -  Added, 'Repeat command while mouse buttons are held down' option to command hotkey screen.  If this
         option is selected, the invoked command will loop as long as the mouse buttons that invoked the
         command are held down.  Note that the option to prevent pass-through has to be unchecked to 
         use this feature.    

      -  Added, 'Stopped' and, 'ResetStopFlag()' to the VoiceAttack proxy object.  The 'Stopped'
         property will allow you to query whether or not the user has issued a, 'stop all 
         commands' action or pressed the stop commands button on the main screen.  Note that 
         the VA_StopCommand function in the plugin interface still works.  This is mainly for 
         using the proxy object within inline function actions that are run asynchronously (not 
         waiting for the function to complete).  The 'ResetStopFlag()' function will reset the flag
         if you want to continue for some reason (and still want to check again later).
      -  Added, '{CMDWHENISAY}' token to indicate the full value of what is in the, 'when i say' box
         when a command is executed.
      -  Added, '{CMDCOUNT}' token as an indicator for the count of executed top-level (non-subcommand)
      -  Added, '{CMDISSUBCOMMAND}' token to indicate if a command that is executing is being executed
         as a subcommand.
      -  Copying a command that contains subcommands is now allowed if the subcommands that are executed 
         are executed by name.
      -  Added, '-uritimeout' command-line parameter to allow for changing the default timeout for 
         the, 'Set text variable by URI' feature.  This is a stopgap until proper user interface is
         (ever) created.

      -  Log no longer clears when profile changes.  

      -  By special request, "Pink" has been added to the choices of log icon colors ;)  This is
         available in the, 'write to log' action, as well as through the VoiceAttack proxy object's
         WriteToLog() function.

      -  Added, 'Log Quiet Mode' option to System/Advanced tab.  This will let you keep
         log clutter to a minimum, especially with externally-executed plugin commands
         occurring more and more.  With this option, you can choose to allow warnings
         (yellow-dot entries) and/or, 'Write to log' command actions (regardless of 
         color).  Error entries (red-dot, VA generated) are never filtered.
      -  Increased the tooltip delay across the board to 7 seconds (used to be 5).  There
         is a setting inside the VoiceAttack user.config file that holds the tooltip
         display duration (the setting is called, 'ToolTipDuration').  It is expressed in
         milliseconds.  So, if you want to extend or shorten the delay, you can change 
         that value if you want (that value is now respected application-wide).
      -  Added, '{TXTLASTPOS:textVariableOf / text value : textVariableIn / text value}
         and {TXTLASTPOS:textVariableOf / text value : textVariableIn / text value : intVariableStart / int value}' 
         tokens to get the last position of text within other text.  Note that there are two 
         variations of this token.  One with a numeric start position and one without.  If you use 
         the option without a start position, the end of the text is assumed.  
         {TXTLASTPOS:"abc", "abc123abc"} will return "6".
      -  Added, '{STATE_VA_PLUGINSENABLED}' token.  Returns "1" if plugins are enabled, and "0" if 
         plugins are disabled.
      -  Added, 'append' option to, 'Write Text to a File' action.  
      -  Added, 'Begin at position' option on the, 'Play a sound' screen.  This option
         will accept a literal, token or decimal variable.  When the sound is played,
         the position will be set according to the number of seconds you provide (expressed 
         as a decimal value).  The sound preview screen will allow you to try this out, 
         as long as what you are putting in the box can be rendered into a decimal at the time
         of preview (variables must be set first). 
      -  'Fade in' option added to, 'Play a sound' screen.  This is only available if you
         use, 'begin at position'.  This is used to keep sounds that start at a position from
         sounding too harsh if started at particular points in the audio.
      -  Added, {STATE_AUDIOCOUNT:variable/value} token.  This returns the number of currently-
         playing instances of an audio file with a given file path.
      -  Added, {STATE_AUDIOPOS:variable/value} token.  This returns the position of a currently-
         playing audio file with a given file path, expressed as seconds.  
      -  All keys that are down are now released when commands are stopped (not just mod keys).
      -  Added 'Set Audio Level' action to Windows actions.  This action will allow you to
         mute/unmute/toggle mute/set volume/offset volume for the system audio (default
         playback device), the microphone (default recording device) and various apps
         as they relate to the Windows System Volume Mixer.
      -  All targeting-type actions will now accept the window class name as a target.
         This includes, 'Send Commands To', Perform a Windows function's 'Window Title'
         and the new, 'Set Audio Level' application target.

      -  Added, '{STATE_SYSVOL}' token.  This renders a value between '0' and '100' based on your 
         current system volume (default playback device).
      -  Added, '{STATE_MICVOL}' token.  This renders a value between '0' and '100' based on your 
         current mic volume (default recording device).

      -  Added, '{STATE_APPVOL:value}' token.  This renders a value between '0' and '100' based on  
         the indicated app volume as it relates to the System Volume Mixer.  If the volume cannot
         be accessed (app closed for instance), a value of "-1" will be returned.  The value parameter
         can be a variable name (without quotes:  {STATE_APPVOL:myTextVariable}, or it can be a token 
         or a literal if contained within double quotes:  {STATE_APPVOL:"*windows media*"} or
         {STATE_APPVOL:"{TXT:myVariable}"}.  The value expected for the parameter can be the window title,
         process name or window class name (wildcards are supported).

      -  Added token processing support to Set Text/Small Int/Int/Date/Boolean/Decimal variable name
         input boxes.
      -  Added evaluation default options to each of the condition types.  If you
         have this option selected and you set up a condition for, as an example, 
         a boolean variable, the boolean variable will be evaluated as false if
         it is not set (null).  Small and large integers and decimals will evaluate as 
         zero, text will evaluate as empty (blank) and date/time will evaluate as
         1/1/0001 12 am.  This option is on by default when you add a new condition
         start (if) statement.  The option choice persists for each type.  This was
         put in to help those that are new at this to not get confused by null values
         as well as maybe save a step here and there for everyone.
      -  Updated the convert token/text for integers and small integers to accept decimal
         tokens.  The fractional value is simply lopped off (does not round).  Previously,
         this would result in a value of, 'not set' for the integer variable.
      -  When selecting more than one command action in the command edit screen and adding
         a 'Begin a conditional statement', the begin/end actions will now wrap the 
         selected actions.

      -  'Pause command when focus lost' now does not pause when the target is not focused when the 
         command is first issued.  The intended window will be focused as expected

      -   Added command line parameter -datadir to allow a directory to be specified to hold the 
          VoiceAttack.dat file (and its backups).
      -   Added extra speech engine handling (trying to prevent lockup) when locking and 
          unlocking Windows.

    -  Bug Fixes
      -  Fixed issue with setting text variable by URI hanging the entire user interface.
      -  Fixed {CMDSEGMENT} token not accessing segments when used with a composite (prefix/suffix)
      -  Fixed command line options not working if .exe is NOT cased correctly o_O
      -  Fixed issue where composite (prefix/suffix) commands and Quick Input would not respect
         target process or lost focus/continue command.
      -  Automatic profile switching no longer tries to switch to a deleted profile during the same
         running session.
      -  Automatic profile switching for newly-created profiles is now working.
      -  Additional handling in audio output/input options in case of broken internal components
         (Trying to keep the entire house from coming down from minor options).
      -  Fixed issue where animated mouse was not ending up in the right place when, 'application
         coordinates' selected.
      -  Very large dynamic number ranges would cause VA to hang and/or crash.  This has been 
         fixed up a little better.
      -  Fixed issue where the numpad number 9 could not be used in the key press duration box on the
         'Add a key press' screen.
      -  Multiple instances of the same plugin causing VA to crash has been fixed.  You'll get a 
         warning message that only one will be used (first one in wins).
      -  {CMD} token now shows the proper command name when, 'execute a command by name' is used with
         a command that is using dynamic sections.
      -  Fixed an issue with Pause and Numlock keys not working correctly with DirectX games.
      -  Profile-level targeting now works again.
      -  Fixed an issue when retrieving a saved value from a profile would not work with
         variable names that contain tokens (variable variable names o_O).
      -  Exporting, 'Write Text to File' actions would not preserve cr/lf.  This has been fixed.

      -  Fixed command-scoped variables not copying correctly in additional situations.  I think this should
         cover it... o_O
      -  Automatic profile switching a little less, 'eager' to switch to default profile.
      -  You can now have full commands that have the same, 'when i say' values as prefixes and suffixes 
      -  Fixed command-scoped variables not copying correctly in certain situations.
      -  The, 'include commands from another profile' option not showing latest selection until 
         fully persisting has been fixed.
      -  Made the, 'improper shutdown' check a little bit less aggressive.    
      -  Fixed, 'improper shutdown' message when VA is restarted after registering.
      -  When using, 'Stop a process by name' (killing a process) on the VoiceAttack process, an attempt is
         made to do an elegant shutdown (should not get the 'improper shutdown' message).
      -  {STATE_KEYSTATE} token was not showing keys that were down when VoiceAttack itself
         was pressing them down (oddly, this is kind of by design).  This should produce
         expected results now.          
      -  Fixed a decimal rounding to NOT use banker's rounding but to use rounding
         for both odd and even numbers.
      -  Desktop ("Program Manager") not being recognized during auto profile switching has
         been fixed.
      -  Output window titles option from Load Options screen now works again.
      -  Fixed issue where using a capital letter in the profile screen's list filter would
         cause the filter to not work.         

   -  Bug Fixes
      -  Fixed a bug that is causing multiple instances of TTS to crash in certain cases.
      -  Fixed a display issue for decimals in the command action list.
      -  Fixed {STATE_JOYSTICKXPOVY} not displaying all values correctly.


  - Design changes
     -  Standard and DirectX mode have been removed.  There is no longer a need to choose a mode.  
        This was found on the key press, key recorder and quick input screens.  You will need to 
        use the key press screen's 'key chooser' feature to select any keys that are not available 
        to you by simply typing them on your keyboard (such as, 'numpad enter' for games and some 
        media keys).        
     -  New update to the plugin interface: Version 4.  This revision adds some more methods 
        and simplifies most of the existing interfaces.  You can now execute commands and get/set 
        variable values, parse tokens, get various environment information (and more) straight from 
        your plugin.  The eight or so parameters in the invoke and init functions have been reduced to 
        one parameter of type dynamic (object in  I decided to go dynamic and not require a 
        referenced interface as I expect this interface to change quite a bit and to keep up with and 
        support that would just not be very fun for anybody.  There may be an interface included to 
        reference later, but that will be down the road if absolutely needed.  The properties and 
        methods available are documented in the VoiceAttack help file (VoiceAttackHelp.pdf in your
        installation directory or from the right-click menu at the top-left of the main screen).
        VoiceAttack is still backward-compatible with plugin interfaces going back to version 1.
        There is no real need to ever NOT be backward-compatible, so I don't see a need to ever
        remove it.
        Since the dynamic type is now used, This will require .Net framework 4.0.  This shouldn't
        be a problem, as VA requires that version and you can get Express versions of Visual 
        Studio that will allow you to build the .dll.   
        Note in the documentation that prior versions of the plugin interface have been updated
        to include vaProxy (the object used to execute commands, set variables, etc) as part of 
        the state dictionary.

     -  Tokens can now be nested and are treated as nested by default.  That means that tokens
        can now be inputs for other tokens.  Tokens are processed from the inner-most token to
        the outer-most and the entire statement is reprocessed for tokens on each iteration.  
        Since the statements are reprocessed for tokens, this can effectively cause an infinite
        loop or cause VA to crash (stack overflow) so use with caution when using tokens to create 
        more tokens.  Also note that text between two curly brackets { } that do not resolve in a 
        token will be replaced with whatever is between the brackets.  So, something like {hello} 
        will be rendered as, 'hello' (no quotes).  This all may cause issues with older commands 
        that may not be set up properly, so there is an option on the options screen called, 
        'use nested tokens' which is turned on by default.  Unchecking this will make VA process the 
        tokens as before (v1.5.12 and earlier).  Note this is a global setting and you'll want to 
        fix up your old commands in order to continue to be able to use new commands where the 
        tokens may be nested.  If curly brackets are preceded with a pipe (|): |{  or |}, they 
        will be rendered as literal brackets.  '|{hello|}' will be rendered as, '{hello}' (no
     -  The Quick Input indicator, '[PAUSE]' (to press the Pause/Break key) has been replaced 
        by, '[BREAK]' in the documentation.  '[PAUSE]' will still work on its own, but a new
        inline function, '[PAUSE:seconds]' has been introduced (see below).

     -  Duplicating a command no longer creates a unique name.  The name is now just duplicated to 
        make it a little easier to copy and reuse.  For example, 'My Command', when duplicated in
        earlier versions of VA would create a unique name of, 'My Command 1'.  From the version on,
        the duplicated name will just be, 'My Command'.
     -  Turning off keyboard shortcuts now only turns off command shortcuts.  Global hotkeys (listening,
        command stop, mouse capture) will remain in effect.  To turn these off, either turn them
        off in the options screen, or, to completely turn off VoiceAttack's keyboard hooks, run
        with the command line parameter of -nokeyboard.  Remember, this is only for the keyboard
        hook and does not turn off key presses (output).
     -  Recorder screen no longer, 'handles' key presses.  All key presses will pass through
        to the target application while the recorder is, 'recording'.

  -  Improvements

     -  Added variable key presses to the key press screen.  This will allow you
        to issue a key press/down/release/toggle via text variable using the same
        notation found in Quick Input.  This is to aid (primarily) in cases where keys 
        for various commands may change periodically (such as with key bindings for games).  
        The idea is that keypress variables would be initialized at profile startup or by 
        plugin activation, thereby not requiring constant, manual updating of commands each 
        time the key bindings change in a game.  Hoping to see some interesting implementations
        come out of this one.

     -  Process targets (send commands to) now include windows that are not the main window handle
        when seeking out the target.  If the window is located, an attempt will be made to make the 
        window the top-most window for the application before input is sent to it.
     -  'Send commands to' on main screen, profile screen and command screen now show all open
        windows (versus only the active, top-level windows for each application).  When commands
        are now sent to windows that are not the active, top-level window, an attempt is made
        to bring that window to the front to accept input.

     -  Added pause indicator to Quick Input.  If you add an indicator of [PAUSE:seconds] to 
        Quick Input, typing will be paused for the indicated number of seconds.  For example,
        if you enter, A[PAUSE:0.5]B[PAUSE:2.5]C, 'A' will be typed out, then a pause of one
        half second, then 'B' will be typed and then a 2.5 second pause and then, 'C'.  Pretty
        straightforward.  Note that that the [PAUSE] indicator still exists to allow you to
        indicate the Pause/Break button, however the documentation suggests using, '[BREAK]'
     -  Quick input / variable keypress indicators added:  
        [SPACE] - space bar... just in case you don't like using an actual space or having
        a space is hard to see in the interface.
        [DEAD] - Dead key that's found on German and various French keyboards.  This
        is mainly for variable key presses but will work with Quick Input.  Supported layouts
        are German, French (France), French (Canada), Belgian French and Belgian Dutch.
        [ALT], [CTRL], [SHIFT] [WIN] - stateless modifiers which are only available for
        variable key presses (state (down/up) will be determined by the type of key action
        (press, down, up, toggle).
        [1]-[254] - if you happen to know the virtual key value (integer), you can put the
        value between brackets and the key will be processed accordingly (note that there is
        no speed increase by doing it this way... just yet another way to get things done).
     -  Mouse up/down/left/right movement options have the option to use relative data broken 
        out as a separate option.  So, now there is an option, 'move using relative data (useful 
        for 3D games)' which forces movement to be relative to the mouse cursor.  If this option 
        is not selected, you can then choose to move the cursor relative to the current cursor 
        location or the location that was last set by VA.
     -  Mouse move left and right are independent of move up and down so you can now set both
        the x (left/right) or y (up/down) at the same time (for diagonal movement in the same
     -  Added options to move mouse left/right/up/down feature to allow moving based on current
        cursor position and last-set position.  The, 'move based on last-set position' option will
        move the mouse based on the last place that VoiceAttack had set.  If it's the first time
        run, however, the cursor position will be used.
     -  Mouse move left/right/up/down boxes now accept numbers, tokens or integer (long... not 
        short/conditional) variables.  If the value cannot be evaluated, it will default to zero.
        If the value evaluates to a decimal, it is converted to an integer.
     -  Added, 'animate mouse cursor' option to the mouse move screen.  This will allow you to
        have the mouse move from where it originates to its destination with a more, 'natural'
        effect than just appearing in the destination.  The option, 'ease movement' allows for
        the mouse to gradually reach its destination.  Not selecting, 'ease movement' will move
        the mouse cursor in a constant motion.  You can specify the number of steps over a base, 
        'time'.  The time (in seconds) is not exact, as the more steps you add the more the time 
        can expand.  Also, if 'ease movement' is selected, the timing will actually be less.
        This will be handy in cases where sudden movement will cause things like menus to 
     -  Added 'scroll wheel left x clicks' and 'scroll wheel right x clicks' to mouse screen 
        (click/scroll tab).  This simulates tilting the scroll wheel to the left or right.
     -  Added scroll wheel left/right/up/down to mouse shortcuts.  You can now have a command
        execute for each click of the scroll wheel as well as tilting the scroll wheel left and
        right.  Note that these are obviously very sensitive, and the left/right event repeats
        when held down (there is no up/down state for any of these, so use with caution).
     -  Added VA version tokens.  Might help with profiles or plugins:
        {STATE_VA_VERSION} -  ""
        {STATE_VA_VERSION_MAJOR} - "1"
        {STATE_VA_VERSION_MINOR} - "5"
        {STATE_VA_VERSION_BUILD} - "12"
        {STATE_VA_VERSION_ISRELEASE} - "1" is true, "0" is false.
        {STATE_VA_VERSION_COMPARE:textVarialbe} - "1" if VA version is greater or equal to the 
        version number provided in, 'textVariable'.  "0" if VA version is earlier.

     -  Added {TXTSUBSTR:source:start:length} token to allow for a substring feature outside of {EXP} 
        ({EXP} wants to do too much work and will automatically eval numbers out of a substring).  If 
        length or start position are negative, an empty string will be returned.       
     -  {CMDCONFIDENCE} token added to indicate the confidence level of a command.
        Values range from 0 to 100.  Note this value is accessible from within the
        specified unrecognized catch-all command.
     -  {CMDMINCONFIDENCE} token added to indicate the minimum confidence level set
        by the user for the executing command.  Values range from 0 to 100.  Note that
        if the minimum confidence level is not turned on, this value will be always be 

     -  Numpad keys can now be distinguished from home cluster/alpha keys.  Whether your app or 
        game can tell the difference is now up to the app or game.  This includes keys pressed
        by VoiceAttack as well as hotkeys that VoiceAttack processes (command shortcuts, global
        listening, etc).

     -  Added 'Windows Miscellaneous Functions' to Other stuff screen.  By popular
        demand (and some extras thrown in), VA will attempt (given proper version and
        user rights) to execute the following:
        Toggle Desktop, Lock Workstation, Log Off Current User, [Force] Sleep (Standby) PC,
        [Force] Hibernate PC, [Force] Restart PC, [Force] Shutdown PC, [Force] Power Off PC,
        Minimize All, Undo Minimize All, Open Run Dialog, Open Search Dialog, Open Window 
        Switcher, 'Hide' and 'Show' task bar and Run Screensaver (one line of code... might as well, 
        right?).  I've resisted long enough, so here you go (lol).

     -  If VoiceAttack is improperly closed (probably due to a crash), the load options screen 
        will be presented to allow you to disable certain functionality.
     -  Added the option to set the Windows default input and output device on VoiceAttack startup.  
        This feature will also allow you to change the default input and output from the options 
        screen, saving a trip through the system tray.  This is experimental and totally for 
        convenience (mostly mine) and may not be included later if it proves to be problematic.  
        This is only currently available for Windows 7 or later.  Sorry, Vista users... may implement
        for you later if there is significant demand for it.

     -  Added command line parameter, '-input' to change your Windows default input device (microphones) 
        from the command line.  You will need to indicate your device within double quotes, and your 
        device name must match what is listed in the dropdown list on the Options screen.  Often, just 
        updating a driver will cause the device name/description to change, so this parameter can also 
        accept wildcards (see documentation on how wildcards are used if you are not sure what they are 
        about).  VoiceAttack  will find the first match and use that device, so use with care.  Note 
        that this parameter will work against new or existing instances of VoiceAttack.

        This example shows how to change to a device exactly as indicated:
        C:\Program Files(x86)\VoiceAttack\VoiceAttack.exe -input "Speakers (4- Sennheiser 3D G4ME1)"

	      This example shows how to select the first device that has a description
        that contains, 'G4ME1':
        C:\Program Files(x86)\VoiceAttack\VoiceAttack.exe -input "*G4ME1*"

        These can be put in a .bat file or used in a desktop shortcut.
     -  Added command line parameter, '-output'.  Works just like the -input one above, except it's 
        for output (speakers/headphones).
     -  Added command line parameters, '-inputx' and '-outputx'.  These work exactly like '-input' 
        and '-output' above, except that once the devices are changed, VoiceAttack closes immediately 
        (does not show the user interface.  Again, this is helpful if you have a desktop shortcut, 
        batch file or launching app and want to quickly change default devices without fully launching 
     -  Option added to Load Options screen to reset automatic audio device switching on startup.        
     -  Options screen now opens on last selected tab.

     -  Jump to marker now supports tokens.
     -  Added, 'Black' and, 'Gray' to Write to Log icon colors.
     -  Registration screen will now show warning if hidden characters are in registration info.

     -  New command line parameter, '-punload' to indicate the timeout for plugins to unload in milliseconds.  
        When plugins are unloaded on exit, VoiceAttack will wait a specified amount of time before
        giving up and shutting down.  If the timeout is exceeded, an entry will be written to 
        VoiceAttackFault.txt in the installation directory.  The default timeout is 5000 (5 seconds).
        C:\Program Files(x86)\VoiceAttack\VoiceAttack.exe -punload 1000
     -  Updated various tokens to accept literal values (mostly text-related tokens).  
        See documentation for changes.
     -  Added listening, shortcut, mouse, joystick and stop command icons to the VoiceAttack
        task bar icon plus some jump list settings (right-click on taskbar icon).  Might save 
        a step here and there.
     -  Info box regarding not running as an administrator now shows up for registered users.
        Also, a warning is indicated in the log when VA is launched.  Hoping this might help
        out those that don't know about this.
   - Bug fixes
     -  Exporting a profile with certain circular references will cause the export to fail.  This 
        should be good to go.
     -  Clearing hotkey now clears the, 'do not allow key to be passed through' check box when only 
        modifiers are selected (alt, shift, ctrl, windows).
     -  Closing TTS screen while preview is playing and text is selected no longer crashes.
     -  Updates to key press to help with some compatibility issues.

     -  Pause mass update not updating after an undo fixed.

     -  Pasting at the end of a grouped command list throwing exception has been fixed.
     -  Jump to marker not maintaining marker in list fixed.

     -  First pass at curbing shutdown exceptions.

     -  VA will now log plugin exceptions received when plugins are unloaded when VA closes.  Also, 
        plugins that do not exit in a timely manner will be logged in case it is causing VA to crash.  
        The log entries are written to VoiceAttackFault.txt, which is located in the VA install directory.

     -  {STATE_KEYSTATE} token not working when key press set to not pass through fixed.
     -  Move mouse left/right/up/down moving based on previously-set values has been fixed.

     -  Mouse click targeting now a little less heavy-handed.
     -  Attempt to curb Error 740 when installer instructed to launch VA after installation.

     -  {STATE_KEYSTATE:LSHIFT} now working as intended.

     -  Fixed an issue with running out of memory while exporting extremely large profiles.
     -  Log warning is now given if commands are right-click executed while, 'Stop Running Commands 
        When Editing' option is turned on.        
     -  Mouse screen, 'ok' button disabled in certain circumstances now fixed.
     -  Token parser will now not bail out when it finds extra curly brackets.

     -  Bolstered up error trapping around some joystick functionality.


   - Improvements

     -  Slight profile load time increase.

   - Bug fixes

     -  Fixed issue where profiles would not load
        if a duplicate was in a linked profile and
        one of the commands was set to voice-disabled.


   - Bug fixes
     -  Attempting to correct startup crash some are 

     -  Write to file not writing if, 'overwrite' not

     - Fixed issue with double-quotes causing the 
       speech engine to crash.
     - Fixed issue where deleting a profile caused
       a double reload of the fallback profile.

     - Fixed issue where creating a new profile was
       not loading commands.

    -  Start minimized to system tray for some not working
       possibly working again... maybe.

     - Fixed an issue with duplicate-named commands
       causing a crash.

     - Attempt to correct installer-related issues.


   - Bug fixes

     -  Fixed audio error and stop command issue when, 
        'fade out stopped audio' set.

     -  Removed the 21-day time-constraint that is part
        of the trial.  The trial is still just one profile
        with 20 commands, but the startup will be slowed
        incrementally over a certain number of uses.


- Design changes (important)
   -  All mouse down actions will now make the application
      that is under the mouse the current process target
      (set as process target, move to foreground and focus).
      The process target will remain for the duration of
      the command.  This is to simulate what a hardware
      mouse would do and this should be the expected 
      behavior.  The old way would maintain the process
      target throughout the command, and when a mouse
      click was used to access another process, the 
      messages were not being sent to that other process
      (which was expected).  If this causes problems for
      existing macros, my apologies.  There is a new
      option on the Options screen to help with this:
      Bypass Mouse Targeting.
      This will keep things the old way and not potentially
      set a new target.
   -  Before, if a, 'Start Listening' action was discovered
      *anywhere* within a command, and listening was off,
      the command would execute as if VoiceAttack was listening.
      This was for convenience and was left over from the 
      early days when there wasn't much going on.
      The design has changed slightly.  This behavior is still
      available, however, it is only available if the FIRST
      action in the command is a, 'Start Listening' action.
      Again, this is for convenience and is still a weird
      design decision but it's meant to be helpful and
      reduces some user interface clutter.

   -  'Cancel blocked commands' option added in v1.5.8.23 will 
      now be true by default.  The behavior up until now has been 
      that the blocked commands would queue up and then execute 
      once the blocking command completed.  To keep that behavior, 
      just un-select this option.

- Improvements	  

   -  Added new command trigger by mouse button click.  
      You can set up any combination of the five standard mouse
      buttons, including mouse up (release).  On the command
      screen, you'll now find, 'When I press mouse'.  Combined
      with the new state tokens, this should give a fair amount
      of flexibility.  To turn the mouse shortcuts on and off, 
      there is an icon on the main screen, plus an icon in the 
      notification icon in the system tray.  Profile screen 
      command list and export command list updated with new mouse 
      column.  The column will only be displayed if there are 
      commands that have mouse triggers.  There is also a filter
      button to hide disabled mouse commands on the profile

   -  Added new actions for mouse:  Stop Mouse Shortcuts and
      Start Mouse Shortcuts (just like the actions for hotkeys
      and joysticks).

   -  Added, '-mouseoff' and '-mouseon' command line parameters
      to support enable/disable mouse shortcuts.  Note: These do 
      not affect the mouse listening feature (just the command 

    -  Support added for four screen sizes : 
       Normal, large, larger, largest.  The setting for this
       is on the options screen.  This is a stopgap before
       building a WPF version of VoiceAttack.  I also wanted
       to be able to provide a way for the user to increase
       their screen size without forcing them to have to 
       change their font size.
    -  Added, 'Reset Screens' button to options screen that allows
       the reset of all screen sizes/locations to default values (in case
       you change resolutions and screens are too big).   
    -  Added option, 'Disable Acoustic Echo Cancellation'
       to attempt to aid in recognition.  This is due mostly
       to Razer devices not working properly with the speech
       engine in some regards.

    -  Moved delete, export, import and create to
       new, 'More' button on the main screen.  The
       profile lists are becoming a lot longer than
       I had anticipated, so I've consolidated 
       everything under one button to clean things up
       a bit.

    -  Added new key press action, 'Toggle Key(s)'.  If the keys
       are down, release them.  If they are up, press them down.
       Note this toggles the state of all keys involved.  So,
       if the keypress is a combo of CTRL + X and CTRL is down
       and X is up, toggling will release CTRL and press X.	 

    -  Warning box now pops up if derived commands from
       a single command exceed a count of 100.
    -  Attempt at decreasing the overall load time of 
       profiles.  Larger profiles and profiles with lots of
       derived commands will benefit from this the most.  	   

    -  Added 'Else If' action for condition blocks.
       Reduces the need for multiple begin/end 
       blocks.  You can finally do if/else if/else.
    -  Added Loop start/Loop End actions.  While a 
       condition is met, you can loop a section of
       your command.  Loops can be nested.
    -  Added explicit 'Exit Command' action (no longer
       need to add a jump and set a flag unless you 
       want to).  Added this to make it a little bit
       more obvious.  Note this also does not stop
       any executed subcommands (it just exits).

   -   Added new data type: Date/Time.  With the new data
       type comes a new Set Date/Time feature, plus an 
       extra tab on the, Condition (If and Else If statements)
       and Loop start screens.  There are also some new
       tokens that work exactly like the existing date and
       time tokens (except the new tokens accept a variable 
       name).  Plugin interface has been updated to include 
       the date/time values (this is now version 3... still 
       backward compatible).
    -  Added dynamic responses to text-to-speech.  Just as with
       using dynamic commands, you can now use square brackets to 
       have more dynamic responses with text-to-speech.
       Before, if you wanted a random response with slight
       variation, you would have to explicitly indicate each 
       [fire;launch;dispatch] the [missiles;weapons;porcupine] will result
       in a random response of:
       fire the missiles
       fire the weapons
       fire the porcupine
       launch the missiles
       launch the weapons
       launch the porcupine
       dispatch the missiles
       dispatch the weapons
       dispatch the porcupine

    -  Added the ability to inhibit the execution
       of multiple commands with hotkey shortcuts.
       This is only available if all involved commands
       have the, 'Shortcut is invoked only when all keys
       are released' option set in the, 'When I press...'
       Command Shortcut screen.
       For instance, let's say you have three commands:
       One that executes when F1 is released, and
       another that executes when CTRL + F1 is released.
       Before, if you pressed CTRL + F1 down and then 
       happened to release F1 first, the command associated 
       with F1 would execute, followed by the command 
       associated with CTRL + F1.  In this release, only 
       the command associated with CTRL + F1 will be executed.
       F1 will still execute when pressed on its own.
       Apologies to anybody that's gotten used to this 
       behavior, but this is the way it should have been 
       since the beginning o_O.
    -  Added, 'Shortcut only executes when all buttons are
       released' option to the joystick button trigger for 
       commands.  You can now have commands that execute on 
       button down as well as button up... finally ;)  Note 
       that this option will eliminate superseded button-up 
       commands (just like it does now for keyboard hotkeys).  
       For instance, if you have button up triggers for button
       'A' and 'A + B', only 'A + B' will be invoked.
    -  Added option 'Shortcut is invoked when no other buttons
       are down' to joystick button trigger for commands.  This
       provides an exclusive mode for your button/combo, so that 
       if you have a trigger for button, 'A' and any other button
       is down when 'A' is pressed (or released), the command
       will not be invoked.	   
    -  Added an advanced section to the, 'Run an application'
       action.  In addition to the, 'wait for exit' feature
       that captures stdout and exit codes, there is now a 
       'wait for start' feature that waits until the launched
       application has started (that is, ready enough to be
       accepting windows messages).  With the, 'wait for start'
       feature, there is also the option to set the newly 
       launched application as the process target (Set command
       to target launched application).  The, 'wait for start' 
       and 'wait for exit' features can now have a specified 
       wait time before giving up.  If the launched app fails 
       to launch properly or exit in the time specified, you 
       can now use the, 'Exit command immediately if launch 
       has failed or wait time exceeded' option to jump out 
       of a command.  This should help out a lot of folks 
       having trouble with process targets.	   

    -  Added, 'Exit command immediately if window/process not 
       available' to the 'Perform a window function' action to 
       allow you to jump out of a command if the target is not 
       available (or the wait time is exceeded).	  

    -  Set text feature, 'replace text' now accepts tokens
       in the 'replace' and 'replace with' fields.  'Replace'
       will now accept spaces and 'Replace with' will now 
       accept a blank (empty) value.
    -  Increased, 'add a comment' action from 64 characters
       (yikes!) to 512.  Not really an improvement... not
       really a bug, either ;)

     -  Added, 'Set command to target this window'
        option to the, 'Display' feature of the, 'Perform a 
        Windows Function' action.  This will allow you to
        change the VoiceAttack process target to the indicated
        window or process.  This was automatic when used with,
        'Active Window', but now it is not.  This was a bad 
        design choice, so it needed to be changed.  Sorry to those
        that are using it...  you'll need to update your actions
        and check this option.  The good news is that now it
        changes the process target for both, 'active window' and
        specified process targets for the duration of the 

    -  'Add pause' action on command screen is now set by
       flyout menu.  You can choose either, 'Add pause'
       or, 'Add variable pause'.

    -  Added ability to set a pause duration to a decimal   
       variable.  If the variable value is Not Set, the
       pause will be zero seconds.  Note that decimal 
       variables can be set to random values ;)   

    -  The 'wait for exit' option for launching 
       applications now allows you to capture the stdout
       and exit codes of apps that provide them.  Simply
       add a text variable name for stdout and/or an 
       integer variable name for the exit code and those
       variables will be filled.  Access the values via
       token or test using conditional (if) statements.
    -  Added new action, 'Write Text to File'.  This will
       allow you to specify text to write to a file that
       you choose.  This action accepts tokens in both
       the text and file boxes.  As always, use with
       caution ;)      

    -  Mouse move position can now be set by text or
       token.  If the value in place is evaluated as
       a valid integer, the position will be used. 
       Otherwise, no movement will occur (info given
       in log).  If the evaluated coordinate is outside
       of the boundaries of the area, the boundary will
       still be used.

    -  Mouse action screen organized a little bit.
       Move actions are now on one tab, click actions
       are on another.  Navigating to mouse actions
       from the command screen is now from a flyout
       menu with move and click items.

    -  Mouse move position can now be set as relative
       from any corner.  Top-left is still default.
    -  Added 'Move to specific location' mouse action.
       This will allow you to move the mouse cursor quickly
       to various parts of different screens. 

    - New set of tokens for state of keyboard,
      mouse and joystick.  What I see this being 
      used for mostly is to alter behavior for 
      commands based on the state of your devices.
      For instance, if the right mouse button
      is down when I say, 'fire weapons',
      missiles are fired instead of photons 
      (lol).  Also, if the 'x' button is down,
      fire both photons and missiles.
      There is one keyboard token:
      'key' parameter can be any key you can type in
      a token:
      'A', 'B', 'C', '�', '�', '�', '�',
      as well as keys you can't type in a token: 
      ENTER, TAB, LCTRL, ARROWR (see documentation
      for full list).
      So, if you want to test to see if F10 is 
      down, just use the following token:
      {STATE_KEYSTATE:F10}.  To test for the letter
      'A', just use this token: {STATE_KEYSTATE:A}
      If a keyboard key is down, the replaced value
      of the token will be "1".  If the key is not
      down, the value will be "0".

      There are five mouse tokens:
      These should be pretty straight forward. If you
      want to test for the right mouse button, use
      If the mouse button is pressed down, the replaced 
      value will be "1".  If the mouse button is not 
      pressed, the value will be "0".
      Lastly, we have two joystick tokens:
      The, 'buttonNumber' parameter is the number of the
      button on the desired stick.  To test if button 10
      is down on joystick 2, just use this token:
      Once again, if the button is down on the tested
      stick, the replaced value will be "1".  If the
      button is not down, the value will be "0".
   -  Added token {STATE_AUDIOLEVEL} token to indicate 
      the currently reported audio level from the speech
      engine.  The replaced value will be from "0" to 
   -  Added token {STATE_LISTENING} to test if VoiceAttack
      is, 'listening'.  If, 'listening' is on, the replaced
      value will be "1".  If, 'listening' is off, the 
      replaced value will be "0".
   -  Added token {STATE_SHORTCUTS} to test if VoiceAttack's
      shortcuts are enabled.  If shortcuts are enabled, the 
      replaced value will be "1".  Otherwise, the replaced 
      value will be "0".
   -  Added token {STATE_JOYSTICKBUTTONS} to test if VoiceAttack's
      joystick buttons are enabled.  If joystick buttons are 
      enabled, the replaced value will be "1".  Otherwise, the 
      replaced value will be "0".
   -  Added missing POV/hat tokens (see docs for more
      complete details):
      {STATE_JOYSTICK[1|2]POVENABLED}.  Indicates whether
      or not POV is enabled for the indicated stick.
      {STATE_JOYSTICK[1|2]POV[1|2|3|4]TYPE}.  Indicates
      the type of POV switching mode set in joystick
      {STATE_JOYSTICK[1|2]POV[1|2|3|4]}.  Displays the
      direction the indicated stick/POV controller is
      being pressed (depends on switching mode).
      {STATE_JOYSTICK[1|2]POV[1|2|3|4]_NUMERIC} - Use this
      token to get the numeric value of the POV (for 
      finer level of control if the switching mode does
      not suit the need).
   -  Added a whole BUNCH of new joystick state tokens
      to give all kinds of info about your joystick's 
      state.  You can use these for your stuff like
      command modifiers or as triggers if used with some 
      fancy looping.  There are like 28 different
      types, so, I won't list them here (they're in the
      docs in the tokens section).  Finally a way to handle
      some of the, 'analog' controls on joysticks ;)

   -  Added {STATE_CPU} and {STATE_CPU:coreNumber} tokens to return
      cpu usage.  Per request, as I understand, this is to check if 
      your, 'ship' is running hot ;)  {STATE_CPU} will return the 
      average for all cores. The value will be "0" to "100".  
      {STATE_CPU:coreNumber} will allow you to specify a certain 
      core (probably never be used, but the code to do add this 
      is mostly what is used in the average).  Just indicate the 
      core number to check: {STATE_CPU:5} will get the cpu usage 
      for core 5.
   -  Added, '{STATE_RAMTOTAL}' and '{STATE_RAMAVAILABLE}' to return
      the total and available ram on your system in bytes.
   -  '{CMDACTION}' token has a new return type of, 'Mouse'.
   -  Added, '{CATEGORY}' token to allow accessing category
      of command.  For composite commands, '{PREFIX_CATEGORY}'
      will get the category of the prefix, and '{SUFFIX_CATEGORY}'
      will get the category of the suffix.  If, '{CATEGORY}' is
      used on a composite command, the result will be the prefix
      category plus the suffix category, separated by a space.
   -  Added, '{ISCOMPOSITE}' token to allow checking if the
      called command is a composite command (a command that
      uses prefixes and suffixes).  The result will be "1" if
      the called command is composite and "0" if it is not.
   -  Added, '{COMPOSITEGROUP}' token to allow accessing of
      the composite group that the composite command belongs
   -  Added '{ISLISTENINGOVERRIDE}' token to allow checking if 
      command was called using the listening override keyword.  
      This value will be "1" if called command was prefixed with
      a listening override keyword and "0" if not.
   -  Added '{TXTPOS:txtVarOf:txtVarIn:intVarStart}' token to check
      the position of text (txtVarOf) within more text (txtVarIn)
      starting at a given point (intVarStart).  It does use three
      variables that must be set prior to using.  
      Notes: The text search is case-sensitive.  If the text is
      found, the result will be the zero-based index of the 
      start of the text, otherwise the result will be "-1".
      If txtVarIn or txtVarOf are not set, the result will be "-1".
      If intVarStart is not set, 0 is assumed (for convenience).	  
   -  Added token, '{WINDOWTITLEUNDERMOUSE}' which returns the
      title of the window that is currently under the mouse.
      Another item that I was using this for testing and then
      just left for anyone to use.
   -  Added token, '{WINDOWPROCESSUNDERMOUSE}' which returns 
      the process name of the window that is currently under 
      the mouse.  Used this for testing, too (lol).	  
   -  Added, '{LASTSPOKENCMD}' token to provide the last-spoken
      and executed command phrase.  Useful from within subcommands 
      where you need to know what was said to invoke the root 
      command, or if you need to know what was spoken prior 
      to the current command.	  
   -  {TXTREPLACE} is now deprecated.  
      {TXTREPLACEVAR:textVarSoure:textVarSearch:textVarReplace} is
      what should be used going forward for reliability.  This
      token takes three text variables (where {TXTREPLACE} uses
      a text variable and two literals).  If you have something 
      simple, keep using {TXTREPLACE}.  

   -  Added token, '{STATE_FILEEXISTS:variableName}' to indicate
      if a file exists.  The replaced value will be '1' if the
      file exists or '0' if it does not.  Note that this takes a
      text variable.  The variable should contain a fully-qualified
      path.  Note that the variable can also take tokens.

   -  Added token, '{STATE_DIRECTORYEXISTS:variableName}' to indicate
      if a directory exists.  The replaced value will be '1' if the
      directory exists or '0' if it does not.  Note that this takes a
      text variable.  The variable should contain a fully-qualified
      path.  Note that the variable can also take tokens.
    -  Added new global hotkey option for listening:
       'Listen then stop listening after recognition
       completes.'  This turns on listening only
       until the speech engine recognizes speech.
       The command itself can be recognized or
       unrecognized.  This is available for hotkeys,
       mouse and joystick button.
    -  Listening and stop command icons on main screen
       now include hotkey info in tool tips.  The 
       info provided also indicates if the hotkeys are
       overridden at the profile level.
   -    Added, 'Select All' and 'Select None' in 
        command action list.  'Select all' has
        always been there (CTRL + A)... just needed
        some user interface to indicate that it's 
        there ;)
    -   Show latest entry only added to log as an
    -   Windows environment variables (such as %WINDIR%, 
        %APPDIR%, %PROGRAMFILES%, etc.) will be parsed
        out any place that takes tokens.  Note that the
        environment variables need to be surrounded by
        percent signs (%).  You already knew that, 
        though ;)

    -  Tooltip for the command count on the profile screen now shows
       derived command count (count of commands as a result of 
       composite and dynamic commands as well as overrides).
    -  Number of displayed entries in log is now user-selectable.
       Minimum of 20, maximum of 10000.  This setting can be accessed
       by right-clicking on the log.
    -  Grouping (by category) now hides the category column.
    -  Listening, keyboard shortcuts, mouse shortcuts and joystick
       state are now remembered on load.  So, if your listening is
       off when VoiceAttack is closed, listening will be off when
       VoiceAttack starts up the next time.  Command line parameters
       take precedence over these.      

    -  Updated profile export to properly include referenced commands
       (commands used in execute and kill actions).  The onus used to be
       on the user to include referenced commands.  This is now automatic.
       There is now an option on the export screen to exclude referenced 
       commands (for times when you do not want the referenced commands 
       included.  For instance, if you are exporting to HTML).
    -  Added, 'Application Focus (Process Target) Guide' to the
       help documentation to give a little bit of assistance
       in dealing with process targets.	   
    -  Holding down the left control key while clicking on the
       edit profile button on the main screen will now take you
       straight to the last command that was edited in that 
       profile.  Also, an attempt is made to highlight the last
       edited action in a command (hitting enter will edit the
       action).  These are just for convenience... I used them
       while testing and thought it would be good to leave
       them exposed for everybody.	   
    -  Stopped audio now fades out quickly instead of stopping
       abruptly.  Makes things a little nicer, I think.  This can 
       be overridden in options in the audio tab.  Note that this 
       is not applicable when, 'legacy audio' is in effect.
    -  Highlighting a portion of text in, 'Say something with text
       do speech' dialog now only previews the selected text instead
       of previewing all the text.  To preview all text, either 
       select no text or all of the text.
    -  Added checking for some third-party apps that may interfere
       with VoiceAttack (TeamViewer, Synergy and Sonic Studio to start).
       The warnings will be indicated in the log.
       Also added check for Cereproc voices.  A one-time warning box will 
       pop up to let you know that the 'Single TTS Instance' option will be
       set for you (check the appropriate box at the bottom to prevent
       this for whatever reason).
    -  Added some size checking for resizable windows that are too big
       if the overall screen resolution changes.
    -  Added warning box for screens with overall height of less than
       800 pixels.
    -  Added, 'Always on top' to allow VA to be the top-most
       app.  This is accessible through the context menu in
       the top-left corner of the main screen.  Also, there
       are two new command line parameters: -alwaysontopon
       and -alwaysontopoff.

    -  Added command line parameter -nospeech. This disables VoiceAttack 
       speech recognition initialization.  This is experimental and 
       functionally incomplete (mostly from a user interface standpoint) and 
       is used primarily for testing (that is, it is not currently 
       supported).  However, this may be a last resort for those that just 
       can not get their speech engine to work and need to get into the software 
       for whatever reason.
    -  Touched up main screen icons a little bit.  The person's
       head with a pencil sticking out of it has always been
       a sore spot o_O. 
    -  Each resizable screen now allow resizing from each corner
       and side.  Resize tearing has also been reduced.
       OF VOICEATTACK' message is no longer displayed if plugin
       is unable to load due to an exception in the plugin or
       if the plugin can not load on successive executions.
       You should get a better message now that includes the 
       exception text.	   
    -  Added, 'Cancel blocked commands' option to allow 
       the user to pick what to do with commands that are 
       blocked by synchronous commands.  In the past, the 
       blocked commands would simply just execute after 
       the blocking command finished.  Now, you can choose 
       to completely block those commands from ever executing.
       Note that this option is now on by default and is the
       default behavior.  To revert back to the old behavior,
       just un-select this option.

    -  Added command line parameter, '-verifyaudio'.  This will
       run through all the command actions that play a sound
       (including random) and check for the associated file's
       existence.  This was for development work, but now it's
       exposed for the user.  This only runs at startup and
       only affects the initial running instance.
    -  Added, '-ignorechildwindows' command line parameter to
       have VoiceAttack suppress its check for child (popup)
       windows.  Some software (like Sibelius) keep a toolbox
       window open at all times.  This will help to not 
       bubble-up focus to that window.  If need warrants, this
       will be made a profile-level option.  For now, it's 
       exposed in case anybody needs it.
    -  Added, '-showloadtime' command line parameter to 
       give an indication of the amount of time it takes
       to load your profile.  Both the total time and the
       speech engine time are included.

    -  Added, 'Stop Running Commands When Editing' option 
       to indicate that any running commands be stopped
       when a profile is edited.  Deselecting this option
       allows running commands to continue while editing
       occurs (use with caution).
    -  Added a way to indicate the default profile when
       using automatic profile switching.  The default 
       profile is the profile that is selected when there 
       are no other selections to be made.  To indicate 
       the default profile, simply use a single asterisk (*) 
       as a selection in the 'Enable profile switching for the 
       following windows' box on the profile options screen.	   

    -  Slightly lessened profile thrashing when using automatic
       profile switching.  If the process is not different, the 
	   profile should not switch (/facepalm).

    -  New installer.  Hoping this one is a little
       more reliable.

    -  Mouse screen scroll values now persist for subsequent use.

    -  Mouse screen click delay now persists for subsequent use. 

    -  TTS rate now persists for subsequent use.

  - Bug Fixes
    - Recorder screen now resizable.

    - Fixed issue where duplicating set decimal action 
      was not capturing both random values. 
    - Fixed issue where jump marker/jump located both
      in a suffix was not jumping to proper location.
    - Fixed issue with execute command by name not
      finding dynamic commands.
    - Fixed 'stop command if target window focus is lost'
      not unchecking if, 'repeats continuously' was 

    - More DirectX mapping issues resolved.
    - Updated order of event handling on
      startup to see if it helps with some of
      the exceptions that are cropping up
      related to the speech engine.

   -  Fixed suffix issues when using condition actions.

   -  Fixed issue where grouped commands was 
      throwing an exception on key press when 
      focused and collapsed.
   -  Fixed issue with dynamic commands containing
      tokens breaking under certain conditions.
   -  Fixed issue where exec command dialog would not
      save if referenced command was deleted before
      saving profile.
   -  Fixed issue where if listening was suspended,
      'reject pending speech' was selected, and a
      command was issued when the listening was off and
      then enabled mid-command, the command would still
   -  Fixed POV options not saving properly on joystick
      options page.
   -  Added some helper functionality to work with directional
      keys in DirectX mode.  Before, if you had numlock
      on and issued a command to press a directional key,
      the numpad numeric value for the same key would be
      pressed.  The helper code looks for certain elements
      and helps produce a directional key press.
   -  Column positions on profile screen now persisted again.         
   -  Saving a profile that does not involve a change to a
      spoken command phrase no longer causes the speech engine
      to be reset.  Not really a bug... not really an improvement
      either ;)
   -  Editing a command from the log that has been deleted
      no longer results in an edit screen with a GUID for the
      command name.
   -  Perform a Window function display will now set the 
      window as the active, foreground window when applicable.
   -  {TXTRANDOM} token no longer removes empty entries.      
   -  Fixed issue with listening override against a composite
      command not offsetting suffix properly, respecting
      confidence or respecting process overrides.  Basically,
      this is the code that time forgot o_O.
   -  Fixed issue {PREFIX} and {SUFFIX} tokens not
      providing values if command was overridden with,
      'Override listening if my spoken command begins with'

   -  Fixed, '{CMD_AFTER}' token getting too much text.
   -  Joystick button trigger reset to, 'Not Set' from
      command screen fixed.
   -  Fixed issue where process target was not picking up
      all processes.
   -  Fixed issue with command line parameters -profile and 
      -command not allowing proper termination of the software.
   -  First pass at quieting the DateTime exception some get on 
      the trial startup if date format is changed.
   -  Fixed sound file browse issue where having illegal characters
      in a token would cause a crash.
   -  Executing a command with no defined triggers (completely disabled,
      via drop down selection or by name) as a subcommand should work now.
   -  Fixed issue where random sounds from directory would
      not change directories when tokens are used and
      executed repeatedly with changing directory.
   -  'Hold down' time not displaying properly when
      key press type changes has been fixed.
   -  Profile edit screen, 'cancel' and, 'done' buttons
      no longer lock up if a synchronous command is
   -  Better handling of setting the text in the clipboard.

   -  Commands not executing via external or mouse when listening 
      not enabled has been fixed.
   -  Most windows will no longer be topmost
      above other applications.

   -  Fixed delete random sound from list selecting first item in the list plus
      the next item on the list.
   -  Fixed mouse scroll selection enables click duration box.  Also fixed 
      persisted values getting reset.

   -  Additional handling during app closing.	  

   -  Fixed some painting artifacts on resizable forms with grids.

   -  Fixed issue with spaces not being preserved in text replace.

   -  Mouse click delay not enabled on add now fixed.

    -  Launching and capturing STDOUT on a console app using the, 
       'hidden' attribute now hides the console app window.

    -  Shortcut output on dynamic commands no longer shows a bracket.

    -  DirectX mode and arrow keys should work when numlock is on or off now.

- New Known Issue
   -  Start/stop sounds do not play when pause is active.  Not even 
      sure when this started, but it looks like it's been around for 
      a while.


-  Improvements

   -   Added some dynamic ability to commands.
       What this does is allow for quick, dynamic 
       commands that can contain potentially optional
       parts.  To indicate a dynamic portion of your
       spoken command, simply enclose the section in
       square brackets : [  ].  Each dynamic element
       within the brackets must be separated with a 
       Here is an example : 
       To execute the command, you can now say :
       Greetings computer
       Hello computer
       Note that multipart commands are also still 
       separated with a semicolon (as demonstrated by
       adding, 'Hi' to the end) :
       With this example, to execute the command,
       you can say : 

       Greetings computer
       Hello computer
       The dynamic sections don't have to just be at
       the beginning.  They can be anywhere in the
       command.  Also, as a side-effect, if you put
       a semicolon on at the end of the selections,
       it makes the section optional :

       [Greetings;Hello]computer[how are you;]
       You can say the following to execute the 
       command :
       Greetings computer how are you
       Hello computer how are you
       Greetings computer
       Hello computer
       Note that there is a semicolon after 'how are you'
       to indicate that the entire section is optional.
       Something to consider when using this feature is
       that you can create a lot of permutations from
       very few words.  Use with care :)
       Dynamic sections also have the ability to indicate
       a numeric range.  This is indicated by putting in
       two numbers separated by an ellipsis (..).
       eject car [1..100] will allow you to say, 
       'eject car 1',
       'eject car 2',
       'eject car 3', etc.
       Using this in conjunction with the new 
       {TXTNUM:variableName} token (see below), 
       you can come up with some interesting solutions.

   -   First attempt at using wildcards around 
       full commands.  That is, allowing command 
       phrases that will execute if they are 
       contained in the spoken phrase (or are
       at the beginning or end of a spoken phrase).
       I know I've been reluctant to include this
       over the years, but I think I've found a way
       to make it not very intrusive.  Just put
       asterisks on both ends of your spoken phrase :
       '*power to shields*' to indicate, 'contains'.
       Put an asterisk at the end to indicate, 
       'starts with' : 'power to shields*'.  Put an
       asterisk at the beginning to indicate, 'ends
       with' : '*power to shields'.  So, if you
       accidentally say something like, 'Power to 
       shields, please', your command will be found
       and executed.  Use with care... lol.
       I haven't worked out all the details yet on
       how this will impact other screens, but I 
       thought I needed to get the simple stuff out
       there to see if it's even going to fly.
       Note that this is for full commands only, and
       not for prefixes/suffixes just yet.
       Command wildcards that denote, 'contains' (asterisks on
       both ends of the command) will allow for multiple expressions
       to be contained in one spoken phrase.  So, if you
       have a command named, '*rocket*' and one named '*ship*'
       you can say, 'rocket ship' and both commands will be
       executed (pretty much simultaneously... you can always
       uncheck, 'this command allows others to run at the same
       time' to process in line.  There is an attempt to process
       the commands in the order that they are spoken as well.
       The order of processing is, 'ends with', then 'starts 
       with' then, 'contains'.       
   -  I put back the ability to quickly add text to
      be typed out serially.  The new action is called, 
      'Quick Input'.  This was taken out a long time 
      back (it was called, 'Quick Input') in favor of 
      the recorder feature, since more and more folks 
      with non-English keyboards were using VoiceAttack.  
      'Quick Input' should allow for the currently-
      supported list of locales to use the feature.
      The reason I put it back is because a lot of
      folks find the recorder cumbersome for simple
      stuff.  Also, there are some games that do not
      allow the use of the clipboard paste (which is
      what I would recommend for fast text display).
      The feature simply allows you to type in text
      in the box and have it typed back.  For the
      supported locales, it also should be able to
      do the right-alt/deadkey stuff.  You will be
      able to specify the timing of the key presses
      (as always, DirectX games have a polling mechanism
      and are not event-driven when it comes to keyboard
      activity).  You will be able to specify either
      DirectX or Standard input.  Note that the
      text box also accepts tokens that will be
      replaced out at runtime.
      Non-character key indicators for Quick 
      Input are below.  So, let's say you want to add
      a tab to your Quick Input action.  Just 
      enclose the key name (TAB) in square brackets 
      and the key will be pressed : [TAB]
      Your text would look something like this :
      Hello, there.[TAB]How are you?[ENTER]
      Note: The key indicators are not case-sensitive.
      The full list is below (in no particular order):
      ENTER        - presses the enter key
      TAB          - press the tab key
      ESC          - press the escape key
      ESCAPE       - works the same as esc
      BACK         - press the backspace button
      BACKSPACE    - works the same as back

      SHIFTDOWN    - holds the left shift key down
      SHIFTUP      - releases the left shift key
      RSHIFTDOWN   - right shift if you need it
      LSHIFTDOWN   - works the same as shiftdown
      LSHIFTUP     - works the same as shiftup
      ALTDOWN      - holds down the left alt key
      ALTUP        - releases the leftalt key
      RALTDOWN     - holds down the right alt key
      RALTUP       - releases the right alt key
      LALTDOWN     - works the same as altdown
      LALTUP       - works the same as alt up

      CTRLDOWN     - holds down the left ctrl key
      CTRLUP       - releases the left ctrl key
      RCTRLDOWN    - holds down right ctrl key
      RCTRLUP      - releases right ctrl key
      LCTRLDOWN    - works the same as ctrldown
      LCTRLUP      - works the same as ctrlup

      WINDOWN      - holds down the left win key
      WINUP        - releases the left win key
      RWINDOWN     - holds down the right win key
      RWINUP       - releases the right win key
      LWINDOWN     - works the same as windown
      LWINUP       - works the same as winup
      NUM0         - numeric pad 0-9
      NUM*         - numeric pad *
      NUM+         - numeric pad +
      NUM-         - numeric pad -
      NUM.         - numeric pad . 
      NUM/         - numeric pad /
      NUMENTER     - numeric pad enter

      F1           - press F keys... F1-F24
      HOME         - press home key
      END          - press end key
      DEL          - press delete key
      DELETE       - works the same as del
      INS          - press insert key
      INSERT       - works the same as ins
      PAGEUP       - press page up
      PAGEDOWN     - press page down
      ARROWR       - arrow right
      ARROWL       - arrow left
      ARROWU       - arrow up
      ARROWD       - arrow down
      CAPSLOCK     - toggle capslock
      NUMLOCK      - toggle numlock
      SCRLOCK      - toggle scroll lock
      SCROLLLOCK   - works the same as scrlock
      PRINTSCREEN  - press printscreen button
      PAUSE        - press the pause/break button       
   -  Removed 'Stop repeating if window focus lost'
      checkbox and replaced it with, 'Stop command 
      if target window focus is lost' checkbox which
      is available whether you are looping or not.
       What this does is stop the command if you
       lose focus of the window that had the focus
       when the command was executed.  The underlying
       value that is used is carried over to the new
       checkbox making it backward-compatible with
       what was in place before.
       This feature now also has an option, 'Resume
       command if focus regained'.  This attempts to
       resume the command if you click back into the
       originally focused window ;)
   -   Added 'Play a Random Sound' action.
       Finally... a user interface to handle
       random sound files (you can still
       do random stuff with conditions if
       you want to).  This interface will
       let you choose the same options for
       each individual sound just as you 
       can for single sounds.  Also, there
       is the option for, 'suppress repeat',
       which will allow for a random list
       to seem a little more, 'random' by
       only playing each sound once.  Note
       that it's, 'suppress repeat', as it
       does not completely eliminate the
       possibility of a repeat (a repeat
       can happen once the cycle is reset,
       of course).
       'Play random sounds' also has the option to
       play from a specified directory.  Just point
       to the directory that you want to play out
       of and VoiceAttack creates a random pool
       out of all supported sound files in that
       directory.  This is useful if you have a 
       set of responses that you constantly update.
       Just put the sound files in the directory
       and there is no need to add it to the
       random list.
       Note that you can also put shortcuts (.lnk)
       to your sound files in these directories 
       and they will be used to locate the target 
       file.  Useful if you want to duplicate sounds for 
       different reasons and not want to copy the
       the whole thing.
       Note that the, 'Play random sounds' interface 
       supports multiple file edit - change the attributes
       of one or more files at once (volume, wait, 
       complete).  You can also add more than one file 
       at a time as well.

-   First attempt at dictation.  Three new actions are now included:  
        Start and stop dictation and clear dictation buffer.  All of these
        are considered, 'advanced' since there is no other supporting
        user interface, and anything in the dictation buffer must be 
        accessed via token.  The start and stop dictation actions have 
        the option to clear what is in the dictation buffer.  The clear 
        dictation action has the option to just remove the last thing that 
        was said.  As mentioned, there is a dictation buffer that gets filled 
        with each phrase you speak.  There is the usual pause that indicates 
        the end of your statement, and whatever was said will be added to the 
        buffer.  Nothing special here... you'll have to add your own 
        punctuation as you normally do with the Windows speech engine.  
        Multiple entries in the buffer are just appended to one another when
        you access the values from the {DICTATION} token.  Recognized
        commands will be omitted from the dictation buffer if you speak 
        them on their own (that is what I am testing now... the ability 
        to be able to keep dictation going and still say, 'power to shields' 
        and then resume dictation).  Since they are blocks, you can incorporate 
        them in your own commands with whatever spoken value you want 
        ('open quote', 'quote', 'begin dictation'... or all of those... lol).  
        You can incorporate your own stop and start sounds and initialize 
        whatever variables you want to or even call a plugin.  
        New users to VA will probably hate this approach, but I apologize. 
        The ugly side of this is now you will experience the joy of what is 
        the dictation ability of the Windows speech engine.  It is not Dragon.  
        Not even close.  You will say things clearly and it will miss a lot.  
        Try to speak like a robot and it seems to work a little better... o_O
        You've been warned :)  My hope is that as the Windows speech engine
        improves, this will be more useful.
        There is a new option in the Profile Options screen called, 
        'Execute a command each time a dictation phrase is recognized'.  
        Enabling this will invoke the specified command every time a dictation
        phrase is spoken.  This could be used for plugins, playing a sound or 
        for whatever you want (mostly for plugins).
    -   New replacement tokens: {DICTATION} and 
        The {DICTATION} token is quite simple.  It is replaced with a simple
        dump of whatever is in the dictation buffer.  So, if you said, 
        'This is a test of the emergency broadcast system' and then later said
        'this is only a test', the result would be 'This is a test of the emergency
        broadcast system this is only a test'.
        The other token is an attempt to offer some touchup to whatever is in the 
        buffer.  The speech recognition engine may do all kinds of heinous things
        to your text (as you will see ;))
        You can use any or all of the options listed, separated by a colon.
        So, if you simply wanted to add a period to the end of each spoken dictation
        phrase and ensure that the first character is always capitalized, you would
        use {DICTATION:PERIOD:CAPITAL}.  The above example would be rendered as :
        'This is a test of the emergency broadcast system. This is only a test.'.
        If you wanted to also make it so that a line feed is placed between lines,
        you can use {DICTATION:PERIOD:CAPITAL:NEWLINE}.  You will then get
        'This is a test of the emergency broadcast system.
         This is only a test.'.
        The options are:
        PERIOD - As said, puts a period in for you at the end of each line.
        CAPITAL - Capitalizes the first character of every line.
        LATEST - Only display the last thing you said.  In the example, you would
        get 'this is only a test'.
        UPPERCASE - Converts all characters to upper case :
        LOWERCASE - Converts all characters to lower case :
        'this is a test of the emergency broadcast system this is only a test'
        NEWLINE - Makes sure each phrase is on its own line (note that it wont
        show up this way if you write to the log... the log doesn't care about
        new lines).
        SPACEX - Replace the, 'X' with any number, and that many extra spaces
        will be placed at the end of each phrase.  The default is one space.
        So, if you use {DICTATION:SPACE4}, the rendered output will be
        'this is a test of the emergency broadcast system    this is only a test'.
        You can put the options in any order.

    -   Added some basic automatic profile switching.  You can turn this option on
        and off, 'globally' in the main options screen ('Enable Automatic Profile 
        Switching') and enable per profile in the Profile Options screen 
        ('Enable profile switching for the following windows').  To keep things
        as simple as possible, there is a text box on the Profile Options page 
        that allows you to input the name of the window of the application that 
        you want to look for.  The input for this box is semicolon-delimited so 
        you can associate your profile with more than one application.  Since 
        window titles vary depending on what you are doing, you can also add
        asterisks (*) as kind of a basic wildcard.  If you put the asterisk
        at the end of the title, the search becomes, 'starts with'.  If you 
        put the asterisk at the beginning, the search becomes, 'ends with'.
        If you put an asterisk on each end, the search becomes, 'contains'.
        No asterisks means a direct comparison (of course).  So, lets say
        you want your profile to automatically change when you switch over
        to either your desktop or Notepad.  The desktop window name (oddly
        enough) is Program Manager (I know that's weird... there's some help
        about this down below).  Notepad's window title will change depending
        on the document you are editing.  Your input would look like this:
        'Program Manager;*Notepad*' (without the quotes).  That means it will
        look for a window titled, 'Program Manager' as well as any window 
        that has a title that contains, 'Notepad' (although, I think searching
        for Notepad may only require '*Notepad' (end with)).  Hope this makes
        sense :)
        To help with finding out window titles, a new option has been added to
        the VoiceAttack Load Options screen.  To get to this screen, simply
        start VoiceAttack while holding down CTRL + Shift.  Select the option
        titled, 'Show window titles (requires 'Enable Automatic Profile Switching'
        to be checked in the Options screen).'  This will show the window titles
        in the log so you can see what VoiceAttack sees.  This will only run
        for the current session of VoiceAttack.
        I wrote like 75% of this back in the summer, and I just left it there
        since I really couldn't see it as a higher priority than other things
        on the schedule.  Then my kid was asking about it.  I think I understand
        now... lol.  Overall, it was hare-brain easy to implement, so, here
        ya go :)

     -  Added sound and tts volume offset sliders to the
        options screen.  Think of these as master volume
        controls for all your sounds/tts.

   -   Added window targets at the command and profile
       level, still defaulting to the global level that
       is on the main screen.
       To use this, simply either drop down the
       list to select a target by name, or place an 
       asterisk (*) at the beginning to denote, 'ends
       with', at the end to denote, 'starts with' or
       on both ends to denote, 'contains'.  This is
       for windows that have names that change.
       This works with the linked profiles as well, so
       you can have a profile called, 'Winamp' that
       interacts only with Winamp by setting the 
       process target to '*winamp*'.  VoiceAttack will
       find the Winamp app and set it as the target,
       while your other commands (key press and mouse
       actions) continue to be sent to wherever you
       like.  Prefixes and suffixes can have window
       targets as well, however, if both a prefix and
       a suffix have a target set, the prefix target
       will be used (may be wrong about the choice...
       we'll see how this irons out... might need to
       be the suffix... not thinking clearly... lol).
       The dropdown list can contain window names
       (or parts of window names... with asterisks)
       or the entire process name (asterisks not
       incorporated yet).  The list will show current
       window names plus any currently-used targets
       from other commands to make input easier.  You
       also have the option to turn the target on
       or off by checking or unchecking the 'enable
       process target' box.  If you are targeting a 
       particular process at a higher level, there's
       also the option to override and use the active
       window.  Hope this makes sense... A lot of 
       you have been asking for this for a while ;)
   -   Updated 'Send commands to' functionality on the
       main screen to be more in line with the process
       targets at the profile and command levels.
       Before, all you had as options were, 'Active
       Window' or some other window title.  You can
       now use asterisks around the window titles.
       The list also maintains the last ten most-
       recently-used items.  You will note that the
       process list is not refreshed on every drop
       down now.  There is an item in the list 
       called, 'Refresh this list' which will update
       the list with the latest open window titles
       and most recently used items.  There is no
       user interface to set the mru max number.
       You can set this value by going into the
       user.config settings, though.

   -   Added new action, 'Set text value to Windows clipboard'.
       This is a very basic implementation, and only doing text 
       values for now.  The value can, however, contain tokens.  
       To clear the clipboard, just leave the box blank (no 
       spaces... not trimming in case literal spaces are wanted).  
       Note that there is no, 'paste from clipboard'.  There
       are API calls to paste clipboard data which require finding
       active controls and such to do the work, however, it's 
       just as easy to do a CTRL + V key press (works in just
       about every case).
   -   Added new token, '{CLIP}' which will be replaced
       with whatever is in the clipboard (as long as the
       value in the clipboard is text, otherwise, the token
       will be replaced with a blank).

   -   Added token, '{TXTCONCAT:var1:var2}'.  This
       will concatenate the text in variable 2 to the
       text in variable 1.

   -   'Reset defaults' from the options screen
       now has the option to delete registration

   -   Updated plugin support for the new data types.
       This updates the interface for plugins going
       forward, however, VoiceAttack's plugin execution
       remains backward-compatible, so any plugins you
       are currently using should still continue to
   -   Added new token, '{TXTTITLE:variableName}'.
       Token is replaced with text variable title
       cased (VoiceAttack supported locales only).
       Example: 'war and peace' becomes 'War And 
       Peace'.  Yes... I know that's not *proper* title 
       case (at least in English), but it's as close 
       as the framework will allow without linguistic 
       rules.  Sorry, even Microsoft wont touch it ;).
   -   Commands executed by multiple joystick buttons 
       will no longer execute single-button commands.
       That is, as long as the first button down does
       not have a command associated with it.
       Example :
       A down + B down executes a command
       A down only executes a command
       B down only executes a command
       User presses A down and then B down.
       A down only will execute, since it doesn't know 
       that B down only is coming.  This is unavoidable.
       A down + B down executes.
       B down only does not execute.

   -   Updated image buttons with accessible
       names for screen readers (so they won't
       be indicated as just, 'button').
   -   Spoken command box now expands horizontally 
       with the command window.
   -   Added option, 'Single TTS Instance' to help
       with certain TTS packages (Cereproc) that have 
       an instance cap.  Select this option if
       you are using TTS and it keeps cutting out.
   -   Moved command screen right-click context menu
       'New Action' contents up one level (there
       is no longer a, 'New Action' menu item).
   -   Reordered, 'Other' context menus into more		
       logical groups.
   -   Added, 'Set Boolean Value' command action.
       Boolean values can be set to true, false, toggle 
       or not set.  When toggling, a false value becomes
       true, a true value becomes false and a not set
       value remains not set.  I added this to simplify
       the use and readability of macros (using 0 and 1
       for true/false turns a lot of folks off).
   -   Added, 'Set Integer Value' command action.  This
       uses larger integers so you can have more space to
       work.  This differs slightly from the small integer
       (previously called, 'conditions'), as you have the
       ability to compute a value.  You can add/subtract/
       multiply/divide (integer division) / modulus 
       (remainder) against an explicit value or against
       a variable or text token.  If the text token is not
       able to be converted to an int, the computed result
       will be, 'Not Set'.  When computing a value, there
       is also an option to initialize the variables to zero
       if they are, 'Not Set'.  This will save an initialization
       step (might be handy if you are incrementing, for 
   -   Added new tokens {INT:variable name} and 
       {INTFORMAT:variable name} to provide a way to
       access the new integer variables through text
   -   Updated text comparison in 'Begin conditional 
       block' to allow either a variable name or a text
       token as the source of comparison.  The previous
       function of the token being used to get the
       variable name has been replaced by this.
   -   Updated 'Begin Condition' screen to include
       boolean comparisons.  This required the layout
       of the screen to change from radio button selection
       to tab selection.
   -   IMPORTANT: To avoid confusion going forward, 
       Conditions are now going to be called, 
       'Small Integer'.  The, '{COND}' token is still 
       available for backward-compatibility.  New tokens 
       '{SMALL:variable name}' and 
       '{SMALLFORMAT:variable name}' have been added 
        (and refer to the same variables).
   -   Added Disable/Enable action to right-click menu
       of command action list.  This will allow you
       to selectively disable items.  There are no
       restrictions on this yet, and I have not tested
       how this will affect everything (like jumps,
       condition statements, etc).  I found it handy
       for testing and thought you might, too ;)
   -   Added, 'Set Decimal Value' command action.  This is
       basically all the functionality of Integers above,
       with some additional calculation methods thrown in
       (just kept adding whatever methods I could find...
       they were a no-brainer to add, so, I might as well
       add them).  You can also round the set decimal 
       value to up to 10 places.
   -   Added new token {DEC:variable name} to provide 
       access the new decimal variables through text
   -   Added, 'clear favorites' menu item to command
       screen right-click menus.
   -   Added, 'Clear Saved Values from Profile' action.
       This will allow you to selectively remove all 
       values of selected data types that are saved to 
       the profile.  This does not clear resident values
       (just the saved ones).
   -   Added three tokens :  {CAPSLOCKON}, {NUMLOCKON}, 
       {SCROLLLOCKON}.  These will have a value of "1" if 
       the lock is on and a value of "0" if the lock is off.
   -   Added new token {TXTNUM:variableName}.  This will
       attempt to remove all characters except numeric
       (0-9, ., -).  So, text that looks like, 'turn -180.2'
       will be replaced with, '-180.2'.  Note that the value
       is still text (from a token), but can be converted 
       if needed.
   -   Added new token {TXTALPHA:variableName}.  This will
       attempt to remove all numeric characters from the text
   -   Added four new mouse position tokens : {MOUSESCREENX},
       This is a text value representation of the position
       of the mouse, either in relation to the screen or the
       active window.
   -   Added new action, 'Stop Sounds' which will stop all
       currently playing sound files.
   -   Added new action, 'Stop Text-To-Speech' which will 
       stop all text to speech that is, 'speaking'.
   -   Added 'm4a' and 'aac' as acceptable sound file types.
   -   Added, 'Trim', 'Upper Case', 'Lower Case' and 'Replace'
       as options to Set a Text Variable action.
   -   Added, 'Execute' on right-click menu of profile list...
       Might help out a little when testing.  Note that it
       will show the entire command string for multipart.
   -   Added tokens {TXTUPPER:} and {TXTLOWER:} to
       return the indicated text value as all upper
       case or all lower case.
   -   Added token {TXTTRIM:} that returns the 
       indicated text value without whitespace 
       (without needing to use {EXP:}).
   -   Added token {TXTREPLACE:tokenName:from:to}
       to allow you to replace portions of a token value
       with something else.  Example:
       Token, 'myToken' value set to, 'This is a test'.
       {TXTREPLACE:myToken:test:monkey} resolves to
       'This is a monkey'.
   -   Set Text Value now has a new option to set the value
       to, 'not set'.
   -   Set Text Value now has a way to get a value
       from a URI.  This can either be a web address or a 
       file path.  Right now it has a timeout of 30 seconds.
       That will probably need to be soft-set, but we'll see.
   -   Set Text Value can now be saved and retrieved with
       the profile (persisted to disk), accessible even 
       between sessions.
   -   Set Conditional Value can now be saved and retrieved 
       with the profile (persisted to disk), accessible even 
       between sessions.
   -   Mouse set position now accepts negative numbers for 
       multi-monitor setups where the main screen is not 
       left-most...  I've been asleep at the wheel, 

   -   For fun, added, '-opacity' command line parameter.
       -opacity 75 sets the value to 75% opacity.

   -   Added, 'cut' to command list.  Don't know
       why that's been missing all this time o_O.
    -  Importing commands will now display a confirmation 
       box if any of the actions in the commands are launch
       application or kill process.
    -  Importing a profile will now display a confirmation 
       box if any of the actions in the commands are launch
       application or kill process. 

   -   Right-click menu in command action list now contains 
       all the actions, including favorites (also mouse... 
       missing for all these years... lol).
   -   Begin Conditional Block numeric condition
       value names as well as text compare
       value names can now accept tokens
       to indicate the variable name.
   -   Added, 'undo' and 'redo' to the command
       action list (CTRL + Z, CTRL + Y).
   -   Added support for duplicating multiple
       command actions (used to be just one
       at a time).
   -   Updated command list to not display
       dialog box when there are no options to
       set in the action (Start VA Listening,
       Stop Processing, Condition Else, etc).
   -   Added token, '{DICTATIONON}' to indicate
       if dictation is on or not.  If on, the
       value will be "1".  Otherwise it will
       be "0".
   -   Added, '{DATETICKS}' token to express
       the current date as ticks.
   -   Added new time tokens : {TIMEHOUR},
       {TIMEHOUR24}, {TIMEAMPM} (shows am/pm
       designation), {TIMEMINUTE}, {TIMESECOND}.
   -   Added 'favorites' feature to command
       action items.  Up at the top of each
       command action on the, 'other stuff'
       screen, you'll see a little star.  If
       you click it, it will add the action to
       favorites.  The, 'Favorites' menu item
       will show up at the top of the, 'Other'
       menu.  It will only show up if there
       are actually favorites.  The favorites
       are ordered in the order that they are
       added.  If you ctrl+click the star, you
       can clear all favorites.
   -   Adding a 'Begin a conditional block'
       action will now automatically add an
       'end conditional block'.  Since the
       end block is required, this is probably
       for the best ;)
   -   Added some date tokens (pretty self-
       explanatory) :
   -   Added 'Suppress pauses between key
       presses' option to recorder screen.
       This gives an option to allow pauses
       between the key up of one key and
       the key down of the next.
   -   Added text compare to 'Begin Condition
       Block'.  So, 'Begin Condition Block'
       is now called, 'Begin Conditional
       Block'.  In this action you now have
       the option to either compare values
       of conditions (numeric) or compare
       values of text variables.  Both types
       of comparisons work the same, however,
       the, 'Text' field will accept tokens.

   -   Added new command line parameter,
       '-toggledark' as a test.  Puts
       the main screen in, 'dark mode'.
       Calling this from the command 
       line always affects the running
       process, so, you can have a 
       shortcut on your desktop that
       just changes the running instance's
       color mode.
   -   Added log status bar in compact
       mode that shows the last log
   -   Polished up the log color icons.
       'Now with more roundness!'.
       Dark mode now has squares.
   -   Added token, '{CONDFORMAT:condition}'.
       This simply formats the condition 
       with commas for use in TTS.  This was
       the default behavior of, '{COND:condition}',
       but it has been made apparent that 
       calculating anything over 999 results in
       an error.
   -   Added, '{ACTIVEWINDOWTITLE}' token that 
       returns the active window's title.
   -   Added, '{ACTIVEWINDOWPROCESSNAME}' token 
       that returns the active window's 
       process name (what you would see in Task
   -   Added, '{ACTIVEWINDOPROCESSID}' token 
       that returns the active window's process
       id (most will never use this... just 
       included because it was nothing to do so).       
   -   Added, '{ACTIVEWINDOWWIDTH}' token that
       returns the active window's width.
   -   Added, '{ACTIVEWINDOWHEIGHT}' token that
       returns the active window's height.

   -   Added, '{ACTIVEWINDOWTOP}' token that
       returns the active window's top (Y-
   -   Added, '{ACTIVEWINDOWLEFT}' token that
       returns the active window's left (X-

   -   Added, '{ACTIVEWINDOWRIGHT}' token that
       returns the active window's right
       (left + width).

   -   Added, '{ACTIVEWINDOWBOTTOM}' token that
       returns the active window's bottom
       (top + height).

   -   Added new action set, 'Perform a window
       function'.  This will allow you to target
       a particular window and display 
       (normal, minimize, maximize, etc), close,
       move, resize or change its title text.
       You can specify how much time to wait for
       the window before VA gives up.
       Changing the title allows you to name 
       windows how you would like to search for
       them, especially if you have multiple 
       instances that you want to keep track of.
   -   Comments can now be blank so you can add
       some spaces between blocks in your 
       commands (aesthetics).
   -   Added some additional filter buttons to the
       bottom of the profile edit screen to aid
       with the HUGE profiles out there.  There
       are six filter buttons : hide commands with
       disabled, 'when i say' attribute, hide 
       commands with disabled, 'when i press
       button' attribute, hide commands with
       disabled, 'when i press keys' attribute,
       hide prefix commands, hide suffix commands,
       hide full commands.  They just toggle on
       and off.
   -   Sending keys/mouse clicks to windows with
       popup dialog boxes should be good to go now
       (not sure why I didn't see this four years
       ago o_O).
   -   Added two new tokens, '{CMD_BEFORE}' and
       '{CMD_AFTER}'.  When a wildcard is used in
       a spoken phrase, these can be used to get
       everything else in the spoken phrase.  
       {CMD_BEFORE} is anything before the wildcard
       phrase.  {CMD_AFTER} is anything after the
       wildcard phrase.  For example, if using,
       '*rocket*' as  your wildcard phrase and you
       say, 'i am going for a ride in my rocket ship'
       {CMD_BEFORE} will contain, 'i am going for a 
       ride in my' and {CMD_AFTER} will contain 
   -   Added new token, '{TXTLEN:valueName}'.  This
       will return the length of the text variable's
   -   Added 'Convert Text/Token' to 'Set a Condition 
       Value' action.  If the text/token can be 
       converted to an int16 value, the value 
       will be used, otherwise, the value will be,
       'Not Set'.
   -   Added new token, '{EXP:expression}'.
       This is used for some simple math and also
       as a stopgap for the text comparison user 
       Everything after the colon is evaluated, so
       if you use '{EXP: ((5 +  5) - 2) * 10}' the 
       result will be '80'.  The expression token
       also accepts tokens.  So, if you have a text
       value myText1 and it is set to '100' and a
       condition value myCond1 that is 200, you can
       have an expression of, 
       '{EXP:({TXT:myText1} + {COND:myCond1}) * 2}'
       that results in '600'.  Might be biting off
       a little bit too much here, but I'd like this
       to succeed :) Note that the result values can 
       be decimal values when dividing.
       Accepted arithmetic operators :
       +, -, * (multiplication), / (division),
       % (modulus).
       Accepted comparison operators :
       =, <, >, <= (less than or equal), >= (greater 
       than or equal), <> (not equal).  These can
       be used for numbers as well as text (text
       comparisons have to do with alphabetical order
       and not length).
       You may also use, 'And', 'Or', 'Not':
       {EXP: ('cat' = 'dog') And Not (20 = 30) } 
       {EXP: ('cat' = 'dog') Or (20 = 30) }
       {EXP: Not ('cat' = 'dog') }
       You can use, 'LIKE' as part of text comparison
       expressions.  The text that you are comparing to
       needs to have asterisks in the places that they
       need to be (wildcards).  Asterisks around the text
       indicate, 'contains'.  Asterisks at the end
       indicate, 'starts with' and asterisks at the 
       beginning indicate, 'ends with'.  No asterisks
       indicate exact match.  Text comparisons are
       not case sensitive.
       Note that the text parts need to be between 
       single quotes (this includes tokens) :
       {EXP: 'dump cargo' LIKE '*cargo*'} results in
       '1'.  If your text contains single quotes, they
       need to be doubled up to use in expressions:
       {EXP:'catcher''s mitt' = 'pitcher''s mitt'} 
       You can concatenate text by using, '+' :
       {EXP: 'welcome' + ' ' + 'captain' } evaluates 
       to 'welcome captain'.
       You can use, 'TRIM', 'SUBSTRING', 'LEN' and, 
       'IIF' (immediate, 'if')).

       TRIM removes any blank spaces around text :
       {EXP: TRIM('  my trimmed text    ') } evaluates 
       to 'my trimmed text'

       SUBSTRING(start position, length) gets just 
       the portion of the text you are wanting:
       {EXP: SUBSTRING('let the good times roll', 9, 4) } 
       evaluates to, 'good'. Note that the start is 
       1-based (not zero-based).

       LEN gives the length of the text:
       {EXP: LEN('let the good times roll') } evaluates 
       to 23.

       IIF(expression, true part, false part) allows 
       you to evaluate an expression and get one of 
       two values depending on the result:
       {EXP: IIF('cat' = 'dog', 10, 20) } evaluates 
       to, '20'
       {EXP: IIF('cat' <> 'dog', 10, 20) } evaluates 
       to, '10'
       myCondition1 is 100 and myCondition2 is 200 :
       {EXP: IIF({COND:myCondition1} > {COND:myCondition2}, 
       'Blue', 'Green') } evaluates to, 'Green'.
       If your expression results in 'True' or 
       'False' the result will be replaced with '1' 
       for true and '0' for false (for use in conditions).
       {EXP:5 < 6} will result in '1'.
       Note:  If you try to stuff a decimal value 
       into a condition, the condition will be, 
       'Not Set'.  Also, if the value goes out of range
       of the condition, the condition will be, 'Not
   -   Exposed -command command line argument to execute
       a named command.  If a VoiceAttack process is 
       already running, the running process will execute
       the command.  Note that double quotes are needed
       if your command name has spaces in it.  Command
       names are not case-sensitive.
       -command test  (runs command, 'test')
       -command "my test"  (runs command, 'my test')
       If the command does not exist in the current
       profile, the log will show you the error of  your
       ways ;)
   -   Killing an individual command now kills the
       playing sounds for that command.
   -   Killing an individual command now kills the
       playing TTS for that command.
   -   Reworked the, 'Other' button on the command
       screen.  The long dropdown list has grown
       too large, and since more stuff is on the
       way, something needed to be done.
       Now command actions for, 'Other
       Stuff' can be accessed through flyout menus
       rather than just through one big dropdown
       list.  The full dropdown list is still 
       available once you make your selection,
       or, if you press CTRL at the same time you
       click the, 'other' button, you can see the
       list as it was.  
   -   Added 'condition else' action that allows control
       of your macro to jump to this point if a condition
       is not met. Been needing this for a long time.
   -   Added command markers.  This indicates a point
       in the command action list that can be jumped to
       with the new, 'Jump' action.  Markers can be named
       whatever you want, but must be uniquely named
       within the command (if markers happen to be named
       the same in a prefix/suffix situation, the first
       marker will be jumped to).
   -   Added, 'Jump' action to commands.  You can now
       specify to jump back to the start of the command,
       to the end of the command or to a jump marker.
       To jump to a marker, you just specify the name
       of the marker you created in the combo box.
       When the command execution reaches the jump point
       and a marker is indicated, the execution continues
       where the marker is located (can be located anywhere
       in the command).  Markers can also be used in prefix/
       suffix situations (for instance a jump in a suffix
       should find the marker in a prefix, jumping to the start
       of a command from a suffix will go to the top of the prefix,
       etc).  Note that when using a jump to exit the command, 
       this does not terminate the command.  Any running subcommands 
       will still continue to process.  Might make that an
       option later.
   -   Added, 'Wait until the launched application
       exits before continuing' option to the 'Run
       an Application' action.  Selecting this option
       will cause the running command to pause until
       the launched application closes.
   -   Added, 'Screen Coordinates' and, 'Application
       Coordinates' to the mouse action screen.  This
       will allow you to choose a position of the mouse
       cursor as it relates to the entire screen or
       to the application that is in the foreground.
       If the coordinates are out of bounds,
       the cursor is moved to the boundary.
       (The mouse location capture utility has been
       updated to respect either screen or 
       application coordinates).
   -   Added simple, 'Category Grouping' to profile
       edit screen to cut down on some clutter.
       Button to enable/disable is at the bottom
       of the profile screen.  Clicking the group
       header will expand/collapse the group.  You
       can also hit enter when the header is selected
       to expand/collapse.  If you hold down CTRL at
       the same time you expand or collapse, you can
       expand or collapse all.  Renaming categories
       is now easy to do en masse... just right click
       on the category group and select, 'Rename
   -   Added a list filter box at the bottom of the
       profile screen to filter down commands.  Pretty
       straightforward. If you just start typing in 
       the box, the command list will be filtered where 
       any field contains the typed text.  Of course,
       this does not affect the underlying data.
   -   Added, 'Add a Comment to Action List' action
       to, 'Other stuff'.  Just add some text and
       the comment will show up in italics with
       a slightly lighter color in the command 
       action list.  This action doesn't do anything
       other than show you your own notes in the
       command action list.
    -  Added option, 'Reject Pending Speech' option
       to options screen.  This is the UI version of 
       the -bypassPendingSpeech command line argument.
       When you turn off, 'listening' in VoiceAttack, 
       you can choose how to handle what happens if
       you are speaking at the same time.  When this 
       option is not checked and you turn off, 
       'listening', VoiceAttack will let you finish 
       the phrase you already started before it stops 
       processing your commands.  Checking this box 
       will stop command processing immediately, 
       including the phrase you are speaking.
    -  For fun, if you add a .wav file called, 
       'sys_on.wav' and/or a file called, 'sys_off.wav'
       to the same directory that VoiceAttack.exe
       is located, VoiceAttack will use those files
       for its on/off sound effect (listening on/off,
       joysticks on/off, etc). (Of course, you 
       noticed this must be a valid .wav file... if 
       an error is encountered, the sounds are 
       reverted back to the default sounds).  This
       was almost no code, so I just left it in ;)
       Also, if you add a file called,
       'header.png' to the VoiceAttack.exe folder, 
       the header bar on most windows will use that 
       image as the background, tiled.  Not sure how 
       this will look for you, but I tried it with
       an image with 500 pixels and and image with 
       5 pixels and it seems alright.  Your milage
       may vary, of course. Make sure your image
       jives with the icon colors and header text... 
       or you wont be able to see them (again... 
       you noticed this must be a valid .png file,
       however, I tried renaming a .jpg file to
       header.png and it worked... lol).  If an
       error is encountered, it just reverts to the
       original black.

   -   Added a mass update feature to the Edit Pause
       screen.  Note that its on the Edit screen.  You
       can mass update pauses at the command level and
       at the profile level.  How this works is that any
       command action that has a duration that matches the
       original duration will be changed to match the
       updated duration.  So, lets you have a bunch of pauses
       that are 0.1 second in your profile that you want to
       change to them to 0.2 seconds.  You edit one 
       of them and change it to 0.2 seconds.  If you choose
       the mass update option to alter the profile, all the
       pauses that are 0.1 second will be changed to 0.2 
       seconds (no other ones will be touched).  Some folks
       use a standard pause time for certain things.  This
       will help to avoid changing all pauses to a single
       You can undo a mass change from the command level
       by pressing Cancel on the Command Edit screen.
       To undo a profile-level update, you will need to
       hit Cancel on the Profile Edit screen.

   -   Added a mass update feature to the Edit Keypress 
       screen.  Again, note that its on the Edit screen.  
       You can mass update key presses at the command level
       and at the profile level.  When you select the,
       'Mass Update' option and select the scope (either
       command or profile) any keys that match the original
       keys will be changed to the updated value.  This
       will also include the duration (if there is one)
       and the input mode.  Note that the mass update 
       option becomes disabled if you try to change the
       action type (from key down to key up, for example).
       You can undo a mass change from the command level
       by pressing Cancel on the Command Edit screen.
       To undo a profile-level update, you will need to
       hit Cancel on the Profile Edit screen.

    -   Added ability to resize the command screen.  This
        required the removal of the advanced/basic view
        button (+/-) in the top-right corner.  Not sure
        if that will even be missed.  Command screen
        can be resized by dragging the bottom-right corner.
        Still need to work on flicker/painting, but it
        seems to be ok so far.
    -   Added support for FLAC audio files.  Make sure the
        FLAC codec is installed by going here :
    -   Added, 'Window Style' to application launch action.
        Standard choices are, Normal (default), Minimized, Maximized
        and Hidden.  Note that these only work if your target app
        supports them.
    -   Added new option, 'Recognition prefix exclusions'.  This is a semicolon-
        delimited list of values (the default is, 'if;but;the').  Sometimes
        when we speak commands there are ambient noises.  You might breathe or
        make a, 'pop' noise.  These noises are sometimes interpreted as words.
        For instance, if you have a command called, 'power to shields', you 
        might see it come up as, 'Unrecognized: if power to shields'.  This is
        because the speech engine interpreted the, 'if' from some kind of noise
        it picked up (mostly breathing).  For a long time, VoiceAttack has filtered
        out some words ('if' and 'but').  This doesn't work well with non-English
        speakers and they are hard-coded (of course).  This option lets you pick
        what words to use.  Hope this makes sense...
    -   Added option to check for updates on startup... if that's a real 'feature'...
        lol.  Only gives you a message box if there is actually an update.
    -   Added, 'orange' as a Write to Log icon color... just for fun.

     -  Added, 'Disable profile initialization commands' to
        Load Options screen (ctrl + shift on VA startup).
        Also added proper documentation for this screen
        in help file.
-  Bug Fixes

     -  Fixed export/import issue with profiles that
        contain values in 'Execute a command each time
        a phrase is unrecognized' or 'Execute a command
        each time this profile is loaded'.

    -   First stab at quelling app exit exceptions.
    -   Fixed the numpad enter issue that's been around FOREVER.  In DirectX mode,
        you can select either the alpha keyboard enter (Enter) or the numpad enter
        (Num Enter).  The way you need to select the numpad enter key is through 
        the Extended Key Chooser screen (the icon is a small keyboard on the right
        side of the 'Edit/Add a keypress screen).  The reason is because normal 
        Windows forms do not distinguish between the two enter keys.

   -   Fixed some font issues on several screens.
   -   Fixed issue with calling command by name in a 
       linked profile not working properly.
   -   Fixed bug in kill process that would prevent some
       apps from being terminated.

   -   Fixed issue where prefixes would sometimes end up
       as full commands.

   -   Fixed bug with delete of commands not allowing
       subsequent deletes without selecting another

   -   Optimized composite command (prefix/suffix) 

   -   Fixed registration screen not allowing
       registration... lol.  At some point I 
       was in the middle of creating a better
       error message & never finished the
       process.  All better now ;)

   -   Fixed some issues with extended keys.
   -   Fixed issue with nested commands not
       executing if disabled.

   -   Fixed issue with empty action sequences
       not stopping properly when included in a
       loop that repeats indefinitely.

   -   CTRL + V pasting in command action list
       without copying anything no longer crashes
       the application.

   -   Copy selected as text no longer crashes

   -   Updated DirectX mapping for some keys to be the proper
       mapping o_O.  
   -   Fixed some DirectX extended key issues.     
   -   Fixed joystick disable not working in some cases.
       Well... any case other than the global

   -   Fixed circular reference issue in some cases
       with execute command children that also execute

   -   Fixed, 'buttons' column not showing properly
       in profile screen.


-    Improvements

     -  First pass at joystick integration in VoiceAttack.
        You can now assign the buttons on up to two devices to 
        control features such as command execution and start/
        stop listening.  Each device can have up 128 buttons, plus
        up to four POV (hat) controllers.  VoiceAttack will treat 
        each pov as a set of switches that can have 1, 2, 4 or 8 
        positions (they will display as POV 1-8, and act just like
        pressing buttons).  For the 2 direction switches, you
        can choose either up/down or left/right.  There is also
        two-button modifier support which can be cross-stick (eg, 
        press button 1 on joystick 1 plus button 5 on joystick 2
        will execute a macro).
        You will find this feature in pretty much every place that 
        you'll find keyboard shortcuts (including profile override).  
        To turn on joystick support, just go into the options screen 
        and click on the, 'joystick options' button.  Full documentation
        is included down in the .pdf if it's not obvious as to 
        what is going on.  You'll notice in the command screens you
        have yet another checkbox labeled, 'when i press joystick 
        button'.  This is where you can assign your buttons to your
        commands.  There are two new, 'other' actions:  enable/disable 
        I didn't implement a, 'stop all commands' as global
        feature, since there is already a command action that
        does the same thing.  If this comes up as a need later,
        we can work it out then :)
    -   Added, 'Wait until tts is finished before continuing'.
        This will hold up the executing command until the
        speech finishes (Useful for prompts).

    -   Added, 'TTS can complete other tts' feature to 
        complete any other executing TTS.  Note that any TTS
        marked, 'wait til finished' will be completed and
        execution will resume in that command.  Use with
        Adding the, 'wait' feature has added the need to have
        multiple instances of TTS (due to threading).  This, 
        coupled with the ability to stop all processes (and 
        also stop any executing tts) has now made it to where multiple
        TTS instances can run at the same time.  This may
        cause some to have to redo their profiles somewhat, but the
        requests for having a, 'wait until finished' come up
        a LOT.  The, 'interrupt' feature was added in case that gets 
    -   Added, 'Wait until sound is finished before continuing'.
        This will hold up the executing command until the
        sound file finishes playing (Useful for prompts). 

    -   Added, 'This sound can complete other currently-playing
        sounds' feature to complete any other playing sound file
        Note that any sound that is playing and is marked, 'wait 
        til finished' will be completed and execution will resume
        in that command.  Use with caution.
        Adding the, 'wait' feature has added the need to have
        multiple instances of sound players loaded (due to threading).
        This, coupled with the ability to stop all processes (and 
        also stop any executing sounds) has now made it to where 
        multiple sound players can run at the same time.  This may
        cause some to have to redo their profiles somewhat, but the
        requests for having a, 'wait until finished' come up a LOT.  
        The, 'interrupt' feature was added in case that gets 
        *******Isn't copy and paste great? :)
        NOTE: If you are using, 'Force Legacy Audio' or have removed
        your Windows Media Player components, these features will not
        be available to you (a warning will be given in the log to 
        indicate this when encountered).        

    -   Updated command edit to allow for multiple
        actions to be selected and manipulated at once.
        Ctrl + A selects all, holding down shift allows
        for multiple items to be selected, holding down
        ctrl will allow for you to pick non-contiguous
        items, etc (just like a normal list box... lol).
        You can move groups of items (even non-contiguous
        items) up and down, delete, copy and paste
        (within the same command or even within another
        command in another profile).

    -   Added, 'copy all as text' to command list.  This
        should help showing command actions be a little easier
        than typing or exporting profiles.
     -  Added 'Copy Selected as Text' for sharing
        just portions of your commands.

     -  Added option to stop a repeating macro from 
        executing if the active window loses focus.
     -  Added X,Y input boxes for mouse, 'move to'.

     -  Added support for .ogg.  You will need to make
        sure you have a codec for it in Windows Media
        Player in order to actually hear the sound.
        (The codec can be found here :  Note, this will only
        work in non-legacy mode (just like .mp3 and 
     -  Added new token {TXTURL:textValueName}.  This works
        just like the {TXT:textValueName} token, except what
        you get back is the value URL encoded.  Also, if the
        value is not set, you will receive a blank value instead
        of a url encoded, 'not+set' :)	        
     -  Added the ability to execute a command on profile 
        selection.  Whenever a profile is chosen (even on
        VoiceAttack startup) and this option is set, the
        selected command will be executed.  Some will want
        to use this to play a sound (or tts).  Some may
        want to use this to initialize stuff.  A log message
        is written to remind you that this is going on :)
     -  Added an unrecognized command, 'catch all'
        command that can be selected from the profile 
        overrides screen.  If a command is selected and an
        unrecognized phrase is encountered, this command
        will be executed.  The {CMD} token will be overridden
        with the unrecognized value (if you want to do anything
        with that value... say it back to you with TTS, pass
        to a plugin, whatever).  Outside of that, it works
        just like any other command (including the confidence
        level).  Use it to play a sound (which is what I'm sure
        it will be used for the most... lol).
     -  Added advanced feature, 'Execute Another Command by Name'.
        In the, 'Execute Another Command' action screen, you can
        now either pick another command from a dropdown list or
        you can enter the name of a command to execute in the
        provided text box.  The text box can contain replacement
        tokens for how ever you want to use it.  This is designated
        as an, 'advanced' feature since there is limited loop 
        checking performed.  If a full command name exists, a check
        will be made.  If the command can not be found (with or 
        without tokens) there is no loop check.  This can easily
        freeze and/or crash VoiceAttack.  You've been warned :)
        Also, if you are trying to execute a multipart command by
        name, you can pick any one of the commands and it will
        be used (for instance, if you have a multipart command
        labeled, 'test;test all;test something', you can just
        put, 'test' in the box.        
    -   Confidence levels are now exposed to the user for
        selective execution of commands.  When the speech
        engine recognizes a phrase, a confidence score is
        given based on how accurate the speech engine thinks
        it was at recognizing.  You can now indicate that a 
        minimum score must be met in order to execute commands.  
        This value can be set in the options page as a 'global'
        minimum, at the profile level as an override and default
        for all commands in that profile, or, at the command 
        itself (which overrides everything).  If a phrase is
        recognized but is rejected due to being below this
        threshold, indication will be shown in the log.
        If the confidence level is used in composite commands
        (prefixes/suffixes), if either of the parts is using
        the confidence level, the derived command will use
        that level.  If *both* parts are using the confidence
        level, the maximum of the two will be used.  

    -   Included support for mouse back and forward buttons
        in the mouse action screen.  You can now click,
        double-click, hold down and release the mouse forward
        and back buttons just like you could the other three.
    -   Added new token {TXTRANDOM:value} to allow
        for the simple randomization of text within a token.
        For example, TTS could be set up to say, 
        'I love {TXTRANDOM:food;animals;jewelry}' and the result
        would be, 'I love animals' or, 'I love food' or, 'I love
        jewelry'.  Note that the, 'value' portion can be
        another token, however, if you want to randomize
        randomized tokens, I might suggest using text values
        to store each part (may or may not work like you want
        it to otherwise... winding down an endless permutation
        trail for testing at this point).        

-    Bug Fixes

     -  Removed code to release modifier keys on kill
        command to avoid any unpleasantness.  I guess 
        this isn't technically a bug, but it's definitely 
        not an, 'improvement'.        
     -  Fixed bug where -listeningoff command line parameter
        would prevent startup command from executing.        

      -  Fixed an issue where the key passthrough was not
         staying set for some hotkeys.



-    Improvements

     -  First attempt at what are being called, 
        'conditions'.  Conditions are basically numeric 
        variables that can be set by the user.  These 
        values can be checked to alter the flow of command
        actions.  There are three new screens to support
        this new feature set : Set Condition Value, Begin
        Condition Block and End Condition Block.
        Use the Set Condition Value to set a value to
        either an explicit value, a random value, an 
        incremented value, a decremented value or a 
        value contained in another condition.  There is
        also an option to clear an existing value
        (helpful for creating toggles or just getting
        rid of a value).
        To conditionally alter the flow of command actions,
        you can surround the actions with Begin and End
        Condition blocks.  The Begin Condition block 
        checks the condition value, and if the condition
        is met, action execution is allowed to continue.
        If the condition is not met, action execution
        resumes after the corresponding End block.
        There is an opportunity in the End block to 
        exit the command if the condition is or is 
        not met.
        A tiny bit more information is available in
        the VoiceAttack help document, under, 'Other
        Stuff' screen.
     -  First pass at plugin support for VoiceAttack.
        To invoke an external plugin, you will use
        the, 'Execute an External Plugin Function'
        command action.  Too much to explain here...
        you'll have to look at the documentation or
        follow along in the VoiceAttack Google group.

     -  If you hold down CTRL + SHIFT when VoiceAttack
        starts, you will see the new load options 
        screen.  Right now there are only two options:
        disable plugins and reset all VoiceAttack
        settings (works just like clicking the, 
        'reset settings' button on the options page).
        The options on this page are considered before
        VoiceAttack loads, so, disabling plugin support
        from here will prevent plugins from actually
        initializing.  More stuff later...  maybe...        
     -  Added a button to profile screen to toggle 
        between expanded and consolidated view of
        multipart commands.
     -  Added three new tokens for use in Play a Sound
        and Run an application actions.  The new tokens
        are : 
        {VA_DIR} -  VoiceAttack install directory.
        {VA_SOUNDS} - VoiceAttack Sounds subdirectory
        (contained in the VoiceAttack install directory).
        {VA_APPS} - VoiceAttack Apps subdirectory
        (contained in the VoiceAttack install directory).
        The Sounds and Apps directories are created by
        the installer.
        If you have sound files that you are wanting
        to share, you can keep them in relatively the 
        same place without having to alter your profiles.
        For example, lets say you create a folder 
        called, 'My Sounds' in the VoiceAttack\Sounds 
        folder to hold your sounds.  To access a sound
        file in that directory, you would put 
        {VA_SOUNDS}\My Sounds\someSound.wav.  If you 
        export the profile, the virtual path goes with it
        This was built to help some of the users that
        are building sound packs for various games.
        This is an evolving thing... it may even be
        user-configurable by the end of this.
        NOTE: The location of the VA_APPS and VA_SOUNDS
        tokens can now be set in the options screen.

     -  Added Set Text Value command action for use with
        things like text-to-speech.  Just like conditions,
        you can use whatever name you want.  You can
        set the value explicitly (myTextValue = 'Some text')
        or, you can set a text value to the same text as
        another text value (just like Conditions).  Also,
        just like conditions, the text values are at the
        application level and are available (and modifiable)
        between profiles.  The text values themselves can
        contain other tokens that are replaced at runtime.
        NOTE:  When setting a value explicitly, you may
        also use any available tokens and they will be 
        replaced at run time.
     -  To support the new text value, two new tokens have
        been added :  {TXT:valueName} and 
        The valueName portion is not case-sensitive. The
        defaultValue portion can be used in case the
        text variable is not set.  Just put whatever value
        you want in the defaultValue portion and, if the text
        value is not set for that variable, the default value 
        will be used.  More often than not, you will be 
        using {TXT:valueName}, but there will be times when 
        just having a default value in place when the value 
        has not been set will be handy.        

     -  Added new command action, 'Write to Event Log'
        which will allow you to specify a tokenized 
        (or not) value, plus indicate the color of the
        indicator.  This will be useful for inspecting
        your values.  Even though it's not technically
        an, 'advanced' feature, it will probably only
        be used with the advanced features.
     -  Added token to TTS to read current profile name:
     -  Added token to TTS to support conditions:
        {CONDITION:theConditionName}.  This will read the value
        in the condition.  Useful for me, at least, to 
        debug... left it in just in case you might want to
        use it for something.
        Note : The help file says something else, but it is
        currently still {CONDITION:theConditionName}.  
        Ultimately, whatever is in the help file will be 
        what is used since it is shorter.
     -  Added {PREFIX} and {SUFFIX} tokens to be used
        in composite commands.  If you have a composite
        command, the {PREFIX} token will be replaced
        with only the prefix part of the command, 
        while the {SUFFIX} token will only be replaced
        with the suffix part (to access the whole command,
        continue to use {CMD}).  The tokens can be present
        in either the prefix or the suffix commands...
        if that makes sense o_O.        
     -  Execute external plugin context value now accepts
        tokens (fwiw).        
     -  Added, 'Rate' slider to TTS.  Fun somehow... I don't
        know why that wasn't in there.
     -  Stopping command processing will now attempt to 
        stop any text-to-speech that may be being read.
     -  Added, 'Duplicate' feature to command action list.
        Another thing I thought had been done already.
     -  Changed the runtime permissions from asInvoker
        to highestAvailable to see if VoiceAttack can
        avoid having to be set to run as administrator
        all the time.  I didn't want to do this, but
        it has become painfully obvious that this has to
        be done for a lot of people.  Hoping this doesn't
        enrage everybody else due to the warning messages
        (my guess is that anybody that gets the messages
        will just run VA as administrator anyway).                

     -  Browsing for sounds now looks in the folder
        you had last selected a file.  Added the
        ability to hold down ctrl to go directly to
        VA_SOUNDS (kind of a hidden feature... description
        in tool tip).  If the selected sound file is
        within the VA_SOUNDS root, the {VA_SOUNDS} token
        will be automatically replaced in the text box.

     -  Allow for commands indicated as disabled for
        shortcuts and, 'when i say' to be executed
        as subcommands.

     -  Touched up registration screen to be less 
-    Bug Fixes

     -  Second pass at patching the dead/grave/deaf
        key causing double marks (��  ^^) on a single
        press.  Sorry, my European friends...  I'm
        trying!  There's a balance I'm trying not
        to disrupt down below... lol

     -  Fixed issue with email registration accepting
        a, '+' in the email address.        

     -  Fixed an issue where linked profiles could not execute
        subcommands if the subcommands were located in the
        linked profile o_O        

     -  Fixed issue when editing a command with no
        headset plugged in may cause VoiceAttack to 

     -  Fixed {CMD} token to work properly with multipart
     -  Fixed shortcuts being disabled in a command when
        the spoken phrase is disabled (again).

     -  Fixed shortcuts not working when switching
        between profiles.
     -  Fixed compact mode screen corruption when
        starting VoiceAttack as minimized.
     -  Play sound preview now checks to see if the
        file exists (as a better indicator for
        token replacement).
     -  Fixed import export duplicate comparison
        issue when using composite commands
        (prefixes/suffixes) with groups.
     -  Fixed issue where profile override would
        invoke on, 'when i say' even if the command
        was disabled.

     -  Installer now checks for .net framework
        v4 and warns appropriately.
     -  Fixed tab order in some of the, 'other stuff'
        screen controls. 

     -  Fixed some subcommand/multithreading issues.        
     -  Fixed, 'stop listening' button from showing
        incorrect status when there is pending speech.   
     -  Fixed import export duplicate comparison
        issue when using composite commands
        (prefixes/suffixes) with groups... for real
        this time (I think).  Kill commands should
        now be able to be exported and imported 
     -  Added code to keep prefixes and suffixes
        from filling up your, 'execute another command'
        and, 'kill command' dropdowns.      
     -  Tooltips on, 'other stuff' screen were an outright
        mess.  Took a spin at cleaning them up.

     -  Fixed an issue with modifiers being only available
        as a toggle in the profile-level override hotkeys 
     -  Fixed an issue with changing/importing profiles while
        no audio connected.      


-    Improvements

     -  Added first round of referenced profiles.  In
        the profile options, you can now select one
        other profile to, 'include' with your profile.
        Any profiles referenced by the referenced profile
        will be included as well.  
        Some notes on this :  
        Exporting your profile will not maintain this 
        All commands in the selected profile will override
        what is in the reference profile.  If the 
        referenced profile references a profile, *ITS*
        commands will supersede those in the profile
        it references (and so on up the line).
        Keyboard shortcut combinations are NOT overridden
        if they exist in commands with different names.  
        If you have a combo in one profile and it also
        exists in the referenced profile (with different 
        names), BOTH will be executed on key press.  This
        is by design, since an overridden key combo is 
        not quite as evident as the spoken commands.
        Executing both will show in the log and adjustments
        can then be made by the user.
        The override listening command in the selected 
        profile is the only override (the overrides in
        referenced profiles are not considered).
        So, if you have, 'Computer' as the listening
        override in your selected profile, and, 'Sara'
        in your referenced profile, all commands will
        respond to, 'Computer' as the override.
        When viewing/editing your profile, you will only 
        see the selected profile.  There is no, 'merged
        view'.  This is by design to avoid confusion.
        To view and edit the referenced profile, you 
        must switch to that profile.  Not going to 
        build that interface any time soon.
        You *can* have profiles that point at each
        other (and not create a circular reference...
        lol).  This was done so that you could
        jump back and forth between two profiles and,
        depending on the selected profile, override
        the other... hope that makes sense.
        Commands disabled in the selected profile but
        are not disabled in the referenced profile are
        treated as not overridden.  That is, if you have
        a command called, 'test' in the selected profile
        and it is disabled (both hotkey and voice command
        are unchecked), and there is a command called,
        'test' in the referenced profile that is not 
        disabled, the, 'test' command in the referenced
        profile is then active.  Since there is no way 
        in the UI to indicate, 'do not override', this 
        is the only current way to do this.
        At some point, there *may* be multiple includes,
        but we need to wait 'til the dust settles on
        this one first.
     -  If you add semicolons between phrases
        in the, 'Say Something With Text to Speech'
        feature, VoiceAttack will randomize which
        phrase to use.  Kind of a hidden feature :D
     -  Added time tokens to TTS text.  If TTS
        encounters, '{TIME}' in its text, it 
        replaces it with the current time read
        as a 24 hour clock.  '{time}' (note all
        lower case) will read as a 12 hour clock.
        Example (with random time reading) :
        The time is now {time};It is now {TIME};{time}
     -  Added {CMD} (upper case only) which reads
        the current command name.
     -  Added {RANDOM:1:100}.  This will generate and
        say a random number between some low number and
        some high number (inclusive).  The example
        shows rolling between 1 and 100.

     -  'Other' screen now remembers the last
        action you selected.
     -  Export to html now remembers what columns you
     -  If a start listening or stop listening command
        is issued and a, 'play a sound' or, 'say something
        with TTS' is anywhere in the action list for
        that command, the start and stop listening sound
        effects are muted.

-    Bug Fixes

     -  Fixed an issue where when changing profiles with
        composite commands that contain additional
        actions would cause a black hole... O_o

     -  Disabled the ability to copy commands from
        one profile to another when the source command
        contains a subcommand (either execute or kill).
        This would get all kinds of hairy (and the result
        would never work), so it is disabled for now.
        Also added a confirmation for the delete of 
        commands that are referenced in other commands.
     -  Better handling if no speech engines are installed.
        This was made evident in Dutch versions of Windows
        where the only speech engine available was English.
     -  Fixed issue with listening overrides not working at
        all with prefixes and suffixes.  For example, if your
        command override is, 'computer' and you have a prefix
        of 'fire' and a suffix of 'weapon 1', you can now say
        'computer fire weapon 1' when the listening is off.
     -  Better validation of multipart phrases.
     -  Fixed issue where key press, 'hold down for x seconds'
        input box was not responding to the numeric keys on the
        alpha keyboard.
     -  Fixed issue where commands could not be disabled if both
        'when i say' and 'when i press' check boxes were not 
        checked.  Effectively, you have to have at least SOMETHING
        in either the 'when i say' text box or have some key presses
        selected in the, 'when i press' section.  If you have nothing
        in either, the command can not be saved (ok button will
        not be enabled).


-    Improvements

     -  VoiceAttack now requires the .Net
        Framework v4.0 to run (version 3.5
        is no longer supported).

     -  Added optional prefix/suffix group.
        This is a quick way to isolate your
        prefixes and suffixes so that they will
        only work with each other.  You can
        now have a prefix of, 'eject car'
        and a suffix of '88' where the commands
        can do something totally different
        than if you had a prefix of, 'mute
        car' and a suffix of '88'. 

     -  Added keyboard layout option.  This defaults
        to auto-detect the current user's keyboard layout
        if it is available (no more # sign over the 3 key
        for our friends in the UK).  More layouts will
        be added over time.  If no matching layout is found,
        the US layout is used (which is what 
        VoiceAttack has been doing all along).
        Note: To save confusion, this does not actually
        change the output.  It merely changes the display
        within VoiceAttack to give a better idea of what is 
        going on in regards to key presses and log entries.

     -  Added, 'Do not show unrecognized items' to
        log on main screen.  Right-click on the
        log to see this option.  This will clear
        any unrecognized commands currently shown
        and does not add any new ones to the list.

     -  Added, 'New log entries at bottom' to the
        log.  Accessible from the right-click
        menu of the log, checking this will show
        new log entries at the bottom of the list
        (versus at the top).
     -  Added, 'Numeric Enter (DirectX Only)' item
        to the Extended Key Chooser screen.  This is
        to allow the use of the Enter key in DirectX
        mode (this is a long-standing issue, mostly 
        because Windows does not differentiate between
        the the Enter keys... which is why it is only 
        available in the dropdown list of Extended
     -  Increased pause from 99.999 to 999.999 seconds.

     -  Added -stopcommands command line parameter.
        This will work just like clicking the,
        'stop commands' button.

-    Bug Fixes

     - Fixed some issues regarding looping
       and multithreading.

     -  Fixed issue with mouse click duration not saving
        when edited.
     -  Fixed multipart commands from accepting blanks.
     -  Fixed multipart commands from accepting duplicate
        entries within the same command.
     -  Fixed issues with dropdown combo boxes
        not showing values properly after
        framework change.

     -  Separated mute status from the audio
        status icon (to stop the icon blinking...
     -  Fixed issue where hitting enter after
        clicking the, 'clear' button on the
        keypress screen would actually create
        a keypress action without a key.
     -  Fixed issue in key press screen where
        if the alt/shift keys were used in 
        numeric input box, VoiceAttack would
        hold on to the modifier key.

     -  Removed unique name restriction for
        prefixes and suffixes when comparing
        to other command types (for example,
        you can now have a full command, 
        'eject car' as well as a prefix (or
        suffix) called, 'eject car').  Prefix
        and suffix names must now be unique
        only within their own subgroup.


-    Bug Fixes
     -  Fixed a very specific bug involving 
        prefixes/suffixes when no other commands
        exist in a profile.


-    Bug Fixes

     -  Fixed bug where prefix/suffix commands were
        completely hobbled o_O
     -  Category now copied when duplicating commands.
     -  Fixed problem when listening was turned back
        on after editing profiles.


-    Improvements

     -  First-pass attempt at repeating commands.  This
        pass includes the ability to repeat indefinitely,
        or, a certain number of times.  This option
        is available in the add/edit command screen
        (make sure the advanced view is open by clicking
        the, 'plus' sign).

        Due to the nature of the messaging means in 
        VoiceAttack, the repeating command can only be
        executed on the Active Window process.  Also
        as a safeguard, if the active window loses focus,
        the repeating command is terminated.

     -  Added the option to pause a running command
        while a subcommand is running, instead of 
        running the subcommand asynchronously and
        continuing to process.  This was a big oversight
        in the prior releases.

        This option will be on by default for new
        commands (this will be off for existing commands
        so it will not interfere with what is currently
        expected).  You can find this option on the
        'Execute another command' action on the, 'Other
        Stuff' screen.

     -  Added ability to terminate commands by name.
        For now, this terminates all instances of the 
        indicated command.  This is the means to stop
        your looping commands as well as any 
        long-running macros.  Previously, you could 
        only stop ALL commands.  This *should* 
        terminate any subcommands that are called.
        This command action is located in the, 'Other stuff'

     -  Added the ability to use delimiters in
        commands to express multiple variations
        of a command.  For instance, 
        you no longer need three separate 
        commands to call, 'fire', 'open fire'
        or, 'fire at will'.  You can simply
        make one command that is, 
        'fire;open fire;fire at will'.
        VoiceAttack will treat that as three
        commands, all doing the same thing.
        Note that the items will be broken
        up automatically when viewed in the
     -  First pass attempt at prefix/suffix
        commands.  This will allow a user to
        create commands that can have two parts
        that can be mixed many-to-many.
        For example, you can have a suffix of,
        '88' and a prefix of, 'eject driver'.
        When you say, 'eject driver 88', both
        commands are executed.  You can also
        say, 'mute driver 88' or, 'flag driver
        88', etc.  Before, if you wanted to 
        account for 100 drivers, you would need
        to duplicate your commands 100 times
        for each set.  Now, you just specify
        your suffix set once (yeah... still 
        100 drivers), but, you only need to
        do this once.  I think I'm explaining
        this right.  Features are getting
        more and more complicated :)

     -  Pressing, 'enter' on a command action now edits the command. 

     -  If VoiceAttack detects a, 'Start Listening' action ANYWHERE
        within an action sequence, the entire sequence will be
        executed as if VoiceAttack was already, 'listening'.

     -  If a second instance of VoiceAttack is opened, the original
        instance of VoiceAttack will now pop up as the topmost

     -  Added various parameters to command line:
        -listeningoff, -listeningon, -shortcutsoff, -shortcutson,
        -minimize.  Kind of self-explanatory :)

     -  Often when you turn on your mic and say a
        command immediately, the speech engine 
        picks up, 'but ' plus whatever you said.
        I put a filter in place so that if a 
        command is unrecognized and starts with, 
        'but ', it will trim it off and try again.

     -  Added, 'Duplicate' as a menu item when you right-
        click on a command in the profile editor screen
        (no longer a need to do a separate copy and then
        paste).  Selecting this automatically opens
        the edit window for the new, duplicated
        command.  Cancelling from here also
        cancels the duplication.  

     -  Last edited command will now be selected by 
        default even after application restarts (may
        not be helpful for anybody but me :)

     -  Increased the size of the pause screen input
        box and made the initial text selection a 
        little smarter.

     -  Added -profile command line parameter to launch or
        change VoiceAttack's active profile.  
        Usage :  -profile "My Profile Name"  
        *Make sure to use double quotes if your profile
        name has spaces in it.

     -  Command line parameters will now affect the running 
        instance of VoiceAttack.  You can now create a 
        shortcut on your desktop that can, for example,
        change a profile, start/stop listening, start/stop
        commands, etc. that will affect the running instance.

     -  Added -nofocus parameter to command line to keep
        VoiceAttack from popping up if there is more than
        one instance (just like it used to be).

     -  Added, 'System Info' button to options page.  This
        will be established over time (there's just basic
        information in there now).

_    Bug Fixes

     -  Fixed snap-to-edge offset for right and bottom
        edges of the screen (left over from when 
        VoiceAttack had rounded corners :D )

     -  The "~ `" key on US keyboards was
        displayed backwards in the, 'Add/Edit
        Keypress' screen.  Should display
        properly now.

-    Undocumented features

     -  Holding CTRL + Options button opens 
        Windows' Sound/Recording device dialog.
        (Same as right-clicking on speaker icon
        in system tray and selecting, 'Recording
     -  Holding ALT + Options button opens
        Windows' Volume Mixer dialog.
        (Same as clicking the speaker icon
        in the system tray and then clicking,


-    Improvements
     -    Complete rework of VoiceAttack user interface look.
          This includes the new flat/icon look, as well as the 
          compact mode of the main form.

     -    Added, 'Hide/Show Advanced Options' button on the 
          command screen.

     -    Added, 'Launch with Windows Start' option.

     -    Added, '-bypassPendingSpeech' command line option which
          reverts VoiceAttack back to a state where hitting the, 
          'stop listening' button will prevent pending speech from
          being invoked (basically stops any running macros).

-    Bug Fixes
     -    Fixed hotkey enable/disable by voice command not 
          updating main form button.


-    Improvements

     -   Text to speech now supports multiple voices.  If you have more
         than one voice installed on your machine, you can select a 
         different voice for each spoken statement.

     -   You can now enable/disable keyboard shortcut hotkeys with a command.  
         These command actions are found on the, 'Other stuff' screen.

     -   Also, you can enable/disable keyboard shortcuts on the main screen
         with the new, 'Shortcuts On / Off' button.  Toggles just like the,
         'Listening' button.

     -   With the addition of the new button, the option screen is now
         accessible thru the little wrench icon on the top bar.

     -   Added a few command line functions for testing.

     -   Changed the way the keys are labeled in the key
         press screen.  Previously, in DirectX mode, you
         would see (for example), 'Num 7 Home' when pressing the 
         numeric pad, '7' key.  This will now display, 'Num 7'.
         This is because VoiceAttack is a Windows application,
         and, is picking up key presses that are applicable
         to Windows.  The DirectX api only has one scan 
         code for 'Home', and, does not differentiate between
         the numeric pad home key and the central cluster
         home key.  This more accurately represents what is
         going on and will save some confusion going forward.
-     Bug Fixes

      -    Work done on the keyboard shortcut enable/disable code in an
           attempt to make enabling/disabling shortcuts a little more
      -    Fixed issue in Windows 8 where resuming from sleep mode would 
           cause the speech engine to double up recognized commands.

      -    Removed horizontal scrollbar from log view that would occasionally
           pop up.


-    Improvements

     -   Added, 'Mouse Click Duration' feature that allows you
         to control the amount of time between a mouse down and 
         mouse up action (for both single and double-clicks).  
         This was created to allow a little more time for DirectX
         games to detect a mouse click.  The default value for 
         this is 0.1 second.
     -   Added Move mouse left/right/up/down x number of pixels
         from current position.
     -   Removed restriction of import commands for the trial 
         version.  The only gotcha is that there is still a 
         maximum of 20 commands.

     -   Added command line argument, '-default' that basically
         does what the 'Reset to Defaults' button does on the 
         Options page.  This is for more than rare instances where 
         an option has gotten corrupted (or manually tampered) and
         the application will not launch.
-    Bug Fixes
     -   Modifier keys that are down are now released when commands
         are stopped.
     -   To be a better neighbor, VoiceAttack will attempt to key
         up any modifiers that are down on application exit.
     -   Prevent Win + up arrow from maximizing screens.         
     -   Fixed issue when superceding key down commands were still
         executed (for example, if you have a key-up macro that is, say, 
         'CTRL + SHIFT + X' and another that is just, 'CTRL + X', when
         you press 'CTRL + SHIFT + X', 'CTRL + X' should not execute
         at the same time).
     -   Fixed issue of input mode not being saved on edit of key 
         press when key down or key up was selected.

     -   Fixed issue with profile overrides that required app restart
         for changes to take effect.
     -   Removed time delay when releasing a modifier key when using a
         key-up assigned macro.         


-    Improvements

     -   You can now execute the macros you set up for
         voice commands with keyboard shortcuts.  On the command
         screen, you now have two checkboxes :  'When I say...', 
         and, 'When I press...'.  You can indicate either or both
         (which also has the nice side-effect of being able to
         enable/disable commands).  What makes this fun is that
         you can have macros with a plain, old keyboard (and, if you
         have a keyboard with macro software, the ability to 
         assign macros to keys other than ones designated).
         There is also an option to only allow for the command
         to be invoked on key up.  Kind of handy if you have
         pairs of macros that you execute all the time (one macro
         on the key down, one on the key up).

     -   Added, 'Command Weight' feature to the, 'Options'
         screen.  The higher the value, the more likely
         VoiceAttack is going to make a, 'best guess' as
         to what you said.  This feature will make the 
         recognition of your commands way more reliable 
         overall, and, will help with certain commands that
         the speech engine just_will_not_handle.  
         Example... if the value of Command Weight is
         100, and, you say, 'flag', and you have no command 
         called, 'flag', but, you have a command called, 'bag', 
         'bag' will be executed.  A high value is (probably) not 
         desirable if you have listening turned on all of the time, 
         since just about everything you say will get executed
         somehow.  A high value would be most helpful for 
         those that use, 'push-to-talk (listen)'.  Default
         value is 50 and can be adjusted up to 100.

     -   Keypress recorder now available on the, 'Command'
         screen.  This replaces the, 'Quick Input' screen
         (since it can do everything the, 'Quick Input' 
         screen could do and more).
     -   Updated the, 'Other Stuff' screen to use a drop
         down list instead of radio buttons to select the
         action.  The screen was getting entirely too long, and
         there are more features coming :)
     -   Totally for fun, you can now override VoiceAttack
         not listening with a command prefix.  For instance, if you
         have VoiceAttack's listening turned off, you have a command
         called, 'Launch My Game' and a command prefix of, 'Computer', 
         you can say, 'Computer, Launch My Game' and the command
         will execute (as if listening was turned on).  Note that you
         don't actually have to have listening turned off... works
         just as well turned on.  This is for my Trekkie friends :)
         This is located in the, 'Profile Options' screen, right off
         the profile.

    -    Setting speech delays in options no longer requires
         a restart (this will make tweaking a lot quicker).
     -   'Allow other commands to run at the same time' 
         (asynchronous commands) is now on by default for
         new installs.
     -   Windows Game (DirectX) is now the default selected
         input mode for new installs.
     -   Added a subtle bit of gradient to the background of all 
         the main forms...  the previous flat color tended to make
         the forms hard to distinguish when overlapped... this might 
         help a little :)
     -   Shined up the mic level indicator on the main screen.  No
         longer a standard progress bar (bleh).
     -   With keyboard shortcuts enabled, I decided it was a bad idea
         to kill VoiceAttack when it starts up and there is no default
         audio device (or headset/mic not plugged in).  You just get a
         warning box now with the option of not showing the box any more
         (a log message always appears with this warning).  An added benefit
         is that now you can configure VoiceAttack without having to have
         your headset/mic hooked up (actually, you could always do this, since
         the popup message was never modal).	
-    Bug Fixes

     -   Introduced bug with working directory that stops
         all shell commands from working.  This has been
     -   Left Shift/Alt/Ctrl keys not working in DirextX mode
         fixed (doh).
-    Known issues that will be fixed in the next release :

     -  Issue with profile overrides that requires app
        restart for changes to take effect.
     -  Win + up arrow maximizes every window.


-   Improvements
    -  Added option to turn off adaptive recognition.
       This is for those that may be experiencing trouble
       in noisy environments.  
       NOTE - This feature is only available to Windows 7
       and Vista users.  XP users can change this value in 
       the speech configuration applet in the control panel.

-   Bug Fixes

    -  Export profile screen no longer has a delay
       when stretching the form.
    -  Less aggressive means of setting top window
       may help with Windows Explorer issues.
    -  Fixed an issue with the registration crashing VoiceAttack
       under certain conditions.       


-   Bug Fixes
    -  Fixed introduced issue where keypress
       duration only works with alpha keyboard
       numbers.  This is the main reason for the
    -  95% less squirrel in the profile screen 
       (position is maintained a little better
       after delete or searching by typing).


-   Bug Fixes
    Fixed introduced problem with mouse push-
    to-talk when editing a profile with some


-   Improvements

    - Recognition global hotkey is no longer 
      just toggle.  You can now also hold to
      listen, or, hold to ignore.  This can
      be overridden at the profile level, so,
      each game/app can have its own hotkey.
      Hotkey is no longer limited to a
      dropdown of shortcuts.  Key selection works
      like the keypress screen, so, if your app
      can support the keys, you can select them.
    - Mouse push-to-talk and global stop command
      can now be overridden at the profile level.
    - Stop command is no longer limited to a 
      dropdown selection (just like the global
      recognition hotkey).
    - Extended key support in the keypress screen.
      Clicking on the mini keyboard shows a popup
      with all of the keys you can select (in case
      your keyboard does not have keys such as, 
      'next track', 'prev track', 'volume up', etc).
    - Keypress screen no longer complains if a key
      is not supported in DirectX when switching from
      standard to DirectX mode.

    - Added working directory to app launch command.
      Should have always been there...  /facepalm.
    - You can now drag and drop a file name onto the
      'Run application' and 'Play sound' text boxes
      on the, 'Other Stuff' screen.
    - Updated the keypress screen (and option screen
      hotkey popups) with some new graphics.  Thought
      it looked a little better, so, I went with it :)

-   Bug Fixes

    -  Fixed a bug where nested asynchronous commands
       were no longer asynchronous.

    -  Startup issue in XP identified and fixed.


-  Improvements

     -  Added 'Unrecognized Speech Delay' option
        in the options screen.  This is the amount
        of time VoiceAttack takes before rejecting
        an ambiguous speech stream.  Most will recognize 
        this as the amount of time you have to hold 
        your breath after talking before issuing an
        actual command :)  I'll probably
        explain this more on the forums.  I think
        it's an important piece that I have
        neglected for a long time.
     -  As a result of the above option, 
        'Recognition Delay' has been renamed to
        'Recognized Speech Delay'.
     -  Removed read-only restriction on the Run
        Application text box on the, 'Other Stuff'
        screen (no longer required to browse for a
        file).  This is so you can take advantage
        of things like shell commands.
     -  Added Category and Description to the 
        Commands.  This will help with organization.
        The columns for Category and Description
        will only be visible if you actually 
        have data in at least one command. Otherwise,
        the columns are hidden (might make this
        a configuration later).
     -  Since we now have up to four columns 
        visible on the Profile screen, we can
        now reorder the columns.
     -  Updated Export to HTML to also include
        the new Category and Description.  Column 
        order is now configurable, as well as sorting.
        You can now choose which columns to export.   
     -  Enabled Help from most screens.  Hit, 'F1'
        to be taken to online help.
     -  'Include Enter' press at end of Quick Input.
     -  Added 'Reset Defaults' button to options
        page.  This reverts all settings back to,
        'factory' values (things like screen 
        positions, column order, hotkeys, etc).  
        Profile data is *not* touched.
     -  Ultra-minor, but, worth mentioning :
        Double-clicking the gear icon on the 
        main page closes VoiceAttack (finally).
        Easter egg - Holding down control + 
        double-clicking on said icon changes 
        VoiceAttack to, 'camo' mode :)  Just
        for fun...  my kid thinks it's cool.
-  Bug Fixes
     -  Screen handling after disabling monitors in
        a multi-monitor configuration updated.


-  Improvements
     - Maintenance release.  Some optimization.  Added
       better messages to various places.

-  Bug Fixes
     - You can now set both the, 'Recognition Global Hotkey', 
       and the, 'Stop Command Global Hotkey', to, 'None'.
     - The 'Stop Listening' action is a little more
       forgiving when invoked near the end of 
       issuing a voice command.


-  Improvements
     -  Press and release keys now default to .10
        seconds out of the box (instead of 0).
        This value is, 'sticky', so, it will stay
        set to whatever you set it to last.
        (If you are already on v1.2.6, this version
        is not really necessary.)
-   Bug Fixes
    Very minor, cosmetic.  Also, freshened up help 
    document a little bit.  One day, it will not look 
    so much like a ransom note :)


-  Improvements

     -  Added Mouse Actions to commands.
        You can now add mouse left/right/middle click 
        (mouse down and then up), double-click, down, 
        and up to your command macros.
        The scroll wheel can be scrolled forward or
        The mouse location can be captured in your games
        by pressing a user-defined hotkey (hotkey is
        defined in Options).
        Current mouse position can be saved and then

-  Bug Fixes
 - Fixed a bug where setting the duration of a keypress
   would allow users to hit, 'OK' even though no key 
   was selected.


-  Improvements

  -  Added the ability to play .mp3 and .wma files
     (in addition to .wav).  This is system-dependant,
     so, if your system does not support this, 
     VoiceAttack will revert to only .wav.
     (Windows Media Player 10+ is required.)
  -  Volume level for audio files has been added.
     Again, this is system-dependant.  If your system
     does not support this, this feature will not be

  -  Sometimes the speech engine is a bit laggy when 
     loading and unloading data, so, improvements have
     been made to help it along (this will have
     the biggest impact on those that see a delay
     when changing profiles and/or adding and updating

-  Bug fixes

  -  A few minor bugs and some leftover test code removed.  

  -  Some more human-readable error handling provided.


-  Bug fixes

-  Fixed introduced bug where editing a command
   that launches with a parameter does not save
   the parameter.
-  New Tips screen would sometimes lose its mind.
   Less broken now :)
-  Minor cosmetic updates.


-  Bug fixes
  - Widened some text areas to display better in XP.
-  Added 'Tips' screen that pops up on first use.  Just
   to help those that have never tried this before not
   be completely lost.


-  Bug fixes
  -  Profile find action by keypress works a little better.
  -  Registration no longer cares about email letter case.
  -  In the Keypress window, 'Method A' is now, 'Standard'.  
     'Method B' is now, 'Windows Game (DirectX)'.


-  First pass at nested commands.  This will allow for
   calling other commands by name within a command.  You
   will find this option on the 'Other Stuff' screen.
   Note that there is code in place to prevent you from 
   creating a loop (crossing fingers), since the final
   goal is to create repeating commands.

-  Optimized speech engine initializer to speed up profile

-  Added copy (ctrl+c), paste (ctrl+v), 
   move (ctrl + up/down arrows) and delete via keyboard 
   to command action list (all of this is also available via
   right-click menu).


-  Added 'This command allows other commands to run 
   at the same time' feature to the add/edit command
   window.  This is a first pass at 'multi-threaded'
   commands that is at the top of everybody's list :)

-  The 'Stop Macro' button has been replaced
   with a 'Stop Commands' button.  What this
   does now is it is basically a panic button to
   indicate to all running macros that they need to

-  Added global hotkey to stop command 

-  Added 'stop command processing' as a command
   (so you can issue voice commands to stop
   command processing... and then get sucked into 
   a black hole).  Note - this feature only works
   if your commands are set up to be asynchronous
   (that is, your commands can be executed at the
   same time)... more on this in the help file.

-  Reduced CPU usage of macros.

-  Profiles can now be switched via command.
   This is available on the 'Other stuff'
   screen and is accessible only to registered
   users (since the unregistered version only
   allows one profile).

-  Quick input now has an input mode for each
   keypress, a 'hold down for x seconds'
   and a, 'pause between each keypress'.  Each
   of these is 'sticky' (that is, they default
   to the last value that you set each time you 
   come back).

-  KeyPress hold key duration is now 'sticky'.

- 'Start Minimized' feature added to options

-  When adding a command action, the new action will appear
   after where the cursor is located (not just added
   to the end of the list).

-  First pass at a command action quick reference list.  
   This list is currently only available in html format
   and is generated by clicking the 'export' button and
   selecting 'html' as the file type.  Note that this is
   only available in the registered version.

- Bug fixes
  - Case-sensitivity issue between VoiceAttack
    commands and the speech engine (doh!).

  - Worked in a little more effort to make sure
    the main screen is visible at launch.

  - Typos... always with the typos.

  - Screen scaling issues with large font sizes
    have been fixed... fixed by preventing VoiceAttack
    from scaling at all :)

  - Blank commands are now omitted. Blank commands 
    were possible through the add command screen 
    for a brief period, due to introduced code.  
    This has caused VoiceAttack to get upset.  
    Also, a blank command in an imported profile 
    would do the same thing.

  - Sometimes VoiceAttack would not have the proper
    command selected when the command was double-
    clicked in the command list.  This has been


- Added exporting and importing of single profiles. 
  An exported profile can contain any or all of its 
  associated commands (available on the main screen).
  *Registered version only.

- Added the ability to import commands from an 
  exported profile (in the add/edit profile screen).
  *Registered version only.

- Fixed a bug where right/double clicking on log entry
  would show incorrect command name in add/edit command


- Added 'Input Mode' feature in the keypress add/edit
  screen.  This is for compatibility with more DirectX
  games.  Toggle this mode (between Method A and
  Method B) if your game does not recognize key presses
  issued by VoiceAttack.

- 'Check for Update' button in options (this is only
  available in the registered version).

- Fixed a bug where if you had a 'run application' action
  in a command, subsequent actions in that command would
  not be processed.

- Activity log limited to 100 items before items drop off.

- When a command is recognized or unrecognized, the Activity
  log on the main screen now allows for right / double click 
  access to add and edit commands.  This is a big time saver 
  if you are testing out commands while building your profiles
  (saves you the trouble of having to navigate all the way 
  to the command each time).


- Added Text to speech as audible feedback.
  In Commands / Other, you will find a selection that will
  allow you to add text that will be converted to speech by
  your built-in Windows Text to Speech Engine.  There is a 
  preview button on there so you can type something really
  weird & turn it up so your family can hear you (and 
  mock you... maybe not as much as they mock you for talking
  to your computer... which happens here a lot).

  NOTE: The prerelease did not have a volume slider.  If you have
  been using the prerelease, your volume may be zero for all
  of your commands (sorry, guys!).

  Lesser Note:  Known issue - if you have multiple sound 
  cards, VoiceAttack only outputs to the default audio
  device and ignores whatever you choose in the 'Advanced'
  screen in the control panel.

- Added mouse button (left, right, middle, back, forward)
  hotkey listening / not listening toggles.  There are 
  also options for each mouse button to 'push to listen'
  and 'push to not listen'. 

  Note : be aware of other mouse/hotkey software that you 
  might have set up (such as Logitech Setpoint).  If you are 
  using other hotkey software, just continue using the 
  keyboard hotkeys in VoiceAttack and have your software 
  press those keys.

- Added 'Play Sound File' as a command action.  (In
  Commands / Other).  .WAV files only (no immediate plans
  for other file types). 

- Added a 'test run' button to the 'Commands/Other' screen to
  test launch an application with supplied parameters (since
  getting parameters right is a pain, sometimes).

- Fixed 'keyup' order of release if a modifier was selected.
  The key will be released first before the modifier.  Note
  that this is just the keyup (what is my deal with the key
  ordering??? sheesh).

- Possibly less crashy after registration (sometimes
  VoiceAttack would crash immediately after registration).


- VoiceAttack now supports multiple users on a single machine.
  In versions prior to 1.1.5, you needed to have admin rights
  for a single user.  This was a huge design flaw from the 
  beginning and has been corrected.  This allows for each
  user on a machine to have their own set of profiles.
  Each user account on a machine will need to validate 
  separately (apologies in advance... trying to squash bugs
  as fast as possible.  This shouldn't affect many, tho).

  If your version of VoiceAttack has a VoiceAttack.dat file 
  in the install directory (usually C:\Program Files\VoiceAttack), 
  this file will no longer be accessed.  If you are backing 
  up VoiceAttack profiles, you will now find the 
  VoiceAttack.dat file (usually) in 
  (C:\Documents and Settings\UserName\Application Data\VoiceAttack
  on XP) <--- note that sometimes these folders are hidden
  by Windows & you'll need to set up your folders appropriately
  to see them.
  If you happen to be digging around in this folder, you 
  will notice a backup directory where VoiceAttack now copies 
  the last ten profile saves.  If you ever find yourself 
  in a situation where you need to restore a previous 
  profile set, just replace your VoiceAttack.dat file one
  directory up with any one of the files in the backup dir.
  This is kind of a hack, but, if anything, it makes me 
  feel better, (making good profiles takes a lot of work :)
  (This process might be made automatic later)

  All this should fix the issue where validation would not occur
  if you did not have admin rights as well as saving profiles


- Fixed a bug where if all audio input devices were disabled, 
  VoiceAttack would not run.

- Fixed a bug introduced in v1.1.3 in the key press add/edit 
  screen where the Tab key was no longer recognized.

- Quick Input added to Command Add/Edit.  
  This allows for creating a series of key presses quickly. 
  This is not for all available keys on the keyboard, but, 
  it makes inputting a key press series such as, "/use reigns 
  of the traveler's tundra mammoth" a lot faster.

- The Windows key is now a modifier in the keypress screen.  
  If your keyboard has this key, for example, you can issue 
  commands that contain Windows + D to go to the desktop.  
  This was available in 1.1.3 as separate key presses, however, 
  I wanted to also consolidate this into a single command action.

- Modifier labels (CTRL, ALT, SHIFT, WIN) in the keypress 
  add/edit screen are now clickable to change their status.  
  The pressed key label is also clickable to clear its value.

- Recognition delay is now user-adjustable.
  The recognition delay is how long VoiceAttack waits to react 
  after recognizing a phrase and then hears silence.  Kind of 
  hard to explain, but, set to a lower value to have VoiceAttack
  react more quickly.  Set to a higher value if VoiceAttack is 
  not allowing you to finish your phrases.  Play around with 
  the value (I set mine all the way to zero).
  This is located on the Options page and the value can be 
  from 0 to 10000 (the default Value is 150).