CHANGE LOG

 

                        
VoiceAttack Change Log


v1.6.5

    -  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' 
          section).
          
       -  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.           
       
       -  'Listening' turning on after profile edit has been corrected (introduced in previous beta).
       



v1.6.4
    -  Steam version update, security.
           

v1.6.3
    -  Steam version update, security.


v1.6.2

   -  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 
         priority.
         
   -  Improvements

      -  Added, 'Execute an Inline Function - C# or VB.net Code' command action.  This will allow you
         to write C# or VB.net 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 VB.net Code' screen.  What this
         does is make the, 'Execute an Inline Function - C# or VB.net 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
         level.
         
         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 muliplier 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)
         commands.  
       
      -  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)
          command.
          
      -  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 
         (again).                 
          
      -  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.         


v1.6.1
   
   -  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.


v1.6

  - 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 vb.net).  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 diretory 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
        quotes).
        
     -  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]'
        instead.
        
     -  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
        action).
        
     -  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 
        disappear.
        
     -  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} -  "1.5.12.15"
        {STATE_VA_VERSION_MAJOR} - "1"
        {STATE_VA_VERSION_MINOR} - "5"
        {STATE_VA_VERSION_BUILD} - "12"
        {STATE_VA_VERSION_REVISION} - "15"
        {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 
        zero.        

     -  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 
        VoiceAttack.
     
     -  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).
	      Example:
        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.


v1.5.12

   - 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.


v1.5.11

   - Bug fixes
   
     -  Attempting to correct startup crash some are 
        experiencing.

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

     - 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.

     - Fixed disabled commands executing when named
       the same as enabled commands (introduced in
       previous beta).

    -  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.


v1.5.10

   - 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.


v1.5.9

- 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
      screen.

   -  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 
      shortcuts).

    -  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 
       variation:
       [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 
        command.	   

    -  '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:
      
      {STATE_KEYSTATE:key}
      '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:
      
      {STATE_LEFTMOUSEBUTTON}
      {STATE_RIGHTMOUSEBUTTON}
      {STATE_MIDDLEMOUSEBUTTON}
      {STATE_FORWARDMOUSEBUTTON}
      {STATE_BACKMOUSEBUTTON}
      
      These should be pretty straight forward. If you
      want to test for the right mouse button, use
      token {STATE_RIGHTMOUSEBUTTON}.
      
      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:
      
      {STATE_JOYSTICK1BUTTON:buttonNumber}
      {STATE_JOYSTICK2BUTTON:buttonNumber}
      
      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:
      {STATE_JOYSTICK2BUTTON:10}
      
      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 
      "100".
      
   -  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
      options.
        
      {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
      to.
     
   -  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
        option.
       
    -   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.
        
    -  'UNABLE TO INVOKE PLUGIN. PLUGIN NOT VALID FOR THIS VERSION 
       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 thrasing 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 
      selected.

    - 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
      execute.
        
   -  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'
      prefix.     

   -  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
      running.
        
   -  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.
	  


v1.5.8

-  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 
       semicolon.
       
       Here is an example : 
       [Greetings;Hello]computer
       
       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) :
       
       [Greetings;Hello]computer;Hi
       
       With this example, to execute the command,
       you can say : 

       Greetings computer
       Hello computer
       Hi
       
       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 intersting 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 diplay).
       
      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
      RSHIFTUP
      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 dowwn 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
      NUM1
      NUM2
      NUM3
      NUM4
      NUM5
      NUM6
      NUM7
      NUM8
      NUM9
      
      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
      F2
      F3
      F4
      F5
      F6
      F7
      F8
      F9
      F10
      F11
      F12
      F13
      F14
      F15
      F16
      F17
      F18
      F19
      F20
      F21
      F22
      F23
      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 supportin
        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 
        {DICTATION:PERIOD:CAPITAL:LATEST:UPPERCASE:LOWERCASE:NEWLINE:SPACEX}
        
        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 :
        'THIS IS A TEST OF THE EMERGENCY BROADCAST SYSTEM THIS IS ONLY A TEST'
        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
       info.

   -   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
       function.
   
   -   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
       (previoulsy 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 
       example).
       
   -   Added new tokens {INT:variable name} and 
       {INTFORMAT:variable name} to provide a way to
       access the new integer varibles through text
       features.
   
   -   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 varibles through text
       features.
       
   -   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
       variable.
       
   -   Added four new mouse position tokens : {MOUSESCREENX},
       {MOUSESCREENY}, {MOUSEWINDOWX}, and {MOUSEWINDOWY}.
       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, 
       apparently.

   -   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 mising 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) :
       {DATE}, {DATEMONTH},{DATEMONTHNUMERIC},
       {DATEDAYOFWEEK}, {DATEDAY}, {DATEYEAR}
   
   -   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, howevever,
       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
       entry.
   
   -   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.
       NOTE: THIS REPLACES '{WINDOWTEXT}' token.
       
   -   Added, '{ACTIVEWINDOWPROCESSNAME}' token 
       that returns the active window's 
       process name (what you would see in Task
       Manager).
       
   -   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-
       coordinate).
       
   -   Added, '{ACTIVEWINDOWLEFT}' token that
       returns the active window's left (X-
       coordinate.

   -   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 
       'ship'.
       
   -   Added new token, '{TXTLEN:valueName}'.  This
       will return the length of the text variable's
       value.
   
   -   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 
       interface.
       
       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
       Set'.
       
   -   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
       Category'.
       
   -   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 verion 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
       value. 
       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 :
        http://www.xiph.org/dshow/
        
    -   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
       command.

   -   Optimized composite command (prefix/suffix) 
       loading.

   -   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
       app.

   -   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 listening...lol.

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

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



v1.5.7

-    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 
        joysticks.
        
        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
        caution.
       
        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 
        annoying.        
       
    -   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 
        annoying.
       
        *******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 : 
        http://xiph.org/dshow/).  Note, this will only
        work in non-legacy mode (just like .mp3 and 
        .wma).
        
     -  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 unrecongized 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 overide 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.

        

v1.5.6

-    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 
        {TXT:valueName:defaultValue}.  
        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:
        {PROFILE}.
        
     -  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 
        confusing.
        
        
-    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 
        crash.

     -  Fixed {CMD} token to work properly with multipart
        commands.
        
     -  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 
        properly.
        
     -  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 
        feature.
        
     -  Fixed an issue with changing/importing profiles while
        no audio connected.      



v1.5.5

-    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 
        information.  
        
        All commands in the selected profile will overide
        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 seleted 
        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
        choose.
     
     -  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).


v1.5.4

-    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
        Keys).	
       	
     -  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...
        mostly).
        
     -  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.


v1.5.3

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

v1.5.1

-    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.


v1.5

-    Improvements

     -  First-pass attempt at repeating commands.  This
        pass includes the ability to repeat indefinately,
        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'
        screen.

     -  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
        list.
        
     -  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
        window.

     -  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 unrecongized 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
        devices'.)
        
     -  Holding ALT + Options button opens
        Windows' Volume Mixer dialog.
        (Same as clicking the speaker icon
        in the system tray and then clicking,
        'Mixer'.)


v1.4

-    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.
   

v1.3.7

-    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
           reliable.
           
      -    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.
           

v1.3.6

-    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.         


v1.3.5

-    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.
         ***NOTE : THIS FEATURE IS *NOT* AVAILABLE IN WINDOWS XP.

     -   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
         fixed.
         
     -   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.


v1.3.4

-   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.       


v1.3.2

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

v1.3.1

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

v1.3

-   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.
    

v1.2.9

-  Improvements

     -  Added 'Unrecognized Speech Delay' option
        in the options screen.  This is the amount
        of time VoiceAttack takes before rejecting
        an ambigous 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.


v1.2.8

-  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.

v1.2.7

-  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 :)


v1.2.6

-  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
        backward.
        
        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
        recalled.
        

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



v1.2.5

-  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
     available.

  -  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
     commands).
    

-  Bug fixes

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

  -  Some more human-readable error handling provided.


v1.2.4

-  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.

v1.2.3

-  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.

v1.2.2

-  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)'.


v1.2.1

-  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
   loading.

-  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).


v1.2

-  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
   stop.

-  Added global hotkey to stop command 
   processing.

-  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
   page.

-  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
    fixed.


v1.1.8

- 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
  screen.


v1.1.7

- 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).


v1.1.6

- 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).
 

v1.1.5

- 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:\Users\UserName\AppData\Roaming\VoiceAttack
  (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
  (*yikes*).  
  


v1.1.4

- 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).