What's new in Portable StrokesPlus.net 0.5.7.8

Oct 20, 2023
  • Version bump, needed to update installer to purge ClearScript files as well - no code changes

New in Portable StrokesPlus.net 0.5.7.7 (Oct 20, 2023)

  • Fixed crash due to leftover ClearScript DLL from newer version that shouldn't be there

New in Portable StrokesPlus.net 0.5.7.6 (Oct 20, 2023)

  • Fixed issue with fixing hints in 0.5.7.5

New in Portable StrokesPlus.net 0.5.7.5 (Oct 19, 2023)

  • Updated WebView2 to version 1.0.2088.41
  • Updated WebView2 installer
  • Downgraded to ClearScript 7.2.2 to address regression issues
  • Updated fire gesture thread logic to not clear MatchedGestureName prior to executing No Match
  • Fixed issue with deleting gesture pattern removing the incorrect pattern
  • Prevent multiple Account Login windows from being created (click Login from tray)
  • Made a few changes to the Hint logic to hopefully address it disappearing, but still working on it
  • This may also address random hangs on single right-clicks
  • Added logic to directly reset hint popup state on successful action execution
  • Updated zh-CN translations

New in Portable StrokesPlus.net 0.5.7.4 (Mar 7, 2023)

  • Updated clear gesture logic to use GetClientRect before calling FillRect instead of using the desktop coordinates

New in Portable StrokesPlus.net 0.5.7.2 (Dec 29, 2022)

  • Fixed crash relating to No Match section

New in Portable StrokesPlus.net 0.5.7.1 (Dec 28, 2022)

  • Added ProfileName and BrowserOptions parameter to HTMLWindow action method
  • Updated WindowFromHandle to check if handle is for a valid window
  • Updated to ClearScript version 7.3.6
  • Updated to WebView2 version 1.0.1462.37
  • Added language entries:
  • NoMatchScriptTab
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.ProfileName.Name
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.ProfileName.Description
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.ProfileName.Type
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.BrowserOptions.Name
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.BrowserOptions.Description
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.BrowserOptions.Type

New in Portable StrokesPlus.net 0.5.6.9 (Jun 23, 2022)

  • Removed error popup for WM_REGISTERSINGLEHOTKEY message calls when hot key is already registered since this is only intended for internal use during the hot key execution workflow

New in Portable StrokesPlus.net 0.5.6.8 (Jun 21, 2022)

  • Added sp.FindImageWithinImage or StrokesPlus.Multimedia.Images.FindImageWithinImage, which takes a source image (needle) and searches for it inside the haystack image. If found, it returns a Point with the top,left coordinates of where the needle was found in the haystack. Otherwise, it returns null if the source image was not found.
  • IMPORTANT: The two images being compared should be PNG or Bitmap without compression, full 24-bit or 32-bit images without transparency.
  • Added language entries:
  • ScriptHelp.ActionMethod.FindImageWithinImage.Name
  • ScriptHelp.ActionMethod.FindImageWithinImage.Description
  • ScriptHelp.ActionMethod.FindImageWithinImage.Returns
  • ScriptHelp.ActionMethod.FindImageWithinImage.Parameters.needle.Name
  • ScriptHelp.ActionMethod.FindImageWithinImage.Parameters.needle.Description
  • ScriptHelp.ActionMethod.FindImageWithinImage.Parameters.needle.Type
  • ScriptHelp.ActionMethod.FindImageWithinImage.Parameters.haystack.Name
  • ScriptHelp.ActionMethod.FindImageWithinImage.Parameters.haystack.Description
  • ScriptHelp.ActionMethod.FindImageWithinImage.Parameters.haystack.Type
  • ScriptHelp.ActionMethod.FindImageWithinImage.Example.Simple

New in Portable StrokesPlus.net 0.5.6.7 (Jun 17, 2022)

  • Fixed issue with HistoryScripts not having the script property assigned
  • Updated history script logic to include awareness of the ExecuteByIndex method

New in Portable StrokesPlus.net 0.5.6.6 (Jun 7, 2022)

  • IMPORTANT: I would recommend backing up your config before installing this version, simply because there are a lot of updates relating to themes which are not complete and have not been tested, but I wanted to fix a few things and did not create a separate branch for themes like I should have...
  • NOTE: There are various updates which reference themes - I intended to complete that, but have run into multiple issues I still need to work through, so this release contains some items but they are not active at this time
  • Fixed issue causing internal setting value to multiply
  • Fixed issue with hints not showing correct hint text for secondary actions
  • Added Nullable<Point> ShowAtLocation to InputBoxInfo
  • Fixed issue with importing multiple action categories of the same name creating duplicate categories
  • Marked all sp_config.Scintilla* properties and sp_config.GestureThumbnailBackgroundColor as
  • obsolete, these WILL BE REMOVED in the future
  • On first run, the existing Scintilla* and GestureThumbnailBackgroundColor property values will be
  • copied to the new theme settings
  • Added sp_config.CurrentTheme (Theme class) and sp_config.Themes (List<Theme>) to manage themes
  • Note that some properties in the Theme won't have an effect in the current screens, but may in the future. Theme properties with their color set to Color.Transparent are not currently used
  • sp_config.Scintilla* fields are still valid, but deprecated. The appropriate Theme* properties use the Scintilla* fields as backing variables
  • Added sp_config.ApplyDefaultLightTheme()
  • Added sp_config.ApplyDefaultDarkTheme()
  • Added Current Theme section to Import/Export and excluded theme related values from the Optionsselection
  • Added language entries
  • ThemeModeLight
  • ThemeModeDark
  • ThemeModeSelect
  • ThemeDefaultNameLight
  • ThemeDefaultNameDark

New in Portable StrokesPlus.net 0.5.6.5 (Feb 24, 2022)

  • Moved COLORREF struct definition to StrokesPlus.Types.WinApi.COLORREF
  • Moved console loading to PostStartup()
  • Added sp_config.ConsoleStartupDelay - int, default 2 (seconds) - try increasing this value if
  • you are getting error messages when S+ first starts or a non-initialized Console script editor
  • Added try/catch in InitScintilla, if this occurs, you won't have script editor formatting, auto
  • complete, etc. - but things should still function fine.
  • Added StrokesPlus.Program.ErrorLog (List<StrokesPlus.Types.Internal.ErrorInfo>) which will store
  • all internal errors in case they are helpful in debugging. Note that this list is not saved, only
  • has data during the life of the S+ process
  • Added sp.UpdateStrokeColors() to refresh the brushes based on config setting values
  • Added sp.ResetHintState() to try and troubleshoot an issue when hints stop appearing
  • Added SystemWindow type to script engine as StrokesPlus.Types.Internal.SystemWindow. This is
  • mostly just for you to be able to use the type in a List, for example:
  • var x = new List(StrokesPlus.Types.Internal.SystemWindow);
  • x.Add(sp.ForegroundWindow());
  • There's really not much the type itself exposes, except for a few static methods which are
  • already accessible via existing S+ functions that are more script friendly.
  • For example:
  • var w = new StrokesPlus.Types.Internal.SystemWindow(handle)
  • is the same as:
  • var w = sp.WindowFromHandle(handle);
  • Updated translations

New in Portable StrokesPlus.net 0.5.6.4 (Feb 21, 2022)

  • Added window style flag types to script engine: WindowStyleFlags, WindowExStyleFlags
  • Added the above flags to StrokesPlus.Enums.WinAPI namespace
  • Added extra hint trace logging and hint window validity check on DisplayHint
  • Continued work on new settings HTML

New in Portable StrokesPlus.net 0.5.6.3 (Feb 20, 2022)

  • Updated the mouse hook window's logic to ensure it's not considered visible
  • Added logic to Draw Surface Always on Top and Send Draw Surface to Bottom checkboxes so only one can be checked at any time. Didn't cause any harm, but seemed confusing to be able to check both
  • Added Hint Text field to action editor, this will show in the hint popup if enabled
  • Added Hint Text font selection to Options > Hints
  • Added Comments property to BaseAction class
  • Added language entries:
  • tabPreferencesHintTipFontSizeLabel
  • tabPreferencesHintTipFontNameLabel
  • HintText
  • EnterHintText

New in Portable StrokesPlus.net 0.5.6.2 (Feb 20, 2022)

  • Same as 0.5.6.3, I needed to fix a memory leak I created, so I updated the file name and version in case the CDN already cached 0.5.6.2 files with the bad code

New in Portable StrokesPlus.net 0.5.6.1 (Feb 17, 2022)

  • Due to changes in script editor color properties, all related values have been reset to default
  • Fixed crash when invalid path characters exist in the External Script file value
  • Fixed logic issue which would prevent external script from being evaluated if Load script was not enabled
  • Fixed issue with control characters getting inserted into script editors
  • Fixed issue with line number margin size in Console script editor
  • Updated check before saving Console window position to ensure the reported location is on screen
  • Updated script Find All results panel to use Scintilla color settings
  • Removed sp_config.ScintillaBackgroundColor
  • Renamed sp_config.sp_config.ScintillaMarkerBackgroundColor to sp_config.ScintillaMarkerBackColor
  • Added sp_config.ScintillaCaretColor (blinking cursor color)
  • Added sp_config.ScintillaSelectionBackColor
  • Note that sp_config.ScintillaIdentifierColor and sp_config.ScintillaIdentifierBackColor generally dictate the default text colors. sp_config.ScintillaFontBackColor will set the script area's background color (essentially, anywhere another text type isn't matched). While sp_config.ScintillaFontColor doesn't appear to have a case where it has an effect.
  • Updated to ClearScript 7.2.2
  • Updated to WebView2 1.0.1108.44

New in Portable StrokesPlus.net 0.5.6.0 (Feb 13, 2022)

  • Added new editor color settings (note that other Scintilla* settings already existed):
  • sp_config.ScintillaBackgroundColor
  • sp_config.ScintillaFontColor
  • sp_config.ScintillaFontBackColor
  • sp_config.ScintillaMarkerBackgroundColor
  • sp_config.ScintillaMarkerColor
  • sp_config.ScintillaIdentifierBackColor
  • sp_config.ScintillaCommentBackColor
  • sp_config.ScintillaNumberBackColor
  • sp_config.ScintillaCharacterBackColor
  • sp_config.ScintillaKeywordBackColor
  • sp_config.ScintillaSecondaryKeywordBackColor
  • sp_config.ScintillaOperatorBackColor
  • sp_config.ScintillaClassBackColor
  • sp_config.ScintillaLineNumberBackColor
  • sp_config.ScintillaFoldMarginColor
  • sp_config.ScintillaFoldMarginHighlightColor
  • sp_config.GestureThumbnailBackgroundColor

New in Portable StrokesPlus.net 0.5.5.9 (Feb 1, 2022)

  • Fixed issue with custom hint location setting
  • Updated translations

New in Portable StrokesPlus.net 0.5.5.8 (Jan 31, 2022)

  • Disabled hotkey already registered message if the internal hotkey ID was previous assigned successfully
  • Added option to specify custom location (X,Y) for hints
  • Added language entries:
  • tabPreferencesHintLocationCustom
  • tabPreferencesHintLocationCustomLabel

New in Portable StrokesPlus.net 0.5.5.7 (Jan 25, 2022)

  • Fixed issue with hotkeys being cleared when S+ is disabled and Apply/OK clicked, this is only relevant when Keep Registered Hot Keys Active When Disabled is checked
  • Added 2 second delay during initial load of Console window in background to hopefully avoid error during load while assemblies are still loading
  • Updated to ClearScript 7.2.1
  • Updated to WebView2 1.0.1072.54
  • Updated zh-TW translation

New in Portable StrokesPlus.net 0.5.5.6 (Jan 12, 2022)

  • Fixed a couple parameter name changes which caused translations to not match correctly
  • Added two properties to SystemWindow which leverage the internal methods used to get a window's EXE name and path. This makes it a little simpler to get the EXE name and provides error handling which attempts to use different methods upon one method failing. Crucially, it cannot result in
  • an error, it will just return an empty string if all methods fail.
  • Updated language entries to correct typo:
  • ScriptHelp.SystemWindowProperty.AllChildWindows.Description
  • ScriptHelp.SystemWindowProperty.AllDescendantWindows.Description
  • Added language entries:
  • ScriptHelp.SystemWindowProperty.ExecutablePath.Name
  • ScriptHelp.SystemWindowProperty.ExecutablePath.Description
  • ScriptHelp.SystemWindowProperty.ExecutablePath.Type
  • ScriptHelp.SystemWindowProperty.ExecutablePath.Example.Simple
  • ScriptHelp.SystemWindowProperty.ExecutableName.Name
  • ScriptHelp.SystemWindowProperty.ExecutableName.Description
  • ScriptHelp.SystemWindowProperty.ExecutableName.Type
  • ScriptHelp.SystemWindowProperty.ExecutableName.Example.Simple

New in Portable StrokesPlus.net 0.5.5.5 (Jan 5, 2022)

  • Fixed bug with MouseButtons dropdown in Steps not displaying selected value
  • Added StrokesPlus.Input.Keyboard.Keys.IsDown(vk) and sp.IsKeyDown(vk)
  • Added StrokesPlus.Input.Keyboard.Button.IsDown(MouseButtons) and sp.IsButtonDown(MouseButtons)
  • Added to Steps: Keyboard > Is Key Down
  • Added to Steps: Mouse > Is Button Down
  • Added language entries:
  • ActionStepMethods.IsButtonDown.DisplayName
  • ActionStepMethods.IsButtonDown.HelpTip
  • ActionStepMethods.IsKeyDown.DisplayName
  • ActionStepMethods.IsKeyDown.HelpTip
  • ScriptHelp.ActionMethod.IsButtonDown.Name
  • ScriptHelp.ActionMethod.IsButtonDown.Description
  • ScriptHelp.ActionMethod.IsButtonDown.Returns
  • ScriptHelp.ActionMethod.IsButtonDown.Example.Simple
  • ScriptHelp.ActionMethod.IsButtonDown.Parameters.button.Name
  • ScriptHelp.ActionMethod.IsButtonDown.Parameters.button.Description
  • ScriptHelp.ActionMethod.IsButtonDown.Parameters.button.Type
  • ScriptHelp.ActionMethod.IsKeyDown.Name
  • ScriptHelp.ActionMethod.IsKeyDown.Description
  • ScriptHelp.ActionMethod.IsKeyDown.Returns
  • ScriptHelp.ActionMethod.IsKeyDown.Example.Simple
  • ScriptHelp.ActionMethod.IsKeyDown.Parameters.vk.Name
  • ScriptHelp.ActionMethod.IsKeyDown.Parameters.vk.Description
  • ScriptHelp.ActionMethod.IsKeyDown.Parameters.vk.Type

New in Portable StrokesPlus.net 0.5.5.4 (Dec 28, 2021)

  • Updated WebView2 to version 1.0.1054.31
  • Updated Console script logic, if text is selected, only execute the selection, otherwise all text
  • Added System.IO.Compression and System.IO.Compression.FileSystem to script engine
  • Added Saved Strings feature which differs from Stored Values. Saved Values are persisted to your settings file, so the values remain after closing S+. Stored Values are lost when S+ exits.
  • Script: sp.GetSavedString or StrokesPlus.SavedStrings.Get
  • sp.SaveString or StrokesPlus.SavedStrings.Set
  • sp.DeleteSavedString or StrokesPlus.SavedStrings.Delete
  • sp.DeleteAllSavedStrings or StrokesPlus.SavedStrings.DeleteAll
  • Steps: Get Saved String
  • Save String
  • Delete Saved String
  • Delete All Saved Strings
  • Direct: sp_config.SavedStrings [Dictionary<string, string>]
  • Added hidden setting sp_config.SilentStart (bool) which disables splash screen and hides tray icon:
  • NOTE: This will likely affect the ability to activate other windows (taskbar button flashing instead)
  • This only hides the tray icon, scripts can still be used to show the tray icon and open the Settings window
  • Set via: sp_config.SilentStart = true;
  • sp_config.SilentStart = false;
  • Added language entries:
  • ScriptHelp.ActionMethod.GetSavedString.Name
  • ScriptHelp.ActionMethod.GetSavedString.Description
  • ScriptHelp.ActionMethod.GetSavedString.Returns
  • ScriptHelp.ActionMethod.GetSavedString.Example.Simple
  • ScriptHelp.ActionMethod.GetSavedString.Parameters.name.Name
  • ScriptHelp.ActionMethod.GetSavedString.Parameters.name.Description
  • ScriptHelp.ActionMethod.GetSavedString.Parameters.name.Type
  • ActionStepMethods.GetSavedString.DisplayName
  • ActionStepMethods.GetSavedString.HelpTip
  • ScriptHelp.ActionMethod.SaveString.Name
  • ScriptHelp.ActionMethod.SaveString.Description
  • ScriptHelp.ActionMethod.SaveString.Returns
  • ScriptHelp.ActionMethod.SaveString.Example.Simple
  • ScriptHelp.ActionMethod.SaveString.Parameters.name.Name
  • ScriptHelp.ActionMethod.SaveString.Parameters.name.Description
  • ScriptHelp.ActionMethod.SaveString.Parameters.name.Type
  • ScriptHelp.ActionMethod.SaveString.Parameters.value.Name
  • ScriptHelp.ActionMethod.SaveString.Parameters.value.Description
  • ScriptHelp.ActionMethod.SaveString.Parameters.value.Type
  • ActionStepMethods.SaveString.DisplayName
  • ActionStepMethods.SaveString.HelpTip
  • ScriptHelp.ActionMethod.DeleteSavedString.Name
  • ScriptHelp.ActionMethod.DeleteSavedString.Description
  • ScriptHelp.ActionMethod.DeleteSavedString.Returns
  • ScriptHelp.ActionMethod.DeleteSavedString.Example.Simple
  • ScriptHelp.ActionMethod.DeleteSavedString.Parameters.name.Name
  • ScriptHelp.ActionMethod.DeleteSavedString.Parameters.name.Description
  • ScriptHelp.ActionMethod.DeleteSavedString.Parameters.name.Type
  • ActionStepMethods.DeleteSavedString.DisplayName
  • ActionStepMethods.DeleteSavedString.HelpTip
  • ActionStepMethods.DeleteAllSavedStrings.DisplayName
  • ActionStepMethods.DeleteAllSavedStrings.HelpTip

New in Portable StrokesPlus.net 0.5.5.3 (Dec 2, 2021)

  • Fixed issue with virtual key dropdown in Steps
  • Increased the size of some dropdowns for high DPI settings
  • Updated to ClearScript 7.2
  • Changed console logging timestamps to 24 hour

New in Portable StrokesPlus.net 0.5.5.2 (Nov 24, 2021)

  • Added manual config setting for different key to stop recording macro
  • See here to find the valid key code value for the key you want to press:
  • https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
  • StrokesPlus.Configuration.Settings.CustomMacroStopKey = 0x72; // F3 key
  • Changed SystemWindow.SendClose() to use PostMessage instead of SendMessage Win API call
  • Fixed issue with Steps virtual key dropdown not populating selected value
  • Fixed crash with recording macro and stopping without taking any actions

New in Portable StrokesPlus.net 0.5.5.1 (Nov 21, 2021)

  • Added ClearScript.Core assembly types to script engine for Microsoft.ClearScript namespace
  • Fixed issue with mouse wheel relay under certain configurations
  • Fixed incorrect parameter being showin Loop step
  • Removed logic qualifier from receipt of WM_ENDSESSION message to (maybe) fix crash on logoff
  • Updated ClearScript to 7.1.7
  • Updated WebView2 to 1.0.1020.30
  • Updated Ookii.Dialogs.WinForms to 4.0.0
  • Added Portuguese (Brazil) translation
  • Updated language entries:
  • ScriptHelp.ActionMethod.GetMacroScript.Parameters.category.Description
  • ScriptHelp.ActionMethod.GetRegionFromPoint.Parameters.rows.Description
  • ScriptHelp.ActionMethod.GetStoredObject.Description

New in Portable StrokesPlus.net 0.5.5.0 (Sep 1, 2021)

  • Fixed bug with Text Expansion losing type selection when changing to app without Text Expansions
  • Fixed issue with Image Combo text rendering

New in Portable StrokesPlus.net 0.5.4.9 (Aug 26, 2021)

  • Various stability and state management updates to help eliminate certain errors/crashes
  • Console Topmost setting no longer saved due to complications with starting the window with it set Setting is still present, but only applies during the scope of the process, it is reset to false when S+ first loads

New in Portable StrokesPlus.net 0.5.4.8 (Aug 23, 2021)

  • Close Console form on app unload
  • Added FadeSteps to DisplayTextInfo (default 0) to support fading out like hints
  • Updated language entries:
  • ScriptHelpScriptObjectsDisplayTextInfoText
  • ScriptHelp.ActionMethod.DisplayText.Example.Simple
  • ScriptHelp.ActionMethod.DisplayTextUpdate.Example.Simple

New in Portable StrokesPlus.net 0.5.4.7 (Aug 17, 2021)

  • Added additional info to call tip in autocomplete popup for built in methods, and enabled call tips for sp methods, not just the new class structure
  • Reverted text drawing method change from version 0541, you can enable that method bycalling sp_configEnable2DTextRendering = true;

New in Portable StrokesPlus.net 0.5.4.6 (Aug 13, 2021)

  • Added Exclusion Zones to Applications to define application-specific exclusion zones

New in Portable StrokesPlus.net 0.5.4.5 (Aug 12, 2021)

  • Fixed floater state error during import
  • Updated key mode image text rectangle boundaries

New in Portable StrokesPlus.net 0.5.4.3 (Aug 10, 2021)

  • Fixed error loading Settings window when application has regions defined
  • Fixed issue with error when clicking Cancel on layout rename window
  • Fixed PopupList to align text left
  • Fixed issue with ampersand not rendering in Floaters, PopupList, and ImageCombo
  • Rename floater layout now shows the current name
  • Updated floaters to create and cache background images to improve performance
  • Added S+ icon to uninstaller item in Windows Apps screen
  • Added Import/Export to floater layout menu
  • Note: Layouts only function with floaters based on the GUID generated when they are created, so this would generally be for your own uses or if you were to share floaters
  • Added language entry
  • FloaterLayoutFileFilterName

New in Portable StrokesPlus.net 0.5.4.2 (Aug 8, 2021)

  • Couple quick tweaks with floater text, still more to do but I will need to come back to it

New in Portable StrokesPlus.net 0.5.4.1 (Aug 6, 2021)

  • Fixed (hopefully) issues with DisplayText popup
  • Fixed issue with unicode characters not being rendered in Floaters, PopupList, and ImageCombo
  • Fixed issue with floaters not being shown after releasing ignore key
  • Updated logic which determines best fit floater font size
  • Added missing frmDisplayTextGeneralEvents option in the Trace Options window

New in Portable StrokesPlus.net 0.5.4.0 (Aug 6, 2021)

  • Fixed issue with update installer not starting S+ due to missing temp path
  • Added catch to suppress token saving error during unload

New in Portable StrokesPlus.net 0.5.3.9 (Aug 5, 2021)

  • Fixed error with pressing Ctrl+C in console when no text is selected
  • Fixed error when adding new gesture from action and Gestures section has not been loaded

New in Portable StrokesPlus.net 0.5.3.8 (Aug 4, 2021)

  • BREAKING CHANGES (summarized here from below for visibility)
  • 1. Plugins where the class name is the same as the assembly need to be fully qualified.
  • e.g. SPTesseract must now be referenced as SPTesseract.SPTesseract
  • It seems only a couple of the plugins I made will probably have this issue
  • 2. Removed V8ScriptEngine param from call to static plugin init method StrokesPlusInitStaticPlugin
  • New signature:
  • public static void StrokesPlusInitStaticPlugin() { //your init code here }
  • Existing plugins will continue to work as before, however it is recommended you update them and
  • do not use the engine object passed in as it has no lifetime guarantee and should not have ever
  • been passed in to begin with
  • The engine parameter will be REMOVED in the future!
  • Updated autocomplete to include additional references added by user
  • Updated HTMLWindow to check if HTML is a URL (starts with "http") and navigates directly
  • Added SavedMacro type to script engine
  • Fixed issues with Console logging and DisplayText locking
  • Fixed issues with cross thread calls to DisplayTextClose()
  • Moved a couple things around in the StrokesPlus class
  • Updated language entry:
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.HTML.Description

New in Portable StrokesPlus.net 0.4.3.5 (Jul 13, 2021)

  • Fixed issue with serializing floaters when open and settings file converted to JSON
  • Added SystemListView and SystemTreeView from ManagedWinApi project
  • sp.ListViewFromSystemWindow(SystemWindow sysWindow)
  • sp.TreeViewFromSystemWindow(SystemWindow sysWindow)
  • Not really much going on with these, so not adding documentation nor have I really done much - I was just testing something out and pulled these in, but leaving them since they could be useful

New in Portable StrokesPlus.net 0.4.3.4 (Jun 26, 2021)

  • Increased MaxJsonLength to int.MaxValue for JSON settings operations

New in Portable StrokesPlus.net 0.4.3.3 (Jun 24, 2021)

  • Fixed issue with HTML window not setting title
  • Removed mouse wheel event over Steps combo boxes

New in Portable StrokesPlus.net 0.4.3.2 (Jun 23, 2021)

  • Fixed issue with race condition in getting available script engine
  • Updated V8ScriptEngineWrapper.IsExecuting property to handle engines currently executing via non-S+ invoked events
  • Updated to ClearScript 7.1.3
  • Updated to WebView2 1.0.864.35
  • Remove UnhandledException event handler as sometimes recoverable errors were causing S+ to exit
  • Added First/Last/Exists Enumerable extension methods supporting boolean lambda like Where
  • Added overload for GetSystemMetricsByIndex which accepts an object as the parameter, so it can be
  • called directly using the enum: sp.GetSystemMetricsByIndex(SystemMetric.SM_CMONITORS)

New in Portable StrokesPlus.net 0.4.2.7 (May 13, 2021)

  • Added Hardware Events > Devices Changed (example in Script Help > Utilities > AllDevices)
  • NOTE: This event is like Foreground Window Change where it is always executed even if S+ is disabled
  • Also, it can fire even for things like when the screens go to sleep, so be sure your logic is checking for the right devices and/or status
  • Added sp.AllDevices (example in Script Help > Utilities > AllDevices)
  • Updated sp.MouseClick to always use the specified button even if mouse buttons are swapped
  • Updated sp.PopupList to accept three additional color paramaters (optional): sp.PopupList(Items, Location, Font, BackgroundColor, HighlightColor, TextColor)
  • Added Language entries:
  • Enabled
  • tabGlobalHardwareEventsTabName
  • DevicesChangedScriptTab
  • ScriptHelp.ActionMethod.AllDevices.Name
  • ScriptHelp.ActionMethod.AllDevices.Description
  • ScriptHelp.ActionMethod.AllDevices.Returns
  • ScriptHelp.ActionMethod.AllDevices.Example.Full
  • ScriptHelp.ActionMethod.PopupList.Parameters.BackgroundColor.Name
  • ScriptHelp.ActionMethod.PopupList.Parameters.BackgroundColor.Description
  • ScriptHelp.ActionMethod.PopupList.Parameters.BackgroundColor.Type
  • ScriptHelp.ActionMethod.PopupList.Parameters.HighlightColor.Name
  • ScriptHelp.ActionMethod.PopupList.Parameters.HighlightColor.Description
  • ScriptHelp.ActionMethod.PopupList.Parameters.HighlightColor.Type
  • ScriptHelp.ActionMethod.PopupList.Parameters.TextColor.Name
  • ScriptHelp.ActionMethod.PopupList.Parameters.TextColor.Description
  • ScriptHelp.ActionMethod.PopupList.Parameters.TextColor.Type
  • Updated language entries:
  • ScriptHelp.ActionMethod.PopupList.Example.Full

New in Portable StrokesPlus.net 0.4.2.6 (Apr 29, 2021)

  • Fixed bad XML in Chinese translation files preventing them from being released with S+ setup

New in Portable StrokesPlus.net 0.4.2.5 (Apr 17, 2021)

  • BREAKING CHANGE: Updated sp.ConsumePhysicalInput to accept a optional second parameter named timeout which specifies how long to wait until physical input is re-enabled. This is to prevent accidentally locking yourself out of the computer if sp.ConsumePhysicalInput(false) isn't called. Existing scripts will now inherit a default timeout of 60 seconds.
  • The timeout parameter can be any number of seconds, or 0 (zero) for infinite, which is how it previously behaved
  • Standard Windows 10 configurations and via standard methods of running S+ should also re-enable input if you press Ctrl+Alt+Delete and Lock your Windows session, then unlock
  • Tweaks to loading form
  • Updated language entry: ScriptHelp.ActionMethod.ConsumePhysicalInput.Example.Simple
  • Added language entries:
  • ScriptHelp.ActionMethod.ConsumePhysicalInput.Parameters.timeout.Name
  • ScriptHelp.ActionMethod.ConsumePhysicalInput.Parameters.timeout.Description
  • ScriptHelp.ActionMethod.ConsumePhysicalInput.Parameters.timeout.Type

New in Portable StrokesPlus.net 0.4.2.4 (Apr 11, 2021)

  • Updated settings window to load sections on demand, instead of everything every time
  • Once a section is loaded, it remains loaded while the Settings window is open, like before
  • This should be a perfectly safe update, but make sure to backup your config...which you SHOULD be doing anyway!
  • Minor tweak to global unhandled exception presentation logic

New in Portable StrokesPlus.net 0.4.2.3 (Apr 5, 2021)

  • Changed plugin loading logic to prevent multiple plugin class instances/copies.
  • NOTE: This means that plugins, once loaded, remain the same class/type until S+ is restarted. This is to prevent issues with ctors repeating logic/bindings and a host of other potential memory leaks/performance degradation

New in Portable StrokesPlus.net 0.4.2.2 (Apr 5, 2021)

  • Fixed issue with static plugins not actually being treated statically (non-singleton) due to the way S+ dynamically loads the plugins via bytestream. This shouldn't cause any issues, in fact it should resolve issues and multiple bindings.

New in Portable StrokesPlus.net 0.4.2.1 (Mar 23, 2021)

  • Added portable bit to update check URL
  • Changed async keyboard and mouse hooks to use threadpool instead of creating new threads
  • Updated PopupList to manually call activate to ensure it has focus; One user has reported issues with the PopupList not always having focus, but I cannot reproduce
  • Updated PopupList so if the height would exceed the height of the screen, to enable multi-column mode
  • When in multi-column mode, the Left and Right arrow keys move between items instead of navigating up and into sub items, though Enter and Backspace still perform these functions

New in Portable StrokesPlus.net 0.4.2.0 (Mar 15, 2021)

  • Updated PopupList to ensure the poopup is visible (not clipped at edge of screen)
  • Updated GetProcessPath to still return what it retrieved, if driver letter path didn't resolve
  • Added lock around Apply/OK to prevent concurrent execution
  • Added language entries:
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.NoFrame.Name
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.NoFrame.Description
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.NoFrame.Type

New in Portable StrokesPlus.net 0.4.1.9 (Mar 12, 2021)

  • Upgraded ClearScript to version 7.1.1
  • Upgraded WebView2 to 1.0.774.44
  • This release of WebView2 supports virtual host names, which allows you to use a file system folder to be the root of a virtual host name, allowing for referencing resources in that folder and utilizing public distributions in source (like jQuery CDN script src).
  • The virtual host name is automatically generated using the pattern: https://{handle}.invalid, where {handle} is the integer representation of the handle created for the HTML Window, which is passed into the callback script function.
  • Updated sp.HTMLWindow HTML parameter, if the value is the path to a file, it creates the virtual host name mapped to the folder of the file, and loads the file as the starting page. If a file is passed in, IncludeBootstrapJQuery is ignored.
  • Updated sp.HTMLWindow, adding a new parameter to the end called NoFrame (default false). If true, the HTML Window will be created without a title bar or window border
  • Updated Plug-Ins Add Folder button to use the Ookii VistaFolderBrowserDialog instead of the .NET Framework folder browser
  • Changed how installer handles WebView2:
  • If NOT installed, behaves like it does today, waiting until install is complete
  • If already installed, kicks off the upgrade check into a new process and finishes S+ setup
  • Added Ookii.Dialogs.WinForms, exposed to script engine as ookii:
  • See repo: https://github.com/ookii-dialogs/ookii-dialogs-winforms
  • I will be using some of these dialogs, so figured I would expose the library to the engine
  • Simple example using folder selection dialog
  • var sv = new ookii.Ookii.Dialogs.WinForms.VistaFolderBrowserDialog();
  • var ret = sv.ShowDialog();
  • if(ret === forms.System.Windows.Forms.DialogResult.OK) {
  • sp.MessageBox(sv.SelectedPath, "Selected Path");
  • Updated language entries:
  • ScriptHelp.ActionMethod.HTMLWindow.Parameters.HTML.Description ScriptHelp.ActionMethod.HTMLWindow.Parameters.IncludeBootstrapJQuery.Description
  • Added language entries:
  • ScriptHelp.ActionMethod.PopupList.Name
  • ScriptHelp.ActionMethod.PopupList.Description
  • ScriptHelp.ActionMethod.PopupList.Returns
  • ScriptHelp.ActionMethod.PopupList.Parameters.Items.Name
  • ScriptHelp.ActionMethod.PopupList.Parameters.Items.Description
  • ScriptHelp.ActionMethod.PopupList.Parameters.Items.Type
  • ScriptHelp.ActionMethod.PopupList.Parameters.Location.Name
  • ScriptHelp.ActionMethod.PopupList.Parameters.Location.Description
  • ScriptHelp.ActionMethod.PopupList.Parameters.Location.Type
  • ScriptHelp.ActionMethod.PopupList.Parameters.Font.Name
  • ScriptHelp.ActionMethod.PopupList.Parameters.Font.Description
  • ScriptHelp.ActionMethod.PopupList.Parameters.Font.Type
  • ScriptHelp.ActionMethod.PopupList.Example.Full

New in Portable StrokesPlus.net 0.4.1.8 (Mar 12, 2021)

  • Added sp.PopupList to show a simple list similar to the popup menu, but with keyboard input
  • Added FontFamily to base script engine and editor
  • Changed installer to kick off WebView2 install/update without making you wait for it to finish

New in Portable StrokesPlus.net 0.4.1.7 (Mar 6, 2021)

  • Updated sp.DisplayTextUpdate to also check for background and foreground color changes

New in Portable StrokesPlus.net 0.4.1.6 (Feb 18, 2021)

  • Added missing Type (return) property to GetHelpJson Property entries

New in Portable StrokesPlus.net 0.4.1.5 (Feb 10, 2021)

  • Fixed issue with double-clicking OK in Settings window causing issue
  • Fixed help typo
  • Added sp.GetHelpJson() which returns all of the details from the Script Help window in a
  • structured JSON string format, example section:
  • "SectionLanguage":{
  • "Name":"Language/Culture",
  • "Description":"Functions for getting and changing language culture.",
  • "Methods":{
  • "ChangeCulture":{
  • "Name":"ChangeCulture",
  • "InternalName":"ChangeCulture",
  • "Description":"Changes the current language culture to the specified one.",
  • "Returns":"bool",
  • "SimpleExample":"sp.ChangeCulture('en-US');",
  • "FullExample":"",
  • "Parameters":{
  • "cultureName":{
  • "Name":"cultureName",
  • "InternalName":"cultureName",
  • "Description":"The name of the language culture to make the current culture. Examples: 'en-US', 'pl-PL', 'zh-CN'.",
  • "Type":"string",
  • "Order":1
  • This is just to provide the data, long term I will improve the UI (including search), but someone
  • could use this data within a sp.HTMLWindow to create a search interface

New in Portable StrokesPlus.net 0.4.1.4 (Feb 8, 2021)

  • Removed running WebView2 installer on S+ load until version checks expanded, otherwise someone with a pre-release version of WebView2 could have S+ running WebView2 setup every time S+ starts
  • Updated installer to always install/update WebView2 to ensure the most recent Evergreen version is available, until Microsoft has broader inbox Windows distribution of WebView2
  • Added --disable-background-timer-throttling to HTMLWindow's WebView2 environment to prevent JavaScript timers (setTimeout, setInterval, etc) from running slower when the HTML window is minimized
  • Added global unhandled exception handler
  • Moved plug-in loading block to after all built-in objects are added to the script engine

New in Portable StrokesPlus.net 0.4.1.3 (Jan 30, 2021)

  • Updated to Microsoft ClearScript 7.1.0:
  • If you have any plug-ins which reference ClearScript, they will need to be recompiled, unless
  • you have setup some sort of dynamic loading or late binding to the ClearScript library
  • Added WebView2 Evergreen runtime to installer and directory (MicrosoftEdgeWebview2Setup.exe)
  • If you run the portable version, you will need to install WebView2 manually
  • Added new action function (Script only) to show a window using the Microsoft WebView2 control:
  • sp.HTMLWindow(Title, HTML, ScriptCallback, OnDocumentCreatedScript, ID, IncludeBootstrapJQuery)
  • Title sets the window title
  • HTML is HTML for the document
  • if IncludeBootstrapJQuery is true, HTML is inserted inside the <body> tag
  • ScriptCallback is the name of the script function to handle messages sent from the window
  • ID (optional) string which identifies this window (useful for multiple HTML windows)
  • IncludeBootstrapJQuery Indicates if standard Bootstrap 4 and jQuery 3.51 is included in the HTML
  • if true, HTML is inserted inside the <body> tag, otherwise HTML will be the entire document
  • See this post for examples of using sp.HTMLWindow and sp.HTMLWindowExecuteScriptAsync:
  • https://forum.strokesplus.net/posts/m11883-Using-sp-HTMLWindow-and-sp-HTMLWindowExecuteScriptAsync
  • Updated language entry (typo):
  • ScriptHelp.ActionMethod.WindowsFromTitlePartial.Example.Simple
  • Added language entries:
  • LoadingInstallingWebView2
  • HTMLFormCallbackInvokeErrorTitle
  • HTMLFormCallbackInvokeErrorMessage
  • HTMLFormWebView2NotAvailableTitle
  • HTMLFormWebView2NotAvailableMessage

New in Portable StrokesPlus.net 0.4.1.2 (Jan 21, 2021)

  • Fixed issue with sp.Run requiring enclosing quotes if the full command is a file or folder
  • Added support for static class based plugins to have a method called on script engine init:
  • Passes in the current engine being initialized, this is to alleviate any dynamic logic being handled in a static ctor being lost when the engines are reloaded. This method, if it exists in the plugin's class, will be called any time the engines are reloaded. It will be called for each engine in the script pool, where E is the engine.
  • Use this signature in your plugin: public static void StrokesPlusInitStaticPlugin(V8ScriptEngine E) { //your init code here }

New in Portable StrokesPlus.net 0.4.1.1 (Jan 21, 2021)

  • Updated sp.Run to better handle executables, shell out (docs, URLs), and/or passing parameters
  • For example:
  • sp.Run('notepad')
  • sp.Run('"C:\Temp\Text.txt"')
  • sp.Run('notepad "C:\Temp\Text.txt"')
  • sp.Run('notepad.exe "C:\Temp\Text.txt"')
  • sp.Run('"C:\Windows\System32\notepad.exe" "C:\Temp\Text.txt"')
  • sp.Run(`http://www.youtube.com/results?search_query=gestures`)
  • There are a lot of conditions to check for, so I may not have captured them all correctlyPost to Discord or the forums for any issues where sp.Run doesn't work like Start > Run behaves, though there may be some which won't work, like opening a CLSID
  • Added SupportDLLs folder under Plug-Ins and entry in StrokesPlus.net.exe.config to probe that directory when loading libraries
  • NOTE: I've created a simple plug-in for using Tesseract to recognize text from an image. The size would make the S+ download ~177MB larger if it were built-in, which is why I made it a plug-in instead of forcing it on everyone every update. See this post for more details: https://forum.strokesplus.net/posts/m11855-Tesseract--OCR--Plug-In

New in Portable StrokesPlus.net 0.4.1.0 (Dec 23, 2020)

  • Fixed issue with importing macros when no macros or categories already exist

New in Portable StrokesPlus.net 0.4.0.9 (Dec 22, 2020)

  • Removed unused MyProperty from ActionStepMethod class
  • Native code refactoring (internal)
  • Updated SystemWindow.MoveToScreen to support accepting a Screen object or a screen number
  • Updated language entries
  • ScriptHelp.SystemWindowMethod.MoveToScreen.Description
  • ScriptHelp.SystemWindowMethod.MoveToScreen.Parameters.number.Description
  • ScriptHelp.SystemWindowMethod.MoveToScreen.Example.Simple
  • ScriptHelp.SystemWindowMethod.MoveToScreen.Parameters.number.Name
  • ScriptHelp.SystemWindowMethod.MoveToScreen.Parameters.number.Type
  • ActionStepMethods.MoveWindowToScreen.HelpTip

New in Portable StrokesPlus.net 0.4.0.8 (Dec 22, 2020)

  • Consolidated invoke functions and updated native delegate dynamic classes code for readability
  • Removed unnecessary parameter definition from native delegate dynamic classes
  • Removed unnecessary nop emits from native delegate dynamic classes

New in Portable StrokesPlus.net 0.4.0.7 (Dec 21, 2020)

  • Fixed issues with no param callbacks
  • Fixed issue with no param PInvoke definition

New in Portable StrokesPlus.net 0.4.0.6 (Dec 20, 2020)

  • Upgraded to .NET Framework 4.8 - tested on Windows 7 SP1 and Windows 10
  • Installer now replaces StrokesPlus.net.config - not sure why I specified not to overwrite it
  • Updated fileName parameter of SetMouseCursor in Steps to be show the file browse button
  • Minor code optimizations
  • Added Consume options to mouse wheel events
  • Added sp.NativeModule([optional string name]) which returns a ModuleBuilder
  • Added sp.NativeDelegate(string functionName, Type[], Type) which returns a pointer to a delegate for the specified JavaScript functionName, used for native API callbacks
  • Added sp.NativeDelegateList([string functionName, Type[], Type][]) which returns a list of KeyValuePair<string,IntPtr> items for each delegate. .Key is functionName, .Value is pointer
  • Added sp.RefreshNativeModules() which updates the script engines' NativeModules/NativeDelegates from the dynamic assemblies
  • Added various reflection *Builder extensions for working with dynamic modules/types/methods
  • Added Extensions and Native and Dynamic sections to the Script Help window
  • Updated zh-CN translations
  • Updated language entry:
  • ScriptHelpCategoryTextExposedObjects
  • Added language entries:
  • ScriptHelp.ActionMethod.EnumBuilder.Create.Description
  • ScriptHelp.ActionMethod.EnumBuilder.Create.Example.Full
  • ScriptHelp.ActionMethod.EnumBuilder.Create.Example.Simple
  • ScriptHelp.ActionMethod.EnumBuilder.Create.Name
  • ScriptHelp.ActionMethod.EnumBuilder.Create.Returns
  • ScriptHelp.ActionMethod.IEnumerable.Distinct.Description
  • ScriptHelp.ActionMethod.IEnumerable.Distinct.Example.Full
  • ScriptHelp.ActionMethod.IEnumerable.Distinct.Example.Simple
  • ScriptHelp.ActionMethod.IEnumerable.Distinct.Name
  • ScriptHelp.ActionMethod.IEnumerable.Distinct.Parameters.element.Description
  • ScriptHelp.ActionMethod.IEnumerable.Distinct.Parameters.element.Name
  • ScriptHelp.ActionMethod.IEnumerable.Distinct.Parameters.element.Type
  • ScriptHelp.ActionMethod.IEnumerable.Distinct.Returns
  • ScriptHelp.ActionMethod.IEnumerable.forEach.Description
  • ScriptHelp.ActionMethod.IEnumerable.forEach.Example.Full
  • ScriptHelp.ActionMethod.IEnumerable.forEach.Example.Simple
  • ScriptHelp.ActionMethod.IEnumerable.forEach.Name
  • ScriptHelp.ActionMethod.IEnumerable.forEach.Parameters.name.Description
  • ScriptHelp.ActionMethod.IEnumerable.forEach.Parameters.name.Name
  • ScriptHelp.ActionMethod.IEnumerable.forEach.Parameters.name.Type
  • ScriptHelp.ActionMethod.IEnumerable.forEach.Returns
  • ScriptHelp.ActionMethod.IEnumerable.OrderBy.Description
  • ScriptHelp.ActionMethod.IEnumerable.OrderBy.Example.Full
  • ScriptHelp.ActionMethod.IEnumerable.OrderBy.Example.Simple
  • ScriptHelp.ActionMethod.IEnumerable.OrderBy.Name
  • ScriptHelp.ActionMethod.IEnumerable.OrderBy.Parameters.sortExpression.Description
  • ScriptHelp.ActionMethod.IEnumerable.OrderBy.Parameters.sortExpression.Name
  • ScriptHelp.ActionMethod.IEnumerable.OrderBy.Parameters.sortExpression.Type
  • ScriptHelp.ActionMethod.IEnumerable.OrderBy.Returns
  • ScriptHelp.ActionMethod.IEnumerable.OrderByMultiple.Description
  • ScriptHelp.ActionMethod.IEnumerable.OrderByMultiple.Example.Full
  • ScriptHelp.ActionMethod.IEnumerable.OrderByMultiple.Example.Simple
  • ScriptHelp.ActionMethod.IEnumerable.OrderByMultiple.Name
  • ScriptHelp.ActionMethod.IEnumerable.OrderByMultiple.Parameters.queryString.Description
  • ScriptHelp.ActionMethod.IEnumerable.OrderByMultiple.Parameters.queryString.Name
  • ScriptHelp.ActionMethod.IEnumerable.OrderByMultiple.Parameters.queryString.Type
  • ScriptHelp.ActionMethod.IEnumerable.OrderByMultiple.Returns
  • ScriptHelp.ActionMethod.IEnumerable.Where.Description
  • ScriptHelp.ActionMethod.IEnumerable.Where.Example.Full
  • ScriptHelp.ActionMethod.IEnumerable.Where.Example.Simple
  • ScriptHelp.ActionMethod.IEnumerable.Where.Name
  • ScriptHelp.ActionMethod.IEnumerable.Where.Parameters.pred.Description
  • ScriptHelp.ActionMethod.IEnumerable.Where.Parameters.pred.Name
  • ScriptHelp.ActionMethod.IEnumerable.Where.Parameters.pred.Type
  • ScriptHelp.ActionMethod.IEnumerable.Where.Returns
  • ScriptHelp.ActionMethod.MethodBuilder.AddMethodImplAttributes.Description
  • ScriptHelp.ActionMethod.MethodBuilder.AddMethodImplAttributes.Example.Full
  • ScriptHelp.ActionMethod.MethodBuilder.AddMethodImplAttributes.Example.Simple
  • ScriptHelp.ActionMethod.MethodBuilder.AddMethodImplAttributes.Name
  • ScriptHelp.ActionMethod.MethodBuilder.AddMethodImplAttributes.Parameters.attributes.Description
  • ScriptHelp.ActionMethod.MethodBuilder.AddMethodImplAttributes.Parameters.attributes.Name
  • ScriptHelp.ActionMethod.MethodBuilder.AddMethodImplAttributes.Parameters.attributes.Type
  • ScriptHelp.ActionMethod.MethodBuilder.AddMethodImplAttributes.Returns
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Example.Full
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Example.Simple
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Parameters.typeAttributes.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Parameters.typeAttributes.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Parameters.typeAttributes.Type
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Parameters.typeName.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Parameters.typeName.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Parameters.typeName.Type
  • ScriptHelp.ActionMethod.ModuleBuilder.CreateType.Returns
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Example.Full
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Example.Simple
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.enumName.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.enumName.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.enumName.Type
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.names.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.names.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.names.Type
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.typeAttributes.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.typeAttributes.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.typeAttributes.Type
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.underlyingType.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.underlyingType.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.underlyingType.Type
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.values.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.values.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Parameters.values.Type
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineEnum.Returns
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Example.Full
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Example.Simple
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Parameters.typeAttributes.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Parameters.typeAttributes.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Parameters.typeAttributes.Type
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Parameters.typeName.Description
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Parameters.typeName.Name
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Parameters.typeName.Type
  • ScriptHelp.ActionMethod.ModuleBuilder.DefineType.Returns
  • ScriptHelp.ActionMethod.NativeDelegate.Description
  • ScriptHelp.ActionMethod.NativeDelegate.Example.Full
  • ScriptHelp.ActionMethod.NativeDelegate.Example.Simple
  • ScriptHelp.ActionMethod.NativeDelegate.Name
  • ScriptHelp.ActionMethod.NativeDelegate.Parameters.functionName.Description
  • ScriptHelp.ActionMethod.NativeDelegate.Parameters.functionName.Name
  • ScriptHelp.ActionMethod.NativeDelegate.Parameters.functionName.Type
  • ScriptHelp.ActionMethod.NativeDelegate.Parameters.parameterTypes.Description
  • ScriptHelp.ActionMethod.NativeDelegate.Parameters.parameterTypes.Name
  • ScriptHelp.ActionMethod.NativeDelegate.Parameters.parameterTypes.Type
  • ScriptHelp.ActionMethod.NativeDelegate.Parameters.returnType.Description
  • ScriptHelp.ActionMethod.NativeDelegate.Parameters.returnType.Name
  • ScriptHelp.ActionMethod.NativeDelegate.Parameters.returnType.Type
  • ScriptHelp.ActionMethod.NativeDelegate.Returns
  • ScriptHelp.ActionMethod.NativeDelegateList.Description
  • ScriptHelp.ActionMethod.NativeDelegateList.Example.Full
  • ScriptHelp.ActionMethod.NativeDelegateList.Example.Simple
  • ScriptHelp.ActionMethod.NativeDelegateList.Name
  • ScriptHelp.ActionMethod.NativeDelegateList.Parameters.delegateList.Description
  • ScriptHelp.ActionMethod.NativeDelegateList.Parameters.delegateList.Name
  • ScriptHelp.ActionMethod.NativeDelegateList.Parameters.delegateList.Type
  • ScriptHelp.ActionMethod.NativeDelegateList.Returns
  • ScriptHelp.ActionMethod.NativeModule.Description
  • ScriptHelp.ActionMethod.NativeModule.Example.Full
  • ScriptHelp.ActionMethod.NativeModule.Example.Simple
  • ScriptHelp.ActionMethod.NativeModule.Name
  • ScriptHelp.ActionMethod.NativeModule.Parameters.moduleName.Description
  • ScriptHelp.ActionMethod.NativeModule.Parameters.moduleName.Name
  • ScriptHelp.ActionMethod.NativeModule.Parameters.moduleName.Type
  • ScriptHelp.ActionMethod.NativeModule.Returns
  • ScriptHelp.ActionMethod.RefreshNativeModules.Description
  • ScriptHelp.ActionMethod.RefreshNativeModules.Example.Full
  • ScriptHelp.ActionMethod.RefreshNativeModules.Example.Simple
  • ScriptHelp.ActionMethod.RefreshNativeModules.Name
  • ScriptHelp.ActionMethod.RefreshNativeModules.Returns
  • ScriptHelp.ActionMethod.TypeBuilder.Create.Description
  • ScriptHelp.ActionMethod.TypeBuilder.Create.Example.Full
  • ScriptHelp.ActionMethod.TypeBuilder.Create.Example.Simple
  • ScriptHelp.ActionMethod.TypeBuilder.Create.Name
  • ScriptHelp.ActionMethod.TypeBuilder.Create.Returns
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Example.Full
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Example.Simple
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.enumName.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.enumName.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.enumName.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.names.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.names.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.names.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.typeAttributes.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.typeAttributes.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.typeAttributes.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.underlyingType.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.underlyingType.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.underlyingType.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.values.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.values.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Parameters.values.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedEnum.Returns
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Example.Full
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Example.Simple
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldAttributes.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldAttributes.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldAttributes.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldMarshalArg.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldMarshalArg.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldMarshalArg.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldMarshalAs.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldMarshalAs.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldMarshalAs.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldNames.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldNames.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldNames.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldOffsets.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldOffsets.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldOffsets.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldTypes.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldTypes.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.fieldTypes.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.structLayout.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.structLayout.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.structLayout.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.structName.Description
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.structName.Name
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Parameters.structName.Type
  • ScriptHelp.ActionMethod.TypeBuilder.DefineNestedStruct.Returns
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Description
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Example.Full
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Example.Simple
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Name
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.callingConventions.Description
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.callingConventions.Name
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.callingConventions.Type
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.methodAttributes.Description
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.methodAttributes.Name
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.methodAttributes.Type
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.name.Description
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.name.Name
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.name.Type
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.parameterTypes.Description
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.parameterTypes.Name
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.parameterTypes.Type
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.returnType.Description
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.returnType.Name
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Parameters.returnType.Type
  • ScriptHelp.ActionMethod.TypeBuilder.NewMethod.Returns
  • ScriptHelpCategoryNameExtensions
  • ScriptHelpCategoryNameNativeDynamic
  • ScriptHelpCategoryTextExtensions
  • ScriptHelpCategoryTextNativeDynamic

New in Portable StrokesPlus.net 0.4.0.5 (Dec 20, 2020)

  • Updated the script= command line parameter to reduce complications with proper escaping of script argument. Now assumes script is the only argument (if present) and uses the command line instead of argument style to parse script.
  • Upgraded ClearScript to 7.0.0
  • Due to ClearScript upgrade, VC++ runtime is no longer required (statically linked by ClearScript)
  • Removed VC++ runtime check on S+ start and from installer
  • The files below can be deleted from portable install folder (setup version automatically removes):
  • ClearScript.dll
  • ClearScript.xml
  • ClearScriptV8-32.dll
  • ClearScriptV8-64.dll
  • v8-base-ia32.dll
  • v8-base-x64.dll
  • v8-ia32.dll
  • v8-x64.dll
  • v8-zlib-ia32.dll
  • v8-zlib-x64.dll
  • Language entries obsolete:
  • VC2015RuntimeNotFoundTitle
  • VC2015RuntimeNotFoundMessage

New in Portable StrokesPlus.net 0.4.0.5 (Dec 10, 2020)

  • Updated the script= command line parameter to reduce complications with proper escaping of script
  • argument. Now assumes script is the only argument (if present) and uses the command line instead
  • of argument style to parse script.
  • Upgraded ClearScript to 7.0.0
  • Due to ClearScript upgrade, VC++ runtime is no longer required (statically linked by ClearScript)
  • Removed VC++ runtime check on S+ start and from installer
  • The files below can be deleted from portable install folder (setup version automatically removes)
  • ClearScript.dll
  • ClearScript.xml
  • ClearScriptV8-32.dll
  • ClearScriptV8-64.dll
  • v8-base-ia32.dll
  • v8-base-x64.dll
  • v8-ia32.dll
  • v8-x64.dll
  • v8-zlib-ia32.dll
  • v8-zlib-x64.dll
  • Language entries obsolete:
  • VC2015RuntimeNotFoundTitle
  • VC2015RuntimeNotFoundMessage

New in Portable StrokesPlus.net 0.4.0.3 (Dec 8, 2020)

  • Additional UI tweaks for high DPI settings
  • Added command line support to execute script.
  • Note that S+ must be already running!
  • This sends a WM_COPYDATA message to the first found instance of S+ with the script and exits
  • e.g. StrokesPlus.net.exe script="sp.MessageBox('Test', 'Command Line');"
  • Removed mouse acceleration feature due to stability issues with wheel, will need further analysis
  • Removed "windows" object from script engine and help as it is for WPF and is not loaded for S+
  • Updated language entry:
  • ScriptHelpCategoryTextExposedObjects

New in Portable StrokesPlus.net 0.4.0.0 (Nov 28, 2020)

  • Added sp.SetMouseCursor([string] cursorType, [string] fileName)
  • Valid cursorType values:
  • Arrow
  • IBeam
  • WaitCursor
  • Cross
  • UpArrow
  • SizeNWSE
  • SizeNESW
  • SizeWE
  • SizeNS
  • SizeAll
  • Hand
  • AppStarting
  • Help
  • fileName must be a .CUR or .ANI file type
  • Call sp.ShowMouseCursor() to reset all cursors to Windows default
  • Destroy blank cursor system resources on exit
  • Added language entries:
  • ScriptHelp.ActionMethod.SetMouseCursor.Name
  • ScriptHelp.ActionMethod.SetMouseCursor.Description
  • ScriptHelp.ActionMethod.SetMouseCursor.Returns
  • ScriptHelp.ActionMethod.SetMouseCursor.Example.Simple
  • ScriptHelp.ActionMethod.SetMouseCursor.Example.Full
  • ScriptHelp.ActionMethod.SetMouseCursor.Parameters.cursorType.Name
  • ScriptHelp.ActionMethod.SetMouseCursor.Parameters.cursorType.Description
  • ScriptHelp.ActionMethod.SetMouseCursor.Parameters.cursorType.Type
  • ScriptHelp.ActionMethod.SetMouseCursor.Parameters.fileName.Name
  • ScriptHelp.ActionMethod.SetMouseCursor.Parameters.fileName.Description
  • ScriptHelp.ActionMethod.SetMouseCursor.Parameters.fileName.Type
  • ActionStepMethods.SetMouseCursor.DisplayName
  • ActionStepMethods.SetMouseCursor.HelpTip

New in Portable StrokesPlus.net 0.3.9.9 (Nov 25, 2020)

  • Added .NET List type to script engine, usage below (replace clr.System.Byte with any valid type): var x = new List(clr.System.Byte);
  • Added OS version and current culture code to update check URL parameters
  • Added try/catch in ApplicationMatched method
  • Changed Gesture MatchCount property from uint to ulong
  • Added MatchCount property to Hotkey class

New in Portable StrokesPlus.net 0.3.9.8 (Nov 15, 2020)

  • Added stopIssued and floater to internal parameters list to hide them from the Loop Step params
  • Updated DisplayChange/reload logic to rehook the WinEventHook after display change complete to fix issue with S+ not re-enabling itself properly
  • Fixed typo with ExecutePreviousScript causing it not to work correctly
  • Fixed History script match regex
  • Updated internal class visibility
  • Added Japanese translation (not yet complete)

New in Portable StrokesPlus.net 0.3.9.7 (Oct 29, 2020)

  • Update tabPreferencesKeepHotkeysActiveWhenDisabled translation to add "Registered" to text
  • Fixed issue with crashing when External File does not exist
  • Changed MouseRestrictToRectangle to allow down to 0 px instead of 50px and updated the
  • MouseRestrictToRectangle method to consider if the mouse is along the boundary and not move cursor

New in Portable StrokesPlus.net 0.3.9.6 (Sep 25, 2020)

  • Added forEach extension to IEnumerable for use within scripts dealing with C# list objects. Example: someList.forEach((item,i) => {//do something with item object, i = index of current item}). Note that this is case-sensitive, .ForEach is the standard .NET IEnumerable that doesn't really work well in scripts, .forEach is the custom one designed to work in S+ scripts
  • Updated unregistered hotkey logic to handle the Win/Alt the KEY_UP events when Consume option is selected, e.g. prevent Start Menu from popping up
  • Updated hot keys text box to accept all allowed key combinations
  • Fixed issue with Unregistered hot keys triggering when other (not included) modifiers are pressed

New in Portable StrokesPlus.net 0.3.9.5 (Sep 19, 2020)

  • Fixed issue with Step file browse not showing any files to select
  • Updated zh-CN language

New in Portable StrokesPlus.net 0.3.9.3 (Jun 15, 2020)

  • Yes, seems to have skipped a version because I was working on some tweaks for a user having an odd issue with text expansions under a specific scenario and it wasn't officially released
  • Numerous updates to help make the Settings window more usable (not perfect) with text size > 100%. These changes involved adding a LOT of flow layouts and autosize options being enabled, so you will notice loading the Settings window is slower since it's adjusting/scaling so many elements
  • Really, the UI needs to be converted from WinForms to WPF, but that's a ton of work and I wanted to at least make things a little more functional/tolerable for now

New in Portable StrokesPlus.net 0.3.9.2 (Jun 15, 2020)

  • Added option to text expansion section to disable sending Space, Left, and Delete on token match
  • If checked, S+ will not send SPACE, LEFT, then DELETE after matching a text expansion token, it will only send backspaces for the number of characters in the token - this was originally added to address certain applications with auto-complete popups
  • Added setting to text expansion section to create a delay before clearing the token on match this was added to address certain applications which have a delay in the characters being shown such as a remote terminal which hasn't yet echoed the last character
  • Added language entries tabPreferencesTextExpansionTokenBeforeClearDelay
  • tabPreferencesDisableTextExpansionDisableSpaceLeftDeleteOnMatch

New in Portable StrokesPlus.net 0.3.9.1 (Jun 4, 2020)

  • Not triggering an automatic update for this release pending further testing
  • Added logic to ignore mouse or keyboard event (CallNextHookEx) if the hook is still waiting for a response to a synchronous event and the event was injected by S+ (SendKeys, MouseClick, etc.), as this caused S+ to hang and not be able to even kill the process; reboot was required
  • Removed these properties:
  • MouseHook.EnableSyncHookEvents
  • KeyboardHook.EnableSyncHookEvents
  • Added separate async events instead:
  • MouseHook.OnMouseHookButtonEventAsync
  • MouseHook.OnMouseHookMoveEventAsync
  • KeyboardHook.OnKeyboardHookEventAsync

New in Portable StrokesPlus.net 0.3.9.0 (Jun 2, 2020)

  • Not triggering an automatic update for this release pending further testing
  • Added mouse and keyboard hook event subscriptions, these can be subscribed to via plug-ins or
  • scripts; this is still an experimental feature, use with caution
  • See this post for further details: https://forum.strokesplus.net/posts/m10429-Mouse---Keyboard-Event-Subscriptions
  • By default, events are asynchronous; this is the recommended approach unless you understand and
  • accept the potential consequences as they can cause S+ to become unstable if not done properly
  • Sychronous binding allows you to examine the event and instruct S+ to consume the event
  • Multiple subscriptions to synchronous events or poorly written code can cause poor user experience
  • when simply trying to use Windows as every event has to be passed to and processed by each
  • subscriber. Please exercise responsible judgement when choosing to enable synchronous hook events!
  • Added enable mouse/keyboard hook event subscriptions to Options > Advanced, these options control
  • whether the events can be subscribed to via plug-ins or script.
  • Note that enabling these options and using a plug-in or script, which you do not have the source
  • code to review or interpret, can allow someone to log all of your mouse and keyboard activity!
  • If you have the options unchecked, NO script or plug-in can hook these events.
  • Added logic in script engine reload to disconnect any ClearScript events stored via sp.StoreObject;
  • you will need to reconnect after OK/Apply or Reload...probably best to connect/store via Load script,
  • recommend testing against new __spEngineWrapper.Engine.Name object to only bind events in a single
  • engine, ideally use the last engine to avoid script/event contention
  • Added __spEngineWrapper object to all script engines, which respresents the V8ScriptEngineWrapper
  • for the currently executing engine. See the autocomplete list in the script editor for method and
  • propert names. Note that the IsExecuting property does not report true for event bindings as these
  • happen outside of the normal script execution scope.
  • The __spEngineWrapper.Engine property is a ClearScript V8ScriptEngine object
  • (https://microsoft.github.io/ClearScript/Reference/html/T_Microsoft_ClearScript_V8_V8ScriptEngine.htm)
  • Updated V8ScriptEngineWrapper.Execute to call Interrupt if already executing
  • Added Space Resets Token to Options Text Expansion for use when Space is not a trigger, allowing
  • spaces to still reset the token for matching against text expansions. Note that Tab and Enter
  • already reset the token even if not selected as a trigger.
  • Updated zh-CN translations
  • Added language entries:
  • tabPreferencesEnableMouseHookSubscription
  • tabPreferencesEnableKeyboardHookSubscription
  • tabPreferencesTextExpansionSpaceResetsToken

New in Portable StrokesPlus.net 0.3.8.9 (May 23, 2020)

  • Updated sp.DisplayImage to support right-click to save image and optional allowScrollZooming
  • parameter to enable mouse wheel scrolling (which also allows window to be sized via API)
  • Example:
  • sp.DisplayImage(clip.GetImage(), true); //Image on clipboard, enables mouse wheel scroll zooming
  • Added language entries:
  • ScriptHelp.ActionMethod.DisplayImage.Parameters.allowScrollZooming.Name
  • ScriptHelp.ActionMethod.DisplayImage.Parameters.allowScrollZooming.Description
  • ScriptHelp.ActionMethod.DisplayImage.Parameters.allowScrollZooming.Type
  • Updated language entry:
  • ScriptHelp.ActionMethod.DisplayImage.Example.Simple

New in Portable StrokesPlus.net 0.3.8.8 (May 17, 2020)

  • Updated StrokesPlus.net.exe certificate, I only updated the installer in 0.3.8.5
  • Added .ColorKey to SystemWindow class to set a color key - makes that color transparent for the
  • window. Use Color.Transparent to remove the color key
  • Added link in About to open current location of S+ config file
  • Added language entries:
  • ScriptHelp.SystemWindowProperty.ColorKey.Name
  • ScriptHelp.SystemWindowProperty.ColorKey.Description
  • ScriptHelp.SystemWindowProperty.ColorKey.Type
  • ScriptHelp.SystemWindowProperty.ColorKey.Example.Simple
  • AboutOpenConfigLocation

New in Portable StrokesPlus.net 0.3.8.7 (May 14, 2020)

  • Added .Alpha to SystemWindow class to control transparency, 0 - 255 (0 is completely invisible)
  • Fixed issue with Replace using Regex selecting an extra character before applying the replace
  • Added language entries:
  • ScriptHelp.SystemWindowProperty.Alpha.Name
  • ScriptHelp.SystemWindowProperty.Alpha.Description
  • ScriptHelp.SystemWindowProperty.Alpha.Type
  • ScriptHelp.SystemWindowProperty.Alpha.Example.Simple

New in Portable StrokesPlus.net 0.3.8.6 (May 13, 2020)

  • Dіѕаblеd fаllbасk WМІ mеthоd fоr rеtrіеvіng рrосеѕѕ ЕХЕ nаmе аѕ іt wаѕ саuѕіng Ѕ+ tо frееzе
  • Аddеd hіddеn ѕеttіng (bооl) ѕр_соnfіg.ЕnаblеWМІМеthоdFоrРrосеѕѕFіlеNаmе tо еnаblе thаt mеthоd, but І dоn’t rесоmmеnd uѕіng іt unlеѕѕ аѕkеd – І wіll nееd tо rеvіѕіt thе mоdulе nаmе mеthоdѕ аgаіn
  • Uрdаtеd ѕеvеrаl lаnguаgеѕ duе tо ЅQL іѕѕuе mіѕѕіng ѕоmе trаnѕlаtіоnѕ

New in Portable StrokesPlus.net 0.3.8.5 (Apr 25, 2020)

  • Uрdаtеd соdе ѕіgnіng сеrtіfісаtе…whісh І wаѕn’t аblе tо hаvе thеm uѕе „Rоb“ іnѕtеаd оf „Rоbеrt“ thіѕ tіmе
  • Fіхеd іѕѕuе wіth Rеlаtіvе tо Wіndоw Ехсluѕіоn Zоnе tуре nоt wоrkіng рrореrlу
  • Сhаngеd аlmоѕt аll .ТоLоwеr() саllѕ tо .ТоLоwеrІnvаrіаnt() tо аddrеѕѕ Тurkіѕh (аnd роѕѕіblу оthеr) lаnguаgе іѕѕuеѕ whеn соmраrіng ѕtrіngѕ
  • Fіхеd ѕоmе lаnguаgе rеfеrеnсеѕ fоr trаnѕlаtіоn
  • Uрdаtе zh-СN trаnѕlаtіоn

New in Portable StrokesPlus.net 0.3.8.4 (Apr 3, 2020)

  • Added XmlDocument type to script engine

New in Portable StrokesPlus.net 2.8.6.4 (Mar 21, 2016)

  • Added code to update all actions when renaming a gesture, so it applies the new gesture name to all existing gestures using the previous name
  • Reduced gesture scale width/height, certain gestures were showing outside of the view container
  • Updated the signed installers to support not displaying the UAC message box during slient installs

New in Portable StrokesPlus.net 2.8.6.3 (Mar 7, 2016)

  • Updated gGestureComplete to support queueing during mouse wheel firing events instead of discarding the events when both Lua states are executing
  • Added acSetNumberVariable/acGetNumberVariable and acSetStringVariable/acGetStringVariable actions. These actions allow you to store and retrieve number or string values in a key/value pair form. These value maps persist as long as S+ is running, unlike Lua variables which are cleared anytime the Lua engine is reloaded, which happens when you tell S+ to reload the Lua engine or when you click OK in the main S+ screen. Also, these value maps are shared across the 2 Lua states active in S+ at all times, so you can be sure the stored value will always be persistent and accessible so long as S+ remains running. Note that the number and string maps are independent, so you can use the same variable name in each, as in the example below, they wouldn't overwrite the other.

New in Portable StrokesPlus.net 2.8.6.2 (Feb 20, 2016)

  • Added acGetChildWindows(hwnd), works just like acGetAllWindows except gets child windows of the window handle passed in and uses the table var sp_all_child_windows instead

New in Portable StrokesPlus.net 2.8.6.1 (Dec 22, 2015)

  • Added acGetExecutablePath and acExpandEnvironmentString actions

New in Portable StrokesPlus.net 2.8.6.0 (Sep 6, 2015)

  • Removed static declaration for Parent Class Name Pattern, missed in release 1.9.4 (!)

New in Portable StrokesPlus.net 2.8.5.31 (Aug 28, 2015)

  • Added acEmptyRecycleBins action which calls on Windows to empty all recycle bins

New in Portable StrokesPlus.net 2.8.5.30 (Aug 17, 2015)

  • Corrected documentation for acSendWindowToMonitorByName and acSendWindowToMonitorByHandle
  • Fixed bug in acDisplayBalloonTip where title or text length exceeding the lengths defined in NOTIFYICONDATA would cause S+ to crash
  • Added parameter to acDisplayBalloonTip to optionally play the default sound along with the balloon tip
  • Removed "Executable" from StrokesPlus.exe description, now just StrokesPlus

New in Portable StrokesPlus.net 2.8.5.21 (Aug 9, 2015)

  • Excluded WS_CHILDWINDOW in EnumWindowsProc as top-level window
  • Added #define PSAPI_VERSION 1 to EXE source file

New in Portable StrokesPlus.net 2.8.5.2 (Aug 8, 2015)

  • Added compatibility node to manifest to specify Win 8.1 and Win 10 as supported OS versions
  • Updated setOSVersion function to recognize Win10
  • Updated EnumWindows proc to better handle top-level windows for Windows 10. This could have a negative effect for previous versions of Windows. Please post in the forum if you have a window which is not being recognized; the rules and logic for this is very complicated and inconsistently enforced by Windows, leading to a lot of edge cases

New in Portable StrokesPlus.net 2.8.5.1 (Aug 3, 2015)

  • Updated boost libraries to version 1.58

New in Portable StrokesPlus.net 2.8.5.0 Beta (Aug 3, 2015)

  • No code changes, but upgraded solution and compiled in Visual Studio 2015

New in Portable StrokesPlus.net 2.8.4.4 (Aug 3, 2015)

  • Added acGetDrawColor() and acSetDrawColor() actions to retrieve and update the stroke color of gestures

New in Portable StrokesPlus.net 2.8.4.3 (Aug 3, 2015)

  • Continuing to try to address Windows 10 issue
  • Unhooking the mouse completely and rehooking after SendInput

New in Portable StrokesPlus.net 2.8.4.2 (Aug 3, 2015)

  • Continuing to try to address Windows 10 issue
  • Removed mouse move param from SendInput
  • Moved setWindowState and ClearCaptureVars to EmitStrokeClick()

New in Portable StrokesPlus.net 2.8.4.1 (Aug 3, 2015)

  • Moved SendInput call to separate function invoked by passing a message to the server hWnd to address Windows 10 issue

New in Portable StrokesPlus.net 2.8.4.0 (Jul 24, 2015)

  • This release seems to correct an issue in Windows 10 when there's a Store/Modern app visible. This update may or may not fully correct the problem. Also, there is still a slight, but noticeable, lag when single-clicking the stroke button (right mouse, default) when a modern app is visible. I'm still not sure what Windows is doing to cause that.

New in Portable StrokesPlus.net 2.8.3.3 (May 2, 2015)

  • Added preference for Minimum Gesture Length. This tells S+ how far from the gesture start the mouse needs to have traveled before considering that a gesture has been started (drawn gestures only)
  • Updated language file to include support for new preference
  • language.Preferences.StrokeStyleFrame.GestureLength.Title - "Min. Gesture Length:"
  • language.Preferences.StrokeStyleFrame.GestureLength.Suffix - "px"

New in Portable StrokesPlus.net 2.8.3.2 (May 2, 2015)

  • Few small internal code tweaks
  • Updated code around new option in Ignored tab (Enable S+ If Non-Ignored App Becomes Active) to handle scenarios better and more efficiently
  • Fixed crash in acFindWindowByTitleRegex

New in Portable StrokesPlus.net 2.8.3.1 (Apr 16, 2015)

  • Added option on Ignored tab (lower left) named Enable S+ If Non-Ignored App Becomes Active. This instructs S+ to enable itself if any window becomes active which is NOT in the ignored window list. This will happen even if you've manually disabled S+. The purpose is to have ignored apps that disable S+, but when you leave them, S+ will become re-enabled automatically. Since this behavior overrides even manually setting S+ to disabled, it is not for everyone.

New in Portable StrokesPlus.net 2.8.3.0 (Apr 15, 2015)

  • Compiled using platform toolset Visual Studio 2013 (v120). I have no idea how this may affect compatibility for older versions of Windows, but I have built a new PC and this is what I am running with from now on
  • Fixed issue with ignore buttons not being recognized properly and generally running amok
  • Removed keys from being Stroke buttons; the code was really messy and I do not feel it is in the best interest of productive maintenance and performance of S+

New in Portable StrokesPlus.net 2.8.2.0 (Mar 3, 2014)

  • BREAKING CHANGE: Changed the middle/X1/X2 mouse click scripts' logic to fire on mouse UP instead of mouse down, since that's generally when things do something in windows
  • BREAKING CHANGE: Aforementioned function names changed from "down" to "up", for example sp_middle_mouse_down is now sp_middle_mouse_up
  • Added similar code and options for firing on left and right mouse button up events
  • Note that for all of these mouse click events, they will NOT fire on mouse up of the stroke button; sp_right_mouse_up will not be called if the right mouse button is your stroke button
  • Also note that mouse click event scripts will not fire if the stroke button is currently being held down and S+ is either in an action or actively capturing the mouse (e.g. while drawing)
  • Added acSetNumber and acGetNumber; the only purpose for this action pair is for communicating between Lua states
  • Fixed bug where a few code blocks were waiting if either Lua state was executing, instead of only waiting when both Lua states were in use
  • Updated language file to include support for new preferences:
  • language.Preferences.AdvancedOptionsFrame.AllowLeftClickScript - "Allow Left Click Script*"
  • language.Preferences.AdvancedOptionsFrame.AllowRightClickScript - "Allow Right Click Script*"

New in Portable StrokesPlus.net 2.8.1.1 (Jan 28, 2014)

  • Internal code cleanup
  • Fixed bug where S+ wouldn't honor the proper gesture selection when the only difference was the case of the gesture name ("e" vs "E")
  • Apparently when MS named the message CB_FINDSTRINGEXACT, they didn't *really* mean exact...
  • Fixed bug where S+ wasn't considering the case when renaming a gesture

New in Portable StrokesPlus.net 2.8.1.0 (Jan 27, 2014)

  • Added acRelayGesture to relay/inject the last drawn gesture, this is only supported when a mouse button is the Stroke Button (not Control, Alt, etc.), no modifiers are relayed
  • Added option Relay Gesture on No Match* which will (only for mouse based stroke buttons) replay the original mouse down, mouse movements, and mouse up sequence if there was no match
  • This only replays for basic gestures, not actions with mouse wheel firing enabled nor does it replay with modifiers
  • The purpose of this feature is to allow a simple gesture (right click hold) to pass through to the current window if no match in S+ was found
  • If you have a Global Action which uses the same gesture you want a certain app to be passed to, define an action for that app with the desired gesture and call acRelayGesture() in the Lua script
  • Update language.xml to include language.Preferences.AdvancedOptionsFrame.RelayGestureOnNoMatch (default: Relay Gesture on No Match*)

New in Portable StrokesPlus.net 2.8.0.1 (Jan 27, 2014)

  • Fixed bug in acMouseClick which would always fire X2 if X1 was specified.

New in Portable StrokesPlus.net 2.8.0.1 (Jan 27, 2014)

  • Fixed bug in acMouseClick which would always fire X2 if X1 was specified.

New in Portable StrokesPlus.net 2.7.9.2 (Jan 23, 2014)

  • Updated to new code to properly honor the Only Capture On Defined Applications (no Global Actions) preference

New in Portable StrokesPlus.net 2.7.9.1 Beta (Jan 23, 2014)

  • Added CriticalSection code inside gWheelTick function to hopefully prevent race conditions likely present in version 2.7.9

New in Portable StrokesPlus.net 2.7.9 Beta (Jan 23, 2014)

  • Added Preference - Allow Mouse Wheel Tick Script* which will let you control what happens on each tick (scroll) of the mouse wheel.
  • If enabled, define a function in Global Lua with this template: sp_wheel_tick(control, wParam, lParam, x, y, delta)
  • Each wheel tick will fire that function, passing in the parameters; you can either handle the event or relay it on to the original control
  • Ignored windows will still be ignored for this functionality
  • This functionality and Enable Mouse Wheel Relay cannot be active at the same time, if both options are enabled, the new Wheel Tick functionality wins
  • Updated language.xml, adding a new entry for this preference:
  • language.Preferences.AdvancedOptionsFrame.AllowMouseWheelTick (default: Allow Mouse Wheel Tick Script*)

New in Portable StrokesPlus.net 2.7.8.1 (Jan 16, 2014)

  • Added Cut option to actions
  • Updated language.xml, added language.Menu.Cut for new menu item

New in Portable StrokesPlus.net 2.7.8 (Jan 16, 2014)

  • Added Copy/Paste right-click menu to Actions tree along with some other menu items which perform the same action as the buttons below the action tree
  • The Paste menu item is only available when right-clicking on an App or Global Actions, the opposite is true for Copy
  • If you paste to an app or global where an action with the same name exists, the action will be copied with " (Copy)" appended
  • If there's already an action with " (Copy)" appended to it after the first try, you'll receive a name conflict error and will need to rename one of the actions in the destination
  • Updated Language.xml, adding language.Menu.Copy and language.Menu.Paste to support new popup menu
  • Prevented creation of or renaming to an app called Global Actions (appends " 2", then follows existing name collision code logic)
  • Adding missing Left node buildout on add action

New in Portable StrokesPlus.net 2.7.7.1 (Dec 27, 2013)

  • Added acSetDisplayGamma which allows you to set the RGB gamma across all displays (if supported by the video card)

New in Portable StrokesPlus.net 2.7.7 (Dec 27, 2013)

  • Added acGetMonitorBrightness/acSetMonitorBrightness, they only get/set values on the first physical monitor associated with the monitor handle (will cover 99% of scenarios)
  • Technically a monitor handle can have multiple physical monitors associated, for example when you duplicate a display on a laptop or projector
  • I don't think there's a lot of value in spending the time to handle all those scenarios at the moment
  • Not supported prior to Windows Vista
  • Not all displays or drivers support this function call
  • If this doesn't work for your laptop, I recommend using NirCmd

New in Portable StrokesPlus.net 2.7.6.1 (Dec 3, 2013)

  • Fixed MOD_NOREPEAT line, wasn't properly ORing the var
  • Added acDisableHotkey(hkid) and acEnableHotkey(hkid). These let you temporarily disable and re-enable the hotkey (only within the life/scope of the hotkey's script).
  • Hotkey actions now executed in separate thread instead of the main one

New in Portable StrokesPlus.net 2.7.6.0 (Nov 30, 2013)

  • Fixed bug in mouse wheel scroll action code which caused the cancel timer to reset when in a wheel scroll fire action sequence
  • If Windows 7 or later, hotkeys are also registered with MOD_NOREPEAT to prevent keyboard repeat from sending multiple hotkey messages
  • Updated gesture name code to no longer compare names in a case-insensitive fashion. So you can now have a gesture names "e" and "E".
  • Added hidden setting in StrokesPlus.xml (ShowCopyData) defaulted to 0 (off) to control whether S+ displays string data in a popup upon receiving a WM_COPYDATA message

New in Portable StrokesPlus.net 2.7.5.2 (Nov 8, 2013)

  • Improved Metro window checks for mouse wheel relay

New in Portable StrokesPlus.net 2.7.5.1 (Nov 6, 2013)

  • Updated acCreatePopupMenu code to no longer clear its internal variables; this allows menus to be chained (create another popup menu from a popup menu item)

New in Portable StrokesPlus.net 2.7.5.0 Beta (Nov 4, 2013)

  • Fixed tray icon, if S+ disabled, on resume from sleep the icon was recreated using the incorrect icon
  • Added code to check for Metro windows and skip relaying mouse wheel messages when Enable Mouse Wheel Relay is enabled
  • Added acCreatePopupMenu which lets you create a custom popup menu and have a Lua function called
  • Updated default configs to disable Keep Gesture Window on Top as it can be confusing and have interoperability issues with some apps

New in Portable StrokesPlus.net 2.7.4.0 (Aug 23, 2013)

  • Reverted the prevention of S+ allowing multiple instances. The option is still removed from Preferences as it's not a support running configuration, but those who want to can still do it (it can be unstable on different systems/configurations)
  • Removed unintended duplicate trim timer
  • Changed message box calls in EXE to pass NULL instead of GetForegroundWindow(), possible culprit for issue with multiple instances, and ultimately a harmless change even if it doesn't fix anything
  • Upgrading 2.7.3.3 to release status

New in Portable StrokesPlus.net 2.7.1 (Mar 20, 2013)

  • Updated mouse hook to have more checks for Training Mode, to prevent unexpected errors/crash
  • Added acDisableCapture() and acEnableCapture(), these are different than acDisable or acDisableNext as they control a global flag which tells S+ to forward/ignore the mouse events until acEnableCapture is called, or the Lua states are reinitialized. There aren't many use cases for this pair of actions, but there's at least one person who could use them

New in Portable StrokesPlus.net 2.7.0 (Mar 19, 2013)

  • Fixed bug where S+ wouldn't honor the CheckForOtherGesturePrograms setting
  • Reordered tray menu items for Actions, Hotkeys, Ignored to match the actual tab order
  • Add new preference Only Capture On Defined Applications (no Global Actions) which will instruct S+ to ignore all Global Actions (Hotkeys unaffected by this preference)
  • The mouse/touchpad will only be captured when drawing on a window which is defined as an application in the Actions tab; this is basically a white list mode of operation
  • Ignored app definitions are not processed when Only Capture On Defined Applications (no Global Actions) is checked
  • Note that S+ still maintains the mouse and keyboard hook even when an undefined app is clicked, but immediately calls the next hook. When S+ is disabled from the tray, via acDisable(), or due to an ignored app with the disable option checked, the mouse/keyboard hooks are removed as they always have been.
  • When this new preferences is checked, the Actions tab will still show all of the Global Actions (if any) and you can work with them, but they will not be recognized
  • Due to the existing code, Global Actions still must exist in the tree, even if it's being ignored when the new preference is enabled
  • The Ingored tab will be disabled when the new preference is enabled, since that was an easy on or off to add (it displays, but nothing can be clicked/edited; I'll come up with something better at some point)
  • Pressing the ignore key while the new preference is enabled will always switch the S+ tray icon to the disabled look, even though S+ is not intercepting or interfering with the key strokes in any way
  • When this new option is enabled, the S+ tray icon will show a green dot (blue dot is the normal mode, red dot is training mode, green dot is when running in white list mode)
  • Added language.Preferences.AdvancedOptionsFrame.OnlyDefinedApps ("Only Capture On Defined Applications (no Global Actions)") as a supported language.xml element for the new preference

New in Portable StrokesPlus.net 2.6.9 (Mar 13, 2013)

  • Couple minor layout tweaks to Preferences tab, removed the RGB color edit boxes as they're no longer necessary since the Pick Color button is there
  • Fixed TouchPad finger count default (only on a brand new installation) to 1
  • Fixed issue with Settings window not remembering its maximized state properly (only remembered when you click OK, by the way)
  • Updated Help to include the mention of TouchPad for the Release/Reinitialize on Suspend/Resume option
  • Added "(multiple instances are currently unstable)" to the option in Preferences; I don't recommend using multiple instances at this point in time, it's prone to cause S+ crashes.

New in Portable StrokesPlus.net 2.6.8 (Mar 7, 2013)

  • Added code to destroy the Synaptics object on SUSPEND, so it is recreated on RESUME (if Release/Reinitialize on Suspend/Resume is checked in Preferences)
  • There's an element in StrokesPlus.xml named , it's defaulted to 5000 (milliseconds), you may need longer to ensure the Synaptics software is ready

New in Portable StrokesPlus.net 2.6.7 (Mar 6, 2013)

  • Fixed minor issue with S+ not properly canceling a 1-finger gesture when number of fingers touching increases
  • Minor tweaks UI behavior in Preferences window regarding TouchPad style and availability
  • Default TouchPad finger sequence set to 1 (tap & hold) as it seems this is somewhat standard for right-click emulation on touch systems and ensures S+ doesn't conflict with 2-finger actions by default
  • Changed Cursor Movement Threshold code to allow for less than 25%, any number from 0 up (well, to C++ int type limit) may be entered
  • Fixed issue where first gesture dot stayed on the screen if the gesture timed out and the gesture draw window is configured to not be hidden
  • Updated TouchPad movement to ensure ForceMotion delta is never less than 1

New in Portable StrokesPlus.net 2.6.6 (Mar 5, 2013)

  • Changed About tab Release Date code to pull from LAst Modified instead of Create date
  • 1 finger (press and hold) Preference added along with associated options
  • TouchPads which only support one finger are now supported
  • Added to language templates:
  • language.Preferences.SynapticsFrame.Fingers.One
  • language.Preferences.SynapticsFrame.HoldDeltaText
  • language.Preferences.SynapticsFrame.HoldDeltaSuffix
  • language.Preferences.SynapticsFrame.HoldDelayText
  • language.Preferences.SynapticsFrame.HoldDelaySuffix
  • language.Preferences.SynapticsFrame.StrokeSequence

New in Portable StrokesPlus.net 2.6.5 (Mar 5, 2013)

  • Upgraded 2.6.4 Beta 6 to release status
  • About tab updated to pull version and date from StrokesPlus.exe instead of me typing it in..so let me know if either aren't showing in the About tab
  • Revamped my compile and release process, so hopefully things aren't messed up when you try to install
  • Fixed typo for the following, note the element is Base, not Hotkeys as mentioned in 2.6.4 (Beta 4):
  • language.Base.Messages.ReloadSettingsOpenTitle
  • language.Base.Messages.ReloadSettingsOpenMessage ("Please close all StrokesPlus windows before calling acReload().")
  • Changed the Fingers element to words:
  • language.Preferences.SynapticsFrame.Fingers.Two ("2 Fingers")
  • language.Preferences.SynapticsFrame.Fingers.Three ("3 Fingers")
  • Fixed a couple of XML validation errors in the Language.xml templates
  • The TouchPad code may not be perfect, but good enough to release to the masses.

New in Portable StrokesPlus.net 2.6.3 (Feb 14, 2013)

  • Windows with an extended style of 0x00200000L (WS_EX_NOREDIRECTIONBITMAP) [Metro Apps on Windows 8] are once again included as top-level in the sp_all_windows table returned by acGetAllWindows(1).
  • NOTE: There are certain window classes which are considered top-level, meaning there's nothing I can find which definitively identifies them as actual Metro app windows or simply ghost/listener/placeholder windows. As such, you'll need to use some logic to test for and exclude these windows manually. I've posted a set of scripts which demonstrate this: http://www.strokesplus.com/forum/topic/615/cycle-through-programs
  • It should be noted that acPreviousApplication() and acNextApplication() only work with Desktop windows, not Metro (Windows 8) apps. acGetAllWindows can be leveraged to handle Metro apps as described above.
  • Also, windows with a TOPMOST flag are ignored by acPreviousApplication() and acNextApplication()...This functionality is very difficult to programmitcally put in place in a consistent fashion!
  • To be honest, your best bet is using acGetAllWindows(1) and handling the windows yourself until I can really go through and make Next/Prev work more like the scripts I created for acGetAllWindows(1), but I need a lot more time and testing of the scripts to make sure it's consistent and covers the exclusion list properly

New in Portable StrokesPlus.net 2.6.2 (Feb 11, 2013)

  • Updated setLastActive (internal function) to also exclude considering Charm windows in Win8 as top-level Desktop windows (doesn't affect scripts/actions)
  • Added new preference Allow After Release Script* which, if checked, will cause S+ to execute sp_after_release() if defined in Global Lua. This is useful as a cleanup function after mouse wheel scroll action pairs.
  • Added language.Preferences.AdvancedOptionsFrame.AllowAfterReleaseScript ("Allow After Release Script*") to Language.xml

New in Portable StrokesPlus.net 2.6.1 (Feb 1, 2013)

  • Updated the flow of acKillDisplayText to better handle rapid calls and eliminate ghost text
  • Made refinements to the code for the activate window below mouse wheel feature added in 2.5.8 to better handle the owner window activation.

New in Portable StrokesPlus.net 2.6.0 (Jan 29, 2013)

  • Added acGetAllWindows([0 or 1]) action which populates a global table (created in C++, not by you) named sp_all_windows. This allows you to loop through the table and do whatever you'd like. For example, you want an action which finds all windows of a certain title/class/EXE and do something. Passing 1 only returns top-level desktop windows (usually what you'll want to do), passing 0 returns ALL window handles (a lot); for example, I had 5 programs open, passing 1 returns 5 results consisting of just the main window handles for each app. Passing 0 returned a table of 380 handles! Remember, each button, text box, etc. is considered a window and gets a handle.

New in Portable StrokesPlus.net 2.5.9 (Jan 29, 2013)

  • Added acKillDisplayText() which allows you to force the acDisplayText window to close before the display duration timeout has been reached.

New in Portable StrokesPlus.net 2.5.8 (Jan 28, 2013)

  • Updated setLastActive to ignore Metro app windows and put the calls back when closing the Settings or Gesture Name window which were previously removed. This is just to set focus to the top window so S+ gesture window doesn't have focus, which can cause unexpected/confusing behavior.
  • Added AllowSetForegroundWindow call to the code executed when you click Reload Config and Lua Engine to (hopefully) allow for a workaround when/if S+ isn't able to bring other windows to the foreground.
  • Added currently undocumented action acActivateWindowUnderMouseWheel([0 or 1]) which allows you to tell S+ to activate the window under the mouse cursor when Enable Mouse Wheel Relay is enabled and the wheel is scrolled

New in Portable StrokesPlus.net 2.5.7 (Jan 9, 2013)

  • Ignore and Hotkey tabs now also remember the last selected item (instead of selecting the first one in the list [during the same run only, not after closing S+])
  • Fixed rename hotkey so if you click ok and the text hasn't changed, it doesn't give an error about a hotkey already existing with the same name.
  • Removed the hardcoded S+ hotkeys, they belong under the Hotkeys tab as hotkeys which can be changed or removed:
  • Exit S+: CTRL+SHIFT+ALT+WIN+END - equivalent script: acExit()
  • Disable S+: CTRL+SHIFT+WIN+Z - equivalent script: acDisableNext() acDisable() [use both calls in that order to ensure proper tray icon state if ignore key is part of hotkey definition]
  • Toggle Tray Icon (show/hide): CTRL+SHIFT+WIN+S - equivalent script: acToggleTrayIcon()

New in Portable StrokesPlus.net 2.5.6 (Jan 8, 2013)

  • If S+ doesn't have read/write access to StrokesPlus.xml in the same directory as StrokesPlus.exe, S+ will default to use the %APPDATA%\StrokesPlus\ directory.
  • User files (ActionHelp.xml, Language.xml, StrokesPlus.lua and StrokesPlus.xml) are always used from the directory which StrokesPlus.xml was read/writeable.
  • All installers go to Program Files by default (recommended)
  • All installers create Startup shortcut
  • Replaced default gestures and actions

New in Portable StrokesPlus.net 2.5.5 (Jan 7, 2013)

  • S+ Settings windows now supports Control+Tab and Control+Shift+Tab to change between tabs when S+ is enabled (was easiest to just add to the keyboard hook)
  • Fixed tabbing support and order within Settings tabs
  • May have corrected the random gesture thumbnail disappearing issue (with my luck, probably not)

New in Portable StrokesPlus.net 2.5.4 (Jan 5, 2013)

  • Added acInputBox() for accepting input during an action

New in Portable StrokesPlus.net 2.5.3 (Jan 4, 2013)

  • Updated learn gesture dialog to no longer call setLastActive() on close due to Windows 8 oddities. No significant impact to other versions of Windows.
  • Added the following nodes to language.xml to support added hotkey buttons:
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_BACK
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_FORWARD
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_REFRESH
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_STOP
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_SEARCH
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_FAVORITES
  • language.Hotkeys.HotkeysFrame.Keys.BROWSER_HOME
  • language.Hotkeys.HotkeysFrame.Keys.VOLUME_MUTE
  • language.Hotkeys.HotkeysFrame.Keys.VOLUME_DOWN
  • language.Hotkeys.HotkeysFrame.Keys.VOLUME_UP
  • language.Hotkeys.HotkeysFrame.Keys.MEDIA_NEXT_TRACK
  • language.Hotkeys.HotkeysFrame.Keys.MEDIA_PREV_TRACK
  • language.Hotkeys.HotkeysFrame.Keys.MEDIA_STOP
  • language.Hotkeys.HotkeysFrame.Keys.MEDIA_PLAY_PAUSE
  • language.Hotkeys.HotkeysFrame.Keys.LAUNCH_MAIL
  • language.Hotkeys.HotkeysFrame.Keys.LAUNCH_MEDIA_SELECT
  • language.Hotkeys.HotkeysFrame.Keys.LAUNCH_APP1
  • language.Hotkeys.HotkeysFrame.Keys.LAUNCH_APP2

New in Portable StrokesPlus.net 2.5.2 (Jan 3, 2013)

  • Updated EnumWindows callback proc to also exclude windows with an extended style of 0x00200000L (WS_EX_NOREDIRECTIONBITMAP) as these seem to be Metro windows and don't play well with the intended result of calls which enumerate top-level windows in S+

New in Portable StrokesPlus.net 2.4.8 (Dec 29, 2012)

  • Added Win8LauncherMessage and Win8LauncherTitle to Language.xml. Used when S+ displays a message once about gesture lines not showing in Start screen if OS is Windows 8.
  • Added Windows 8 to the OSVersion variable assignment code block (internal)

New in Portable StrokesPlus.net 2.4.6 (Dec 27, 2012)

  • Added acSendString(lpData, dwData, handle, x, y) [experimental, undocumented]
  • Moved the Lua init functions to be called after all S+ initialization occurs instead in DLLMain

New in Portable StrokesPlus.net 2.4.5 (Dec 21, 2012)

  • Added acGetFileVersion and acGetFileProductVersion

New in Portable StrokesPlus.net 2.4.4 (Dec 6, 2012)

  • The Lua editors (Actions, Hotkeys, Global Lua) will now save their zoom factor. So if you Ctrl+MouseWheel or Ctrl+ / Ctrl- to zoom the font size bigger or smaller, S+ will remember the setting (only if you click Apply or OK)

New in Portable StrokesPlus.net 2.4.3 (Nov 27, 2012)

  • Updated acDisplayText to set the text background color to match the text color to eliminate the white outline

New in Portable StrokesPlus.net 2.4.2 (Nov 23, 2012)

  • Added acDisplayBalloonTip() action to display a custom balloon tip near the S+ tray icon

New in Portable StrokesPlus.net 2.4.0 (Nov 19, 2012)

  • Added ability to specify the spacebar as a stroke button. This is not visible in the interface (just like the Shift key, -3), you must edit StrokesPlus.xml and set the MouseButton node to -4 (-4)
  • There are many usablility issues with this feature, which is why it will not be a regularly supported option. For example, it's impossible to press and hold the spacebar for multiple spaces with the spacebar as the stroke button, this is because the alternative is to have a ton of spaces be sent if the gesture times out, which I feel is absolutely impractical. Also, certain key combinations will not work, such as Alt+Space as S+ considers Alt a modifier and thus assumes you're trying to fire an action which only has Alt defined. Of course, you could create that action and have it use acSendKeys to send the Alt+Space...but again, it's messy and will be hidden from the UI.
  • Using the spacebar also adds extra CPU time when it's set as the stroke button since Windows will spam the space key over and over to the keyboard hook as it's being held down and S+ discards it.
  • Added to Language.xml to support Space bar as a stroke button (only for the tray menu, and only visible when the spacebar is set as the stroke button, like the Shift button) language.Menu.Spacebar

New in Portable StrokesPlus.net 2.3.9 (Nov 14, 2012)

  • Fixed bug with closing settings window without a tree item selected

New in Portable StrokesPlus.net 2.3.8 (Nov 5, 2012)

  • Added some basic registry actions:
  • acRegistryCreateKey
  • acRegistryDeleteKey (will not delete if subkeys exist)
  • acRegistryDeleteValue
  • acRegistryGetNumber
  • acRegistrySetNumber (stores as DWORD)
  • acRegistryGetString (supports REG_SZ and REG_EXPAND_SZ)
  • acRegistrySetString (supports REG_SZ and REG_EXPAND_SZ)

New in Portable StrokesPlus.net 2.3.6 (Nov 3, 2012)

  • Added File Path Pattern as an App/Ignore qualifier
  • Added to language.xml to support new field:
  • language.Ignored.FilePathPattern
  • language.Actions.Application.FilePathPattern

New in Portable StrokesPlus.net 2.3.5 (Oct 29, 2012)

  • Fixed several handle leaks

New in Portable StrokesPlus.net 2.3.4 (Oct 23, 2012)

  • Fixed bug with Control Class Pattern field not being recognized

New in Portable StrokesPlus.net 2.3.3 (Oct 17, 2012)

  • Hotkey tab fields now maintain proper disabled state when appropriate

New in Portable StrokesPlus.net 2.3.2 (Oct 15, 2012)

  • Upgrading hotkeys to release status.
  • MSI and Help files/images included
  • Added acShowHotkeys()
  • Added following language elements:
  • language.Menu.Hotkeys
  • language.Name.Messages.HotkeyExists
  • language.Hotkeys.Title
  • language.Hotkeys.Active
  • language.Hotkeys.HotkeysFrame.Title
  • language.Hotkeys.HotkeysFrame.Modifiers.None
  • language.Hotkeys.HotkeysFrame.Modifiers.Control
  • language.Hotkeys.HotkeysFrame.Modifiers.Alt
  • language.Hotkeys.HotkeysFrame.Modifiers.Shift
  • language.Hotkeys.HotkeysFrame.Modifiers.Win
  • language.Hotkeys.HotkeysFrame.Modifier1
  • language.Hotkeys.HotkeysFrame.Modifier2
  • language.Hotkeys.HotkeysFrame.Modifier3
  • language.Hotkeys.HotkeysFrame.Modifier4
  • language.Hotkeys.HotkeysFrame.Key
  • language.Hotkeys.HotkeysFrame.Keys.None
  • language.Hotkeys.HotkeysFrame.Keys.0
  • language.Hotkeys.HotkeysFrame.Keys.1
  • language.Hotkeys.HotkeysFrame.Keys.2
  • language.Hotkeys.HotkeysFrame.Keys.3
  • language.Hotkeys.HotkeysFrame.Keys.4
  • language.Hotkeys.HotkeysFrame.Keys.5
  • language.Hotkeys.HotkeysFrame.Keys.6
  • language.Hotkeys.HotkeysFrame.Keys.7
  • language.Hotkeys.HotkeysFrame.Keys.8
  • language.Hotkeys.HotkeysFrame.Keys.9
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD0
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD1
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD2
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD3
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD4
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD5
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD6
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD7
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD8
  • language.Hotkeys.HotkeysFrame.Keys.NUMPAD9
  • language.Hotkeys.HotkeysFrame.Keys.Multiply
  • language.Hotkeys.HotkeysFrame.Keys.Add
  • language.Hotkeys.HotkeysFrame.Keys.Subtract
  • language.Hotkeys.HotkeysFrame.Keys.Decimal
  • language.Hotkeys.HotkeysFrame.Keys.Divide
  • language.Hotkeys.HotkeysFrame.Keys.A
  • language.Hotkeys.HotkeysFrame.Keys.B
  • language.Hotkeys.HotkeysFrame.Keys.C
  • language.Hotkeys.HotkeysFrame.Keys.D
  • language.Hotkeys.HotkeysFrame.Keys.E
  • language.Hotkeys.HotkeysFrame.Keys.F
  • language.Hotkeys.HotkeysFrame.Keys.G
  • language.Hotkeys.HotkeysFrame.Keys.H
  • language.Hotkeys.HotkeysFrame.Keys.I
  • language.Hotkeys.HotkeysFrame.Keys.J
  • language.Hotkeys.HotkeysFrame.Keys.K
  • language.Hotkeys.HotkeysFrame.Keys.L
  • language.Hotkeys.HotkeysFrame.Keys.M
  • language.Hotkeys.HotkeysFrame.Keys.N
  • language.Hotkeys.HotkeysFrame.Keys.O
  • language.Hotkeys.HotkeysFrame.Keys.P
  • language.Hotkeys.HotkeysFrame.Keys.Q
  • language.Hotkeys.HotkeysFrame.Keys.R
  • language.Hotkeys.HotkeysFrame.Keys.S
  • language.Hotkeys.HotkeysFrame.Keys.T
  • language.Hotkeys.HotkeysFrame.Keys.U
  • language.Hotkeys.HotkeysFrame.Keys.V
  • language.Hotkeys.HotkeysFrame.Keys.W
  • language.Hotkeys.HotkeysFrame.Keys.X
  • language.Hotkeys.HotkeysFrame.Keys.Y
  • language.Hotkeys.HotkeysFrame.Keys.Z
  • language.Hotkeys.HotkeysFrame.Keys.F1
  • language.Hotkeys.HotkeysFrame.Keys.F2
  • language.Hotkeys.HotkeysFrame.Keys.F3
  • language.Hotkeys.HotkeysFrame.Keys.F4
  • language.Hotkeys.HotkeysFrame.Keys.F5
  • language.Hotkeys.HotkeysFrame.Keys.F6
  • language.Hotkeys.HotkeysFrame.Keys.F7
  • language.Hotkeys.HotkeysFrame.Keys.F8
  • language.Hotkeys.HotkeysFrame.Keys.F9
  • language.Hotkeys.HotkeysFrame.Keys.F10
  • language.Hotkeys.HotkeysFrame.Keys.F11
  • language.Hotkeys.HotkeysFrame.Keys.F12
  • language.Hotkeys.HotkeysFrame.Keys.BACKSLASH
  • language.Hotkeys.HotkeysFrame.Keys.BACKSPACE
  • language.Hotkeys.HotkeysFrame.Keys.CAPSLOCK
  • language.Hotkeys.HotkeysFrame.Keys.COMMA
  • language.Hotkeys.HotkeysFrame.Keys.DASH
  • language.Hotkeys.HotkeysFrame.Keys.DELETE
  • language.Hotkeys.HotkeysFrame.Keys.DOWNARROW
  • language.Hotkeys.HotkeysFrame.Keys.END
  • language.Hotkeys.HotkeysFrame.Keys.ENTER
  • language.Hotkeys.HotkeysFrame.Keys.ESCAPE
  • language.Hotkeys.HotkeysFrame.Keys.GRAVE
  • language.Hotkeys.HotkeysFrame.Keys.HOME
  • language.Hotkeys.HotkeysFrame.Keys.INSERT
  • language.Hotkeys.HotkeysFrame.Keys.LEFTARROW
  • language.Hotkeys.HotkeysFrame.Keys.LBRACE
  • language.Hotkeys.HotkeysFrame.Keys.NUMLOCK
  • language.Hotkeys.HotkeysFrame.Keys.PAGEDOWN
  • language.Hotkeys.HotkeysFrame.Keys.PAGEUP
  • language.Hotkeys.HotkeysFrame.Keys.PAUSE
  • language.Hotkeys.HotkeysFrame.Keys.PERIOD
  • language.Hotkeys.HotkeysFrame.Keys.PRINTSCREEN
  • language.Hotkeys.HotkeysFrame.Keys.QUOTE
  • language.Hotkeys.HotkeysFrame.Keys.RIGHTARROW
  • language.Hotkeys.HotkeysFrame.Keys.RBRACE
  • language.Hotkeys.HotkeysFrame.Keys.SCROLLLOCK
  • language.Hotkeys.HotkeysFrame.Keys.SLASH
  • language.Hotkeys.HotkeysFrame.Keys.SPACEBAR
  • language.Hotkeys.HotkeysFrame.Keys.TAB
  • language.Hotkeys.HotkeysFrame.Keys.UPARROW
  • language.Hotkeys.FormText.LuaScriptTitle
  • language.Hotkeys.FormText.InfoText
  • language.Hotkeys.FormButtons.AddHotkey
  • language.Hotkeys.FormButtons.Rename
  • language.Hotkeys.FormButtons.Delete
  • language.Hotkeys.AvailableActionsFrame.Title
  • language.Hotkeys.AvailableActionsFrame.Info
  • language.Hotkeys.AvailableActionsFrame.Insert
  • language.Hotkeys.AvailableActionsFrame.Messages.InfoPopup.Description
  • language.Hotkeys.AvailableActionsFrame.Messages.InfoPopup.Usage
  • language.Hotkeys.AvailableActionsFrame.Messages.InfoPopup.Returns
  • language.Hotkeys.AvailableActionsFrame.Messages.InfoPopup.Parameters
  • language.Hotkeys.AddHotkeyPopupTitle
  • language.Hotkeys.RenameHotkeyPopupTitle
  • language.Hotkeys.Messages.HotkeyFailure
  • language.Hotkeys.Messages.HotkeyFailureTitle
  • language.Hotkeys.Messages.HotkeyConflict
  • language.Hotkeys.Messages.HotkeyConflictSave
  • language.Hotkeys.Messages.HotkeyConflictTitle
  • language.Hotkeys.Messages.DeleteTreeItem
  • language.Hotkeys.Messages.DeleteTreeItemTitle

New in Portable StrokesPlus.net 2.2.9 (Aug 17, 2012)

  • Minor update to tray icon recreate code when swapping between shells
  • Added additional logic when checking for top-level windows (ensure client window is not empty rect)
  • Added acHideMouseCursor(), acShowMouseCursor(), acAutoHideMouseCursor(hidetimer, rehidetimer)
  • acAutoHideMouseCursor(hidetimer, rehidetimer):
  • hidetimer: How long (in milliseconds) to wait without mouse movement before hiding the mouse cursor. Passing 0 (zero) disables auto-hiding.
  • rehidetimer: How often (in milliseconds) to rehide the mouse cursor if it should be hidden (in case another applications re-displays the cursor)

New in Portable StrokesPlus.net 2.2.8 (Aug 7, 2012)

  • Made a couple small tweaks to ensure password dialog becomes the foreground window when opening from various code paths.

New in Portable StrokesPlus.net 2.2.7 (Aug 3, 2012)

  • Added a simple password protection and encryption feature. From the tray menu, there is now a Password... menu option which allows you to set a password which will encrypt your StrokesPlus.xml file and restrict access to the main configuration window. Since some people may have their passwords in clear text with actions, this provides some simple security for others viewing your StrokesPlus.xml file or opening the actions window and looking at your passwords directly. This change does not affect the StrokesPlus.lua (Global Lua) file in any way and it remains clear text.
  • Added the following language nodes (in Language.zip) to support the new UI elements:
  • language.Menu.Password
  • language.Password.Title
  • language.Password.ChangeTitle
  • language.Password.SetText
  • language.Password.EnterText
  • language.Password.ChangeText
  • language.Password.Password
  • language.Password.CurrentPassword
  • language.Password.NewPassword
  • language.Password.OK
  • language.Password.Cancel
  • language.Password.MatchFailMessage
  • language.Password.MatchFailTitle

New in Portable StrokesPlus.net 2.2.6 (Jul 23, 2012)

  • Removed the syntax highlighting of loadstring and added load (in place of it; same functionality)
  • Made stability improvements to actions which return strings

New in Portable StrokesPlus.net 2.2.5 (Jul 20, 2012)

  • Added acGetMouseCursorType() to retrieve the name of the mouse cursor as: ARROW, IBEAM, WAIT, CROSS, UP, SIZENWSE, SIZENESW, SIZEWE, SIZENS, SIZEALL, NO, HAND, APPSTARTING, HELP, or Unknown

New in Portable StrokesPlus.net 2.2.4 (Jul 18, 2012)

  • Fixed issue with Aggressively Manage Memory that I created during some recent code cleanup, the option was being ignored and assumed off

New in Portable StrokesPlus.net 2.2.3 (Jul 16, 2012)

  • Changed acDisplayText so its dialog is created on its own thread. This allows the script to continue executing while the text is displayed. If you want to have a delay, add a call to acDelay after your call to acDisplayText for the script to pause for a certain amount of time.
  • Updated MSI installer to default to USer AppData folder, to avoid the file virtualization if not running as Administrator
  • Updated MSI installer to create a shortcut in the Startup folder

New in Portable StrokesPlus.net 2.2.2 (Jul 16, 2012)

  • Reverted the changes made to acDisplayText as they introduced some other intermittent display issues and inconsistent behavior. I believe the Lua state change actually addressed the original reason that acDisplayText was changed.Long-term, I'd like to completely change the way this action functions, but for now I'm putting things back to the functionality prior to 2.1.2. These means that calls to acDisplayText once again cause script processing to be on hold until the text display duration has passed. To be honest, I'm not at all happy with this action; it's been nothing but trouble and needs to be completely changed. Though, I need to spend some time to think about how to properly implement it. I apologize for this flip-flop, but the random display oddities were unacceptable.

New in Portable StrokesPlus.net 2.2.1 (Jul 13, 2012)

  • By default, StrokesPlus no longer requires Administrator privileges. For most uses, this is acceptable. However, there are some unexpected behaviors that you may run into. For example, S+ will not be able to control other programs running with elevated privileges, and there may be a couple actions which will not work due the underlying calls to Windows requiring Administrator privileges. If you prefer to run S+ with elevated privileges, you may right-click the StrokesPlus.exe file and select Properties -> Compatibility -> Run this program as an administrator. However, S+ cannot be started automatically with Windows if it opens with Administrator privileges.
  • Added language.Base.Messages.AdminModeMessage and language.Base.Messages.AdminModeTitle to new message box when S+ runs for the first time.

New in Portable StrokesPlus.net 2.2.0 (Jul 13, 2012)

  • Added some calls to hopefully ensure the acDisplayText window always stays on top, and changed a couple things regarding its instantiation
  • Made a couple quick fixes to address the positioning of the gesture dropdown, gesture preview, and stroke color preview for those who have a DPI 100%

New in Portable StrokesPlus.net 2.1.9 (Jul 13, 2012)

  • Fixed a bug with the Disable S+ if this application becomes active (Ignored List) setting; if a rule was made with this setting enabled, any other ignored windows created after that rule would also cause S+ to be disabled if they became active, whether the option was selected or not

New in Portable StrokesPlus.net 2.1.8 (Jul 9, 2012)

  • Added acSetKeyboardHook(0 or 1) [will remain undocumented] to turn the keyboard hook on (1) or off (0)..this is only for troubleshooting scripts so you can use the keyboard if S+ crashes to close the program
  • Created an additional Lua state (total 2) and prevent more than 2 actions from firing concurrently. This is a compromise to allow some level of multi-threading, but preventing S+ crashes when actions were tripping over each other. This was only noticable when firing two actions back-to-back which had calls to acDelay (for the most part) leaving the Lua state unstable if another action fired in the same state, which caused S+ to crash. Now, only two actions can fire simultaneously, each with their own state. However, since these are separate states, they won't share the same values assigned to variables. For example, if you define a global variable named MyGlobalVar in the Global Lua tab and set it to 123, it will be 123 for each state initially, but if you fire an action which sets MyGlobalVar to 321 within a script that is still running while you execute another action which sets MyGlobalVar to 456, in Lua state 1, MyGlobalVar will be 321, but in Lua state 2 it will be 456. Lua state 1 is always the primary state used for actions, state 2 is only used if state 1 is currently executing a script. For the most part, no one will likely be affected by this change, and those who are will likely understand this contention and the necessity for it. Again, it's a compromise to keep some level of functionality prior to this change, even though it led to crashes.
  • If a gesture is completed and state 1 and state 2 are both executing, the gesture will be discarded; if you have Play Sound For No Match checked and a WAV file selected, it will be played when this condition occurs to let you know it was ignored.

New in Portable StrokesPlus.net 2.1.7 (Jul 6, 2012)

  • Removed duplicate gsx declaration in gestureComplete function (internal)
  • Added code to change any pure white color passed into acDisplayText to 254,255,255 since pure white is the transparency color key
  • Added a new parameter to the end of acActivateWindow named method. This allows you to try different methods of activating a window since Microsoft has made it very difficult.
  • Passing 0 uses the default SetForegroundWindow call
  • Passing 1 uses a method which calls AttachThreadInput to temporarily bind S+ to the target window
  • Passing 2 presses the Alt key temporarily during the SetForegroundWindow call (a known hack/workaround)

New in Portable StrokesPlus.net 2.1.6 (Jul 3, 2012)

  • Includes changes from 2.1.51 - 2.1.54.
  • Help files updated

New in Portable StrokesPlus.net 2.1.54 (Jul 3, 2012)

  • Updated setLastActive (internal function) to also not consider the acDisplayText nor Settings windows a valid top-level window for which to set focus
  • Mirrored 2.1.53's code change in the keyboard hook as well
  • Put the gwd variable back in..must've accidentally removed it in 2.1.51 (best guess)
  • Added dwExtraInfo to acMouseMove and acMouseClick for S+ to distinguish its own mouse event injections from others

New in Portable StrokesPlus.net 2.1.53 (Jul 3, 2012)

  • Updated code so acConsumePhysicalInput consumes all input, regardless of whether the stroke button is still held or not.

New in Portable StrokesPlus.net 2.1.52 (Jul 3, 2012)

  • Added acConsumePhysicalInput(bool) action. acConsumePhysicalInput(1) tells S+ to consume ALL physical input (mouse and keyboard). This may be useful if you're about to call a
  • mouse or keyboard action where you don't want any physical input to interfere with the action.
  • But make sure you call again, passing 0 [acConsumePhysicalInput(0)], within the SAME Lua script to enable input or your computer may become unusable!

New in Portable StrokesPlus.net 2.1.51 (Jul 3, 2012)

  • Added bounding coordinates to the exposed variables:
  • gbl = bounding left coordinate (left-most X of the drawn gesture)
  • gbt = bounding top coordinate (top-most Y of the drawn gesture)
  • gbr = bounding right coordinate (right-most X of the drawn gesture)
  • gbb = bounding bottom coordinate (bottom-most Y of the drawn gesture)
  • Mouse Hook now uses CursorInfo coordinates instead of those from MSLLHOOKSTRUCT

New in Portable StrokesPlus.net 2.1.4 (Jul 2, 2012)

  • Fixed the acDisplayText window from creating a taskbar button in Windows 8

New in Portable StrokesPlus.net 2.1.2 (Jul 2, 2012)

  • Moved the clear vars check back to its original location as it didn't correct the issue I was hoping, and caused another problem where S+ stopped capturing modifiers or drawing
  • Changed the way acDisplayText works, instead of creating and destroying a full screen window each time, one is created at startup and left in place, showing/hiding as necessary. This also allows a subsequent calls to acDisplayText to replace the displayed text. However, a new call to acDisplayText while one is already displays immediately replaces the existing text, regardless of the previous call's display duration. If you want to display a message, followed by another in the same action, you would need to add a call to acDelay(ms) to pause the action so the next call to acDisplayText doesn't replace the previous one until you'd like it to. Although, any other action that calls acDisplayText during this pause would still replace the text..this is about the best I'm willing to do with this at the moment..I can't imagine it would cause a problem for anyone, especially considering acDisplayText is more flexible now. Therefore, the Lua script immediately following the call to acDisplayText is no longer on hold until the text duration has passed, it executes immediately; so if you want the delay, you'll need to add a call to acDelay(ms).

New in Portable StrokesPlus.net 2.1.1 (Jul 2, 2012)

  • Moved reset cancel delay check to inside the minimum segment length block. Basically, this means that the cancel delay will only be reset if the mouse has been moved more than the pixels defined for the minimum segment length (or if any modifer has been pressed, those always reset the cancel timer, if you have the option checked), instead of even a single pixel movement resetting the cancel timer. I can't think of a reason why this would be an issue, in fact it seems to make sense given the minimum segment length setting exists. Specifically, this addresses the issue of using a pen on a tablet where keeping the pen absolutely still is virtually impossible, leading to having no viable method to use S+ without significant compromise of general Windows usability while also being able to use S+. Unless you're specifically resetting the cancel timer by moving the mouse only a few pixels, this shouldn't affect anyone, or even be noticed (unless you defined a very large minimum segment length value, which doesn't seem practical). If this causes any issues, I'll break this functionality out into a new preference, but since this logic is in the mouse hook, I'd prefer to keep the checks to an absolute minimum for performance reasons; another preference means another CPU cycle for each mouse move. In fact, this change improves performance as the timer isn't killed and restarted every single mouse move, only when the mouse has been moved the minimum segment length. As I said, I believe this will be a completely transparent change, but make S+ far more usable for pen/tablet users.
  • acDisplayText now supports multiple lines of text (using \n for new line)
  • The Settings window now runs on its own thread, eliminating the resize lag and scrollbar drag issues (and just makes sense). Also changed the Settings window so it doesn't redraw itself on each pixel while resizing, to further improve responsiveness when resizing on lower end systems.
  • Moved the clear vars call in gestureComplete from before lua_load to just inside the block, in hopes to maybe fix Andreasvb's issue (fingers crossed, but I don't think it actually will!)
  • Added some checks to help prevent a crash if you have a long running action executing while trying to reload the Lua state (like clicking Apply or OK in the Settings window or Reload from tray menu. It's not air tight as you could have multiple long running actions set in motion and due to the nature of allowing actions running in parallel, they still could trip over each other, but I imagine that would be a very rare scenario; this fixes the most likely (albeit still rare) scenario

New in Portable StrokesPlus.net 2.1.0 (Jul 2, 2012)

  • Updated to Lua 5.2.1
  • Updated to Boost C++ libraries 1.50.0
  • Added additional licenses that were missing
  • Updated StrokesPlus.xml in the MSI packages to the cleaned versions
  • Fixed the missing Help page header image in the MSI install
  • Fixed the missing Action Report and Global Lua missing images in the MSI install
  • Ok, NOW that I've cleaned things up and done all the little maintenance stuff, I'm taking a development break for real this time

New in Portable StrokesPlus.net 2.0.19 (Jun 29, 2012)

  • Upgraded 2.0.18 to release status
  • Fixed Allow After Action Script setting issue. If you change the setting and click Apply, the new setting is now recognized without having to click OK first.
  • For those of you who maintain a language file, note that the text for the Allow After Action Script* preference should no longer include mention about script errors

New in Portable StrokesPlus.net 2.0.18 Beta (Jun 29, 2012)

  • Added sp_before_action and sp_after_action to Scintilla keyword list
  • Changed the way Allow After Script (for sp_after_action functionality) works, should no longer cause script errors for those who received them before. It still remains optional, however, due to the fact that it requires a little extra processing now. So if you don't use it, leave it unchecked.
  • Updated Allow After Action Script option to remove script error warning text

New in Portable StrokesPlus.net 2.0.17 (Jun 29, 2012)

  • The chg ZIPs actually include changes since 2.0.15, since this was such a quick release fix
  • Commands which open About no longer open Global Lua instead.

New in Portable StrokesPlus.net 2.0.16 (Jun 29, 2012)

  • Added Global Lua tab for utilizing the Scintilla editor, for modifying StrokesPlus.lua directly.
  • Added the followinf entries to Language.xml for the new tab:
  • language.LuaTab.Title
  • language.LuaTab.Text

New in Portable StrokesPlus.net 2.0.15 (Jun 28, 2012)

  • Added the highlight hack to the Help button as well
  • Made the Settings window the owner of the Delete confirmation boxes instead of the gesture draw window and made them modal
  • Made the message boxes for the name dialog modal
  • Fixed Aggressively Manage Memory state checking. Changing the option when already enabled didn't disable the functionality until restarting S+ even though the preference was saved successfully

New in Portable StrokesPlus.net 2.0.14 (Jun 28, 2012)

  • Upgraded 2.0.13 to release status, updating Language.zip, help, and created MSI packages
  • Updated some text for new Modifier Check functionality
  • Added Lua bit32 functions to Scintilla highlighting list of keywords
  • Added a hack to help prevent permanent button highlighting in Settings tabs. I never did anything to change the buttons, other than make the dialogs children of the tab control...but I can't find anything regarding how to fix this issue. Disabling and re-enabling the buttons, however, seems to take care of it for now.

New in Portable StrokesPlus.net 2.0.13 Beta (Jun 28, 2012)

  • If you click OK in the Rename window (ignored, app, action, gesture) and the text hasn't changed (case ignored), you no longer receive a warning that the app/action already exists; it just closes.
  • Added a sleep loop in acSendKeys. If an instance of acSendKeys is still being executed in another action, queue the next call to acSendKeys so they don't trip over each other. Hopefully this will prevent a reported crash with using two actions with acSendKeys calls being executed very quickly one after the other
  • Settings window refreshes when receiving WM_STYLECHANGED message
  • Updated text in Actions Report tab
  • Stroke button is once again disabled in the modifiers checkbox group as well as refreshed whenever the Actions tab is clicked and when the Stroke button is changed from the tray menu
  • Stroke button in Preferences is now updated when changed from the tray menu while Settings window is open
  • Added ability (only when Capture Modifiers on Stroke Button Down* is checked under Preferences) to qualify an action based on when the modifier was pressed, either before or after the Stroke button was pressed or either. This allows you to create a true rocker gesture action pair. For example, define both actions with Left Mouse Button modifier, but one with Before Stroke Button and the other action with After Stroke Button and they're two different actions. Note that S+ does not consume a modifier if the stroke button isn't down (otherwise you wouldn't be able to do anything with the mouse!), so for Before Stroke Button actions, the modifier will still be sent to the window under the mouse (or with focus, for key mods). This is just a technical note for those who understand what it means and isn't a change in the way S+ has been functioning.
  • Added the following to the language.xml file to support these new UI elements (not uploaded yet as this is a beta release):
  • language.Actions.ModifierPress.Title
  • language.Actions.ModifierPress.Before
  • language.Actions.ModifierPress.After
  • language.Actions.ModifierPress.Either

New in Portable StrokesPlus.net 2.0.12 (Jun 25, 2012)

  • Upgraded 2.0.11 to release status, updating Language.zip, updated help, created MSI packages
  • Added license details for Scintilla to Licenses.txt and in the About tab
  • Taking a development break for a while, so no changes other than critical bug fixes for some time

New in Portable StrokesPlus.net 2.0.11 Beta (Jun 25, 2012)

  • Pressing Escape on the Name or Gesture Name window now closes the window as if you clicked Cancel
  • Added Scintilla editor for Lua scripts (don't bitch about the color choices, the keyword lists, or the lack of ability to customize any of those yet!)
  • Reset Name window variables when Settings is closed; this ensures sending a close app command to the Name window (which closes the Settings window) doesn't screw up the state of the Name window
  • Info and Insert (action help) buttons are once again able to be clicked

New in Portable StrokesPlus.net 2.0.10 Beta (Jun 25, 2012)

  • Name window is back to being a dialog box, but with Settings as the owner. This means Name is modal to the Settings window, as it should be. But you can still draw gestures on it.
  • Note that for internal reasons, the Save Gesture window (with the gesture name and the thumbail on the left) will remain modal to the gesture draw window and continue to stop capturing until closed.
  • If S+ is enabled, the icon will turn to disabled while the Gesture Name window is open, since you can't draw gestures anyway in that state.
  • If S+ is disabled, clicking New gesture will reactivate the mouse hook until a gesture is drawn
  • Made a couple other minor logic tweaks to the Save Gesture window

New in Portable StrokesPlus.net 2.0.9 Beta (Jun 25, 2012)

  • Name (add, rename) window is no longer a dialog box and can be drawn on.
  • Name window title now better reflects its intention
  • Added language.Actions.AddAppPopupTitle to Language.xml
  • Added language.Actions.AddActionPopupTitle to Language.xml
  • Added language.Actions.RenameAppPopupTitle to Language.xml
  • Added language.Actions.RenameActionPopupTitle to Language.xml
  • Added language.Actions.RenameGesturePopupTitle to Language.xml
  • Added language.Ignored.AddPopupTitle to Language.xml
  • Added language.Ignored.RenamePopupTitle to Language.xml
  • Fixed issue which caused Lua script window to retain prior action's script when adding a new action

New in Portable StrokesPlus.net 2.0.8 Test (Jun 25, 2012)

  • Fixed Rename and Delete buttons in the Ignore tab so they're enabled properly

New in Portable StrokesPlus.net 2.0.7 Test (Jun 25, 2012)

  • Releasing this is a test build since the last couple were plagued with problems
  • Multiple changes to hopefully address stability/usability issues

New in Portable StrokesPlus.net 2.0.6 Beta (Jun 25, 2012)

  • If S+ fails to parse StrokesPlus.xml, it no longer saves StrokesPlus.xml when exiting
  • The Application and Action Active checks now defaults to checked for new actions
  • Fixed some file opening code which should resolve the crashes people were having in 2.0.5; due to the nature of this issue, I would recommend restarting Windows first.
  • S+ was locking up file objects and may still have issues without a reboot..of course, if it works without a reboot, great..but in case it's crashing, try rebooting
  • first to make sure all file handles/objects are released.
  • Reverted all DPI changes as another possible cause of the crashing issues
  • If this doesn't do it, I'll have to go back to saving and refreshing the config for changes as the next step.

New in Portable StrokesPlus.net 2.0.5 Beta (Jun 25, 2012)

  • Same as before, report bugs starting with [BETA].
  • Added acShowSettings() to open the new settings window to whichever tab it was last at. The existing acShowPrefs(), etc. actions still function as you would expect
  • Note that certain actions, especially those using acSendMessage, acPostMessage, and acSendKeys, used on the S+ window may cause very unpredictable behavior
  • Set S+ as DPI-aware. This was supposed to override DPI settings and seems to do so on Win XP, but not Win 7. However, it's usable at 125% and 150% so I'm not going to pursue for now.
  • Proper Settings tab is now selected when you call a action which sets a different tab as the active one and the Settings window is already open
  • Do not create an action that uses the mouse wheel when Fire on mouse wheel is enabled to call acShowSetting(), it causes problems and leads to S+ not capturing gestures until re-opened
  • Hopefully fixed a race condition which caused the image list in Actions and Actions Report to sometimes collide, leaving the wrong gesture thumbnail size in one of the tabs.
  • Turns out it didn't fix it..worst-case scenario for now, just close and re-open the window and the thumbnails should be fine...if not, let me know, otherwise I'm going to keep working on it.
  • Added Action Active, Application Active, and Rule Active for Applications, Actions, and Ignored Actions. Note that if you manually tinkered with StrokesPlus.xml relating to the enabled attribute,
  • you could have unexpected behavior. I would recommend backing up your StrokesPlus.xml file, opening up Settings and deleting any old apps/actions and duplicates (dupes will cause very
  • unprediectable behavior). In theory, this shouldn't be an issue for nearly everyone, but just so it's said. Disclaimer out of the way, this new feature lets you disabled a whole app,
  • an action, or an ignored rule so you can keep them around but turned off. The checkboxes are in the lower right for apps/actions, and below the Global checkbox for ignored windows
  • Note that the Actions Report window only shows ACTIVE actions
  • Changed the logic for New/Rename/Delete Gesture to be in line with the overall Settings window Apply/OK/Cancel logic. Now, nothing changed via the Settings window nor tray menu is saved to your
  • config file unless you click OK in the Settings window, click OK on the Gesture Name window while in Training Mode (not while creating a new gesture from the Settings window), or Exit S+ normally.
  • Clicking Apply simply applies the settings in memory, but does not save your config file. This allows you to make all kinds of changes in the Settings window, but not actually commit anything
  • to disk unless you do one of the 3 steps listed above. This also means you can click Reload Config and Lua Engine from the tray menu to revert the settings to what's saved in your config;
  • again, assuming you haven't performed any of those 3 steps.
  • Clicking Cancel in the Settings window reloads the config file from disk; so if you've been in and out of the window, made new gestures (via clicking New, not via Training Mode), etc. but never
  • performed one of the 3 steps, they will be lost since clicking Cancel would seem to indicate you want to abort all changes. However, clicking the X to close Settings does NOT perform a reload
  • from disk, for whatever that's worth to know. That gives you the option to Apply the setting, not save it, and not cause a reload of your config file.
  • Added language.Actions.Application.Active for new checkbox
  • Added language.Actions.Active for new checkbox
  • Added language.Ignored.Active for new checkbox

New in Portable StrokesPlus.net 2.0.4 Beta (Jun 25, 2012)

  • Moved all core windows into a single, tabbed window. More UI changes are coming, but this was the first step in making the next round of updates
  • This has been such an unbelievable mind-fuck to make happen, so I'll probably be taking a little break!
  • You can now draw on the S+ window!
  • Opening the Settings window is a little slow since it's loading up a lot of resources into one window, I'll keep tweaking it to improve performance
  • Resizing the Settings window is VERY choppy, but I'll try to work on that at some point..at least you really only need to do it once =)
  • Changing tree nodes can be choppy on updating the window as well..I'm sure there's something I'll find that will fix all of the issues, but I've got to draw the line here and recuperate
  • The Settings window remembers if it is maximized or not
  • The keyboard hook now stops monitoring keystrokes during an acSendKeys operation
  • Prevented ignore key from being recognized if a S+ window has focus as it was causing unexpected behavior when copying/pasting (if CTRL key is set to ignore)
  • To test the ignore key with the window open, change focus to a different window first
  • Fixed an issue which caused S+ to crash if the OSD (acDisplayText) was displayed while a S+ window was open and the S+ window was closed before the OSD went away..yea, that was fun to find and fix.
  • Set the Lua script window to Courier New font (just a small change for now, until better editor in place)
  • Made various code updates since all UI is in the DLL now. Let me know if you experience anything odd, specifically relating to saving settings
  • For those with DPI settings other than Normal (100%) I'm sure things will look ugly..that's on the to do list
  • Langauge.xml has not been updated on the site download as this is a Beta release
  • Added language.Base.Messages.LuaScriptError to Language.xml
  • Added language.Base.Messages.GestureTooShortTitle to Language.xml
  • Added language.Base.Messages.GestureTooShortMessage to Language.xml
  • Added language.Gestures.Title to Language.xml for future Gestures tab text
  • Added language.Gestures.SavedImmediately to Language.xml for future Gestures tab text indicating gesture changes are saved immediately
  • Added language.Settings.Title to Language.xml for Settings window title
  • The following Language.xml are transitional until the Gestures tab is created and the Actions tab is completely overhauled
  • language.Preferences.OK will be used for the Settings window OK button text (may be left as is in existing Language files, caption/intent is not changing)
  • language.Preferences.Cancel will be used for the Settings window Cancel button text (may be left as is in existing Language files, caption/intent is not changing)
  • language.Preferences.Save will be used for the Settings window Apply button text (may be left as is in existing Language files, caption/intent is not changing)
  • language.Preferences.Help will be used for the Settings window Help button text (may be left as is in existing Language files, caption/intent is not changing)
  • language.Actions.Title will be used for the Actions tab in the Settings window (may be left as is in existing Language files, caption/intent is not changing)
  • language.Ignored.Title will be used for the Ignored tab in the Settings window (may be left as is in existing Language files, caption/intent is not changing)
  • language.Preferences.Title will be used for the Preferences tab in the Settings window (may be left as is in existing Language files, caption/intent is not changing)
  • language.Report.Title will be used for the Report tab in the Settings window (may be left as is in existing Language files, caption/intent is not changing)
  • language.Actions.FormButtons.Autosave will be used for the Auto Save check box in the Settings window (may be left as is in existing Language files, caption/intent is not changing)
  • Note that due to the Unicode issue, this means the tabs will *not* properly display complex characters..still trying to figure out a way around that problem

New in Portable StrokesPlus.net 2.0.3 (Jun 18, 2012)

  • Dragging the Find Window crosshair over windows now populates the Control ID field as well, if one exists for the control under the mouse cursor.
  • acSendKeys now activates the top-level window below the S+ gesture draw window if any of the S+ windows are the foreground window; if S+ has focus while a key combination which included the ignore key, it left S+ in an odd state where you had to tap the ignore key to stop S+ from ignoring gestures. If this causes unexpected behavior, use acActivateWindow in your action to assign focus as needed.
  • Realized that when I added the Lua parameter checks, it broke passing true/false as parameters. Updated the Help and Action Reference to reflect "0 for False, 1 for True" in place of "boolean"

New in Portable StrokesPlus.net 2.0.2 (Jun 18, 2012)

  • Fixed Control ID not being populated in Ignored window

New in Portable StrokesPlus.net 2.0.1 (Jun 18, 2012)

  • Added Control ID as an application qualifier
  • Added acGetControlID action
  • Added language.Actions.Application.ControlID to Language.xml to support new field in Actions window
  • Added language.Ignored.ControlID to Language.xml to support new field in Ignored window

New in Portable StrokesPlus.net 2.0.0 (Jun 15, 2012)

  • Beta 1.9.903 upgraded to release status 2.0.0
  • Changed the way S+ determines the last active window prior to opening a S+ window, now it just starts at the gesture draw window's handle and works backward until a top-level.
  • This hopes to prevent the S+ draw window from ever having focus, which can cause odd behavior.
  • Added check box in Ignored window that instructs S+ to disable itself completely (unhook mouse/keyboard) if the application becomes the active window at any point in time.
  • Once disabled via this method, you must manually reenable S+ via single left-clicking the tray icon, right-clicking the tray icon and unchecking Disable StrokesPlus,
  • or via the hotkey SHIFT+CTRL+WIN+Z. The main purpose of this feature is because I play EverQuest II and I want S+ completely out of the way when I'm playing, simply
  • ignoring the window means S+ still checks all ignored windows every time I press the right mouse, which I do all the time in-game and I don't want the extra processing
  • to occur..but sometimes I forget to disable S+ before I go in the game; this feature resolves that! Note that there's no reasonably deterministic method to reenable S+
  • after being disabled via this method. Meaning, S+ could disable itself by detecting the game gained focus, but what if I already disabled S+ before opening the game, how would S+
  • know to when to reenable? Basically, this is just a difficult task of state management that isn't worth the time for this rarely used feature.
  • Added language.Ignored. to Language.xml to support new checkbox in Ignored window.

New in Portable StrokesPlus.net 1.9.902 Beta (Jun 14, 2012)

  • Updated "Reload Config" tray menu title to "Reload Config and Lua Engine" to better distinguish the difference between it and acReloadConfig(), the latter which does not (cannot) reload the Lua state
  • The Autosave checkbox in the Actions window is now honored in the Ignored window; so changing between ignored apps will save just like the Actions window, including clicking Close in the Ignored window
  • The gesture preview is now redrawn after restoring the Actions window

New in Portable StrokesPlus.net 1.9.901 Beta (Jun 14, 2012)

  • Added minimize buttons to Actions, Preferences, and Ignored windows
  • Unhooking and rehooking mouse and keyboard while saving/refreshing config

New in Portable StrokesPlus.net 1.9.9 Beta (Jun 13, 2012)

  • S+ will now allow you to draw gestures while S+ windows are open. Note that drawing is NOT captured when drawing on top of an S+ window for internal reasons; draw outside of S+ windows to test
  • Added Apply button to Preferences window for saving Preferences without closing the window (to test settings before leaving the Preferences window)
  • Enabled Save button in Configure Actions window, this let's you save while staying at the selected App/Action, mainly for testing a gesture/script while the window is still open
  • Clicking Save in the Ignored window will do as it always has, except it refreshes the config immediately so you can test without closing the window
  • Note that this is a Beta release as there were several core changes made to support this. BACKUP your StrokesPlus.xml file BEFORE USING! Don't yell at me if something goes wrong.
  • The config and language variables are now shared between the EXE and the DLL, so there's always a possibility that something in that change may not work properly and could result in lost settings.
  • Depending on your preferences relating to the gesture draw window, the S+ windows may stay on top, or fall behind other windows when testing.
  • Added element to language.Preferences in Language.xml to support the Apply button in the Preferences window. Note that since this is a Beta release, I'm not yet updating the posts
  • in the Language forum until this has been tested thoroughly.
  • There is no MSI package for this release. If you're trying S+ for the first time, install 1.9.8 first then replace StrokesPlus.exe and StrokesPlus.dll from the 1.9.9b ZIP file for your platform.
  • Please report bugs to the New Bugs forum, starting with [BETA] to make them easily separated from the current stable release.

New in Portable StrokesPlus.net 1.9.8 (Jun 12, 2012)

  • Added option Allow After Action Script* (may cause script errors) (default off) to enable the sp_after_action functionality removed in 1.9.7; enabling this setting causes script errors for some users for reasons yet unknown.
  • Language.xml template updated to support new preference

New in Portable StrokesPlus.net 1.9.7 (Jun 12, 2012)

  • Made the text to the right of the modifiers section and the text below the app qualifier fields autosize along with the Configure Actions window
  • Moved the bottom buttons in Configure Actions window up a few pixels
  • Removed the sp_after_action functionality due to unknown reasons why it was causing problems for some people; sp_before_action is still included

New in Portable StrokesPlus.net 1.9.6 (Jun 11, 2012)

  • Added sp_app_name (or gapp) and sp_action_name (or gact) as variables available to all scripts
  • Note - This change also updates the sp_before_action and sp_after_action function templates added in 1.9.5 as follows:
  • sp_before_action(gnm,gsx,gsy,gex,gey,gwd,gapp,gact)
  • sp_after_action(gnm,gsx,gsy,gex,gey,gwd,gapp,gact)

New in Portable StrokesPlus.net 1.9.51 (Jun 11, 2012)

  • Updated the Help file header image (courtesy of forum member imafishimafish)
  • Added ability to have global functions (defined in StrokesPlus.lua) to fire before and after all actions.
  • This is helpful if you always want something to happen, like activating the window under the cursor before the action fires

New in Portable StrokesPlus.net 1.9.4 (Jun 8, 2012)

  • Fixed a HUGE issue with App Pattern Recognition; the code was setting the regex expression to const variables...which would cause the first expression to be permanent in memory until S+ was restarted. To be fair, this was some of the earliest code written while I was really unfamiliar with C++, I only spot-checked the code which worked fine...as long as there were no other pattern matches for the same app qualifier!

New in Portable StrokesPlus.net 1.9.3 (Jun 7, 2012)

  • Updated acFindWindow to not assign class or title parameters to an empty string if nil is passed in; this allows you to search by exact title or class, if you pass nil for the other parameter

New in Portable StrokesPlus.net 1.9.2 (May 23, 2012)

  • Updated yet some MORE code paths which led to incorrect tray icon states
  • When in Training Mode, S+ no longer checks for ignored windows as it's irrelevant in that state

New in Portable StrokesPlus.net 1.9.1 (May 19, 2012)

  • Added tray icon to indicate when in Training Mode (blue dot turns red)
  • Middle-clicking tray icon while S+ is disabled will no longer toggle Training Mode state
  • Cleaned up some other code paths which led to incorrect icon state
  • Tray icon caption now indicates training mode
  • Language.xml updated to include under for the tray icon text when in Training Mode
  • Added ability to specify a custom location for StrokesPlus.xml (main config file); StrokesPlus.lua and Language.xml are derived from the command-line parameter so the config must be name be "StrokesPlus.xml".

New in Portable StrokesPlus.net 1.9.0 (May 16, 2012)

  • Left single-click on S+ tray icon to toggle disabled mode (was double-click)
  • Left double-click on S+ tray icon now opens the Actions window.
  • Middle single-click on S+ tray icon now toggles Training Mode
  • Middle double-click on S+ tray icon now opens Preferences window

New in Portable StrokesPlus.net 1.8.9 (May 14, 2012)

  • Corrected key modifier capture logic which prevented some modifier keys from being recognized if pressed together after the stroke button was pressed
  • Added a try/catch around the DPI check and assign code; may address an issue one person was having that I cannot reproduce

New in Portable StrokesPlus.net 1.8.8 (May 12, 2012)

  • Updated acSendMessage and acPostMessage to use lua_tounsigned instead of lua_tonumber to address signed number limitation

New in Portable StrokesPlus.net 1.8.7 (May 11, 2012)

  • MDK Edition! [not the game..] (just changed some colors, I had all kinds of neat ideas for blood spatter, etc..but alas, WinAPI makes it too difficult)
  • This release is REALLY red (pretty ugly, TBH), if you want normal colors, download 1.8.6..nothing else has really changed. I just wanted to do something fun with 187 since it won't happen again. But decided to only release it with no real features, so people wouldn't be annoyed =)
  • Updated BOOST libraries to latest version (1.49)

New in Portable StrokesPlus.net 1.8.6 (May 7, 2012)

  • Added option in Preferences for indicating whether to hide the gesture draw window when not drawing a gesture; otherwise the window is sent behind all other windows.

New in Portable StrokesPlus.net 1.8.51 (May 5, 2012)

  • Updated the way the gesture draw window functions. Instead of hiding and showing the transparent window, it is sent to the bottom and brought to the front. This addresses some performance and usability issues.
  • Added Min. Segment Length option in Preferences. This specifies the distance between drawing segments; mainly, this lets you set a minimum draw distance before S+ considers you've started drawing a Stroke.

New in Portable StrokesPlus.net 1.8.4 (Apr 21, 2012)

  • Added acGetProcessIDFromPattern(filepattern)
  • Added acGetWindowFromProcessID(processID)

New in Portable StrokesPlus.net 1.8.3 (Mar 15, 2012)

  • Added necessary logic for when a key is a Stroke button (feature: Capture Modifiers on Stroke Button Down)
  • Fixed bug where Left mouse modifier wasn't being recognized with the new feature
  • Fixed bug which prevented Stroke key from working if no Ignore key was selected

New in Portable StrokesPlus.net 1.8.2 (Mar 15, 2012)

  • Added experimental feature Capture Modifiers on Stroke Button Down. This tells S+ to also capture modifiers at the moment the Stroke button is pressed.
  • Language.zip updated to include element for new option (above) in Preferences

New in Portable StrokesPlus.net 1.8.1 (Mar 14, 2012)

  • Added DPI modifier to App definition fields to help position them better when Windows text size > 100%

New in Portable StrokesPlus.net 1.8.0 (Mar 13, 2012)

  • Added simple About box with version and release date
  • Added acShowAbout()
  • Language.xml updated to support About UI elements

New in Portable StrokesPlus.net 1.7.9 (Mar 10, 2012)

  • Added try/catch around acShellExecute
  • Fixed issue with S+ not forwarding the keystate properly when relaying WM_MOUSEWHEEL

New in Portable StrokesPlus.net 1.7.8 (Mar 9, 2012)

  • Fixed issue with Help button not working in Preferences window
  • Expanded Sound: label in Prefs
  • Added remembering of last app/action selected in Actions window. Since the tree is destroyed when the window closes, S+ can't store the actual handle to the selected item. So it's based on App name and Action name. This should probably always be fine, but feels like there's a chance for some sequence of events (adding/renaming/etc.) which may cause S+ to not remember perfectly, but I've tested and it seems to work fine.

New in Portable StrokesPlus.net 1.7.7 (Mar 5, 2012)

  • Commented out call next kb hook if action executing. Noting here in case of any odd issues.
  • Added experimental feature Fire Recognition on Mouse Wheel Scroll in Preferences. If checked, S+ will STOP recognizing any additional drawing/modifers and fire actions which met the criteria at the time the mouse wheel was scrolled up or down, which INCLUDES the current Scroll Up or Scroll Down event modifier. For example, if you have Increment Volume set as no gesture and only Scroll Up, then when you press the Stroke button and Scroll UP, the volume will be incremented immediately (without releasing the Stroke button); each scroll up will fire the Increment Volume action while you're holding the Stroke button. If you have Decrement volume set to no gesture and Scroll Down modifier, you could hold the Stroke button and scroll up and down, incrementing or decrementing the volume each wheel tick. Even though they're two separate actions, the base criteria (only the Stroke button, no gesture) match, so the Scroll Up or Scroll Down events drives which action is fired. Yes, this is a confusing feature, but it's a compromise for those who want to hold the Stroke button, scroll up/down, and have actions fire with each tick of the wheel (like scrolling through Chrome browser tabs, for example).
  • Since there's a new UI element in Preferences, Language.zip has been updated.

New in Portable StrokesPlus.net 1.7.6 (Mar 5, 2012)

  • Fixed issue with acSendKeys not sending VKEY characters

New in Portable StrokesPlus.net 1.7.5 (Mar 2, 2012)

  • Fixed issue with not being able to select Global Actions if Global Actions has no child actions

New in Portable StrokesPlus.net 1.7.4 (Mar 1, 2012)

  • Added extra parameter (method) to acTileWindows to signal whether S+ does the tiling, or Windows handles it via the TileWindows API call, 0 or false means S+ will tile, 1 or true means Windows will handle it

New in Portable StrokesPlus.net 1.7.3 (Mar 1, 2012)

  • Added acTileWindows() action
  • Updated help for acSetWindowSize, it doesn't accept left and top parameters. That functionality was moved to acMoveWindow, but the actions and help still shows the old signature.

New in Portable StrokesPlus.net 1.7.2 (Feb 24, 2012)

  • Fixed positioning of stroke color preview in Preferences window

New in Portable StrokesPlus.net 1.7.1 (Feb 24, 2012)

  • Added code to get the gesture window rect when a gesture is complete. This may help to correct a difficult to reproduce issue with multiple monitors and the line being drawn on the wrong screen. Note that I'm doing this after a gesture is complete, so it's possible that it's on the wrong screen, then the next gesture it's fixed. I don't want to fire this call everytime the stroke button is pressed for performance reasons when not intended to draw anything, but doing it after a gesture is complete doesn't slow anything down (not that it's an intensive call to begin with).
  • Added support for Actions window title when using Languages.xml along with tag under
  • Fixed typo on Actions screen ("Authosave")
  • Updated Window layouts to leave room for longer text due to translations

New in Portable StrokesPlus.net 1.7.0 (Feb 23, 2012)

  • Added support for languages other than English. Note that no other languages are supplied, but if Language.xml exists along side StrokesPlus.exe, it will be used. See the Other Languages forum for additional details and to download the Language.xml template. Note that S+ doesn't currently support UNICODE, so some languages may not be possible, like Chinese, for example.
  • Added option to tell S+ to cancel recognition once the Cancel Delay is reached, regardless of mouse movement or other modifier events
  • Reverted small code optimization due to crash report.

New in Portable StrokesPlus.net 1.6.9 (Feb 22, 2012)

  • Fixed issue with conflict detection comparing actions which have no gesture nor modifiers assigned.
  • Compiled EXE favoring small code to reduce footprint. DLL is still set to favor speed since that's where all the magic happens. Please let me know if you're noticing slow-downs when working with the UI.

New in Portable StrokesPlus.net 1.6.8 (Feb 22, 2012)

  • Updated to loadHookConfig before setting hook; this ensures mouse is responsive while config is being loaded (benefit for low-powered systems)
  • Added option in Preferences to always keep the gesture window on top. This can be helpful for low-power systems and prevent flickering UI elements for Windows XP users.
  • However, there may be issues with other programs if they react to StrokesPlus' gesture window being above them. Therefore, this is an experimental feature.
  • Added * in Preferences window to denote which features are considered Experimental

New in Portable StrokesPlus.net 1.6.7 (Feb 20, 2012)

  • In SetWindowState, added SWP_SHOWWINDOW to SetWindowPos call, eliminating the need to call ShowWindow prior (very slight performance tweak)
  • Fixed bug which prevented closing Actions window if Autosave was unchecked

New in Portable StrokesPlus.net 1.6.6 (Feb 20, 2012)

  • Updated to only consume the mouse BUTTONUP event if the matching BUTTONDOWN event was also consumed by S+.

New in Portable StrokesPlus.net 1.6.5 (Feb 20, 2012)

  • Introduced action definition conflict detection. If you try to save an action within the same app (including Global) using the same gesture/modifier combination, S+ will warn you about the conflict and ask how you'd like to proceed.

New in Portable StrokesPlus.net 1.6.4 (Feb 18, 2012)

  • Gestures dropdown hidden initially (was only an issue when there are no apps or actions defined at all)
  • Delete, Rename, Save and Autosave checkbox are disabled initially (was only an issue when there are no apps or actions defined at all)
  • Fixed issue with Report and Tree and Gesture dropdown image lists in Actions overwriting each other

New in Portable StrokesPlus.net 1.6.3 (Feb 18, 2012)

  • Swapped File Name and File Name Pattern labels in Actions window, they were reversed

New in Portable StrokesPlus.net 1.6.2 (Feb 17, 2012)

  • Prevented BUTTONUP mouse events from flagging internal mouse modifier variables, only makes sense to capture on BUTTONDOWN. BUTTONUP is still consumed, but doesn't flag the modifer since the button was pressed prior to Stroke button

New in Portable StrokesPlus.net 1.6.1 (Feb 16, 2012)

  • Removed warning if DPI != 96
  • Added some code to adjust manually drawn items for DPI differences; it's far from perfect, but S+ is at least usable (I can't seem to derive the precise scale modifier via code, among other issues). However, Actions window needs at least 1291x768 of space for all buttons to be displayed at 120 DPI and 1613x881 at 144 DPI. Some UI elements are not positioned ideally, but they're usable enough; a heck of a lot better than it was anyway!

New in Portable StrokesPlus.net 1.6.0 (Feb 15, 2012)

  • Gesture dropdown now sorted case-insensitive and puts non-letter characters first
  • Renamed and new gestures also appear in their proper position immediately

New in Portable StrokesPlus.net 1.5.9 (Feb 15, 2012)

  • Made the app and X image list thumbnails a little smaller/better looking (FYI, they're drawn via code, not from images; so they're never going to look fancy!)
  • Replaced gesture dropdown in Actions window, now has gesture thumbnail (note that sorting of the gesture dropdown has also changed, now based on ASCII value of gesture names)

New in Portable StrokesPlus.net 1.5.8 (Feb 14, 2012)

  • Fixed memory leaks present for the last few releases.

New in Portable StrokesPlus.net 1.5.7 (Feb 14, 2012)

  • Unmerged Gestre column in Report window, just all separate columns
  • Added gesture thumbnails to Actions window tree

New in Portable StrokesPlus.net 1.5.6 (Feb 13, 2012)

  • Merged Gesture and (Gesture) Name into same column; added a no gesture image
  • Enabled full row select on Report grid
  • Fixed issue with clicking Refresh in Report adding duplicate columns to grid

New in Portable StrokesPlus.net 1.5.0 (Feb 9, 2012)

  • Added parameter type defaulting to all actions to prevent S+ from crashing if an invalid parameter type is passed in. If a parameter is supposed to be a string, but a non-string was specified, it will be passed in as an empty string (""). There are certain defaults like font name for acDisplayText which I've set to "Arial" and some others where empty or NULL doesn't make the most sense.

New in Portable StrokesPlus.net 1.4.9 (Feb 9, 2012)

  • Removed pDataArray for GestureComplete thread, it's not needed
  • Removed acClearCaptureVarsBeforeLua(), after realizing it's completely unnecessary based on the existing program flow and actually wouldn't have done anything of significance
  • Added check to acSendKeys to prevent crash if parameter isn't a string (will make my way through all actions, checking all parameters are correctly typed)

New in Portable StrokesPlus.net 1.4.8 (Feb 8, 2012)

  • Uncommented the code that loads alien.struct .. not sure why that was commented out

New in Portable StrokesPlus.net 1.4.7 (Feb 8, 2012)

  • Added code to make sure Help button doesn't look weird after fast inward resizing
  • Added option in Preferences to disable the multiple instance warning
  • Added hotkey (CTRL+SHIFT+WIN+S) and action acToggleTrayIcon() to toggle whether the S+ tray icon is visible or hidden

New in Portable StrokesPlus.net 1.4.6 (Feb 4, 2012)

  • Used a better method of setting the minimum Actions window size so it can't be dragged smaller than the default size
  • Fixed code that was supposed to select the first action under Global Actions if Global Actions is selected (so the rest of the window isn't empty)
  • Couple other tweaks to the code flow dealing with creating actions (internal only)

New in Portable StrokesPlus.net 1.4.5 (Feb 2, 2012)

  • Actions window can now be resized

New in Portable StrokesPlus.net 1.4.4 (Jan 28, 2012)

  • Apps/Actions and Ignored list are now sorted alphabetically, with the exception of Global Actions always being first in Actions window. Sorting occurs when the window is loaded, not when changes are made within the screen; new items will appear at the end of the list until next time window is opened.
  • Added help in Actions window to assist with built-in functions
  • Made Actions window a little taller (resize functionality still on the list..)

New in Portable StrokesPlus.net 1.4.3 (Jan 24, 2012)

  • Added check and message on startup if DPI != 96 (StrokesPlus doesn't currently support DPI-scaling so the window layouts will be nasty)
  • Scaled-down the Ignored List window a bit

New in Portable StrokesPlus.net 1.4.2 (Jan 23, 2012)

  • Ensured StrokesPlus.lua is always loaded from program folder

New in Portable StrokesPlus.net 1.4.1 (Jan 21, 2012)

  • Set StrokesPlus to stay at High priority (except in dialogs) instead of switching between Above Normal and High when the Stroke button is pressed. This type of program must not interfere with user interaction and High priority helps to ensure there is no mouse lag. Plus, this reduces processing cycles used since S+ isn't calling to change priority levels during operation.

New in Portable StrokesPlus.net 1.4.0 (Jan 21, 2012)

  • Added Help button to Ignore and Preferences windows
  • Updated acMouseClick to be aware of swapped mouse buttons as well. 0 is the secondary button (right default), 2 is the primary (default left) button

New in Portable StrokesPlus.net 1.3.9 (Jan 21, 2012)

  • S+ now allows multiple instances (with a confirmation on starting subsequent instances). Note that this is not officially a supported feature and has some quirky (but entirely valid) behavior. The instanced opened first has the top position in the mouse/keyboard hook chains (in relation to the other S+ instances. The Global hotkeys CTRL+ALT+SHIFT+WIN+END (to exit StrokesPlus) and CTRL_SHIFT+WIN+Z (to toggle StrokesPlus disabled mode) will only be received by the first instance. Modifiers which use the hook button from another instance may not behave properly, depending on the position of the active hook in the S+ instance chain. Don't run from the same folder, or you will be using the same config file...which makes no sense to do....so use at your own risk!
  • Removed "Resumed" message box from popping on..that was for my testing and I forgot to take it out. Doh!
  • Added line to increment trayID for suspend/resume cycles (internal thing)

New in Portable StrokesPlus.net 1.3.8 (Jan 21, 2012)

  • Added option in Preferences to make S+ respond when Windows is entering suspended mode by deleting the tray icon and unhooking the mouse and keyboard. On resume, the tray icon is recreated and the mouse/keyboard are re-hooked. This option is not enabled by default, only enable if you're having problems with S+ after resuming Windows.

New in Portable StrokesPlus.net 1.3.7 (Jan 17, 2012)

  • Made Match Probability and Match Precision number-only fields
  • Added some extra checks before loading StrokesPlus.xml as well, to ensure it's always loading from the correct location. This issue is now 100% airtight.

New in Portable StrokesPlus.net 1.3.6 (Jan 17, 2012)

  • Enabled Visual Styles for S+ (buttons, dropdowns, etc. are prettier)

New in Portable StrokesPlus.net 1.3.5 (Jan 17, 2012)

  • Moved gesture thumbnail up 5px in Actions window
  • Added some overkill precautions to ensure there is no repeat of the StrokesPlus.xml saving issue, in case a custom Lua script somehow calls something which changes the directory
  • Added StrokesPlus_PAD.xml (Portable Application Description file) to zip and MSI

New in Portable StrokesPlus.net 1.3.4 (Jan 16, 2012)

  • Corrected Test button's tab order in Preferences window and Help button in Actions window
  • Corrected issue with Play Sound for No Match not saving properly. After opening Browse window, the current directory is changed, causing S+ to write StrokesPlus.xml to whatever directory that was being browsed when clicking Open to select the WAV file. So the settings were saved successfully, but to the wrong location, so next time you opened S+, any other changes made weren't being loaded. The location where StrokesPlus.xml was saved to has all of the settings saved in it, but isn't loaded since it's not in the StrokesPlus folder. This problem had been in existence since 1.2.6, when the Browse... button was introduced.

New in Portable StrokesPlus.net 1.3.3 (Jan 16, 2012)

  • Couple updates to help file (website version is always updated immediately, unless it relates to a new feature)
  • Updated Right and Left button key modifier text to reflect properly when mouse buttons swapped

New in Portable StrokesPlus.net 1.3.2 (Jan 16, 2012)

  • Cleaned up the Preferences window layout a little
  • Removed help link in Actions window, replaced with Help button at bottom of window

New in Portable StrokesPlus.net 1.3.1 (Jan 16, 2012)

  • Added Test button to preview No Match Sound File

New in Portable StrokesPlus.net 1.3.0 (Jan 16, 2012)

  • Added Stroke color pick button and preview square in Preferences window

New in Portable StrokesPlus.net 1.2.9 (Jan 16, 2012)

  • Added option to App definition to disable processing Global Actions. This tells S+ that if the app is under the mouse, but no actions defined for that app were matched, don't try to check Global Actions for a match

New in Portable StrokesPlus.net 1.2.8 (Jan 16, 2012)

  • Fixed bug with selecting X2 from tray menu
  • Fixed Actions window so it centers better on the screen

New in Portable StrokesPlus.net 1.2.7 (Jan 16, 2012)

  • StrokesPlus is now aware of swapped mouse buttons

New in Portable StrokesPlus.net 1.2.6 (Jan 14, 2012)

  • Expanded Preferences window to include many of the hidden options in the StrokesPlus.xml file.
  • Presented the Control and Alt in the UI as valid Stroke buttons, just remember these options aren't fully supported or tested
  • Updated help file

New in Portable StrokesPlus.net 1.2.5 (Jan 14, 2012)

  • Updated the the way the experimental MouseWheelScroll feature functions to be much better. Doesn't require application to be the active app nor does it change the focus within the active window any longer.
  • Help file updated to include acLockWindows() action

New in Portable StrokesPlus.net 1.2.4 (Jan 14, 2012)

  • Added acLockWindows() (no parameters, equivalent of pressing WIN+L) Forgot to update Help file with function, FYI
  • Removed copying of StrokesPlus shortcut to Startup folder for MSI installs (since Vista and later will not allow auto-running an app require elevated privileges)
  • Corrected Program Files path for 64-bit MSI, was going to Program Files (x86)
  • Added experimental feature MouseWheelFocus option under config.settings in StrokesPlus.xml, if set to 1, S+ will send WM_SETFOCUS to the control under the mouse cursor before mouse wheel scrolling. Basically, makes it so the area under the mouse will scroll, instead od having to click the control/pane/tree/list before the mouse wheel will scroll that area. This is a "use at your own risk" option as it may not play nice with some programs. This feature doesn't appear to work well under Windows XP, inside of a VM anway, I don't have a stand-alone XP box to confirm.

New in Portable StrokesPlus.net 1.2.3 (Jan 12, 2012)

  • Made gesture preview lines a little fancier using GDI+

New in Portable StrokesPlus.net 1.2.2 (Jan 11, 2012)

  • Added acGetExecutableName()
  • Added acGetClassName()

New in Portable StrokesPlus.net 1.2.1 (Jan 10, 2012)

  • Updated acDisplayText window to include WS_EX_NOACTIVATE so it cannot be clicked (or take focus from an app). It isn't click-through (on the text, anyway), just will not receive focus if clicked.
  • Fixed issue where acDisplayText only displayed the first 8 characters, was getting the size of the pointer (8), not the size of the actual string

New in Portable StrokesPlus.net 1.2.0 (Jan 10, 2012)

  • Added acDisplayText() (similar to StrokeIt's On Screen Display)

New in Portable StrokesPlus.net 1.1.9 (Jan 10, 2012)

  • alien 0.5.1 built directly into StrokesPlus and available to Lua scripts!

New in Portable StrokesPlus.net 1.1.8 (Jan 9, 2012)

  • Conceded to disabling appropriate key modifier check box if a stroke key has been specified...it was bothering me =)
  • Removed Desktop from Ignored List, instead made an app for the Desktop to ignore the problematic actions
  • Updated MaxDrawPoints to force 0 if setting is < 0, force 3 if > 0 and < 3 (S+ doesn't like negative or being set to 1 or 2 due to internal reasons. See http://www.strokesplus.com/forum/topic.asp?TOPIC_ID=113 for details about this setting
  • Cleaned up the default config file for some downloads, removing my damn bank login username and password (LOL!). Needless to say, I've changed both the userID and password with my bank. And to those who may have logged in, don't laugh at my very low bank balance..why do you think I have a Donate button up above?!
  • Also fixed up the config for x64 ZIP download, it was all screwed up (I thought I had replaced it...too many build variations!)

New in Portable StrokesPlus.net 1.1.7 (Jan 9, 2012)

  • Corrected invalidate rect location on Gesture Name window for redrawing stroke on WM_EXITSIZEMOVE
  • Added 2 second timer event to the code which handles the WM_DISPLAYCHANGE message, to allow more time for the display changes to finalize before adjusting the gesture draw window. Tray icon reflects being disabled during this delay
  • Minor help page tweaks

New in Portable StrokesPlus.net 1.1.6 (Jan 7, 2012)

  • Fixed the tab order of fields in all dialogs, to flow as expected
  • Fixed issue with gesture names having "\" in them, must've been introduceed in the update to Lua 5.2

New in Portable StrokesPlus.net 1.1.5 (Jan 7, 2012)

  • Updated to Lua 5.2

New in Portable StrokesPlus.net 1.1.4 (Jan 6, 2012)

  • Added 64-bit version of StrokesPlus
  • Fixed grouping issue in Preferences for Stroke Button. Left, Right, and Middle were in a separate radio group than X1 and X2 (I added X1 and X2 later on)

New in Portable StrokesPlus.net 1.1.3 (Jan 6, 2012)

  • Updated KeyboardProc to consume all keys when in capture mode, previously if you were drawing a gesture and typed a letter it would pass to the foreground window. This isn't ideal, especially when it comes to the experimental Stroke key functionality added in 1.1.2.

New in Portable StrokesPlus.net 1.1.2 (Jan 5, 2012)

  • Added experimental key Stroke button option. This allows you to specify Control, Alt, or Shift as the Stroke button instead of a mouse button. For example, hold Alt and move the mouse to draw gestures. This is not an ideal configuration as it interferes with common program functions which require pressing Control, Alt, or Shift. For instance, if you have Control defined as the Stroke button, pressing CTRL+S in an application will not fire unless you let the Cancel Delay run out; e.g. press CTRL, wait until the Cancel Delay expires, then (while still holding CTRL) press S to Save the file. As such, this feature is experimental, not-supported, undocumented in the help, and not available to select via the interface as I don't want to make it appear as something one would typically want to select, as well as to prevent user frustration and confusion. I've no problem addressing issues with this feature and will do my best to make it as functional as possible without disrupting the core mouse button and program functionality, but it is not be something which will be considered a standard feature nor priority.
  • Ok, now that the disclaimer is out of the way, here's how to enable the feature:
  • Edit StrokesPlus.xml
  • Locate the element
  • Enter one of the following negative values to specify the desired Stroke key:
  • Control key: -1
  • Alt key: -2
  • Shift key: -3
  • Save the config file
  • Select Reload Config from the S+ tray icon, or open S+ if it wasn't running
  • Note that S+ saves the config file when you exit the program, so if you edit and save the file, then exit S+, it will be overwritten with the settings which S+ had loaded in memory.
  • Make sure to consider what ignore key you have defined..if the Stroke key and ignore key are the same, nothing will happen (surprise!). Also keep in mind that I'm not disabling the corresponding key modifier in the Actions window. So if you have Control set as the Stroke key, selecting Control as a key modifier for an action will result in the action never firing since the Stroke key cannot also be part of an action modifier.
  • You may still use the Preferences window to update other settings, saving the Preferences without a Stroke button selected in the window will not cause an error nor overwrite your manual Stroke key setting.

New in Portable StrokesPlus.net 1.1.1 (Jan 5, 2012)

  • Added acPlaySound - Plays a WAV file
  • Added NoMatchSound (0 or 1) and NoMatchSoundFile (full path to WAV file; or empty) to config.settings in StrokesPlus.xml
  • NoMatchSound = 1 tells S+ to play a sound when a gesture wasn't matched to an action
  • NoMatchSoundFile is used to indicate the full path and file name (doesn't need to be escaped) to the WAV file to be played; if empty, the sound associated with Windows Question will be played
  • These settings will be created in your StrokesPlus.xml file if they do not exist, with NoMatchSound turned off (0) and NoMatchSoundFile set to ""
  • Tweaked KeyboardProc again, Control key wasn't being handled quite right.

New in Portable StrokesPlus.net 1.1.0 (Jan 5, 2012)

  • Upgraded to Release status
  • Help file updated
  • Fixed issue in acGetClipboardText() which would cause S+ to crash if there was no CF_TEXT data on the clipboard; now returns empty string if no text
  • Updated code in KeyboardProc to not consume all keypresses while drawing a gesture; now only the potential key modifiers are consumed (Ctrl, Alt, Shift)
  • Made some other tweaks to the key proc, correcting some state issues with ignore and modifier keys; likely didn't cause any issues, but is now handled properly

New in Portable StrokesPlus.net 1.0.22 Beta (Jan 4, 2012)

  • Included Help option from tray menu
  • Changed link in Actions window to open local help file
  • Help file is currently limited to Lua variables and actions in this release

New in Portable StrokesPlus.net 1.0.21 Beta (Jan 4, 2012)

  • Performance enhancements in ignore/app matching routine
  • Added Program Manager, DisplayFusion Taskbar, Windows Taskbar to default install Ignore List; removed extraneous entries

New in Portable StrokesPlus.net 1.0.20 Beta (Jan 4, 2012)

  • Added some text to the app qualifier window to help explain the fields and usage.
  • Updated text in Ignored window to use "stroke button" instead of "gesture start button", for consistency.
  • Updated S+ to build out a basic config file if it doesn't exist
  • Updated to ensure Rename and Delete gesture buttons are disabled when adding a new action under an app that previously had no actions

New in Portable StrokesPlus.net 1.0.19 Beta (Jan 4, 2012)

  • Added shortened gesture variable names to make script reading easier:
  • "sp_gesture_name" may also be referenced as "gnm"
  • "sp_gesture_start_x" may also be referenced as "gsx"
  • "sp_gesture_start_y" may also be referenced as "gsy"
  • "sp_gesture_end_x" may also be referenced as "gex"
  • "sp_gesture_end_y" may also be referenced as "gey"
  • "sp_wheel_delta" may also be referenced as "gwd"
  • Updated StrokesPlus.xml in download to correct some old actions (hadn't updated the file in a while) and updated to use shorter variable names

New in Portable StrokesPlus.net 1.0.18 Beta (Jan 4, 2012)

  • Created global string buffer to hold return values for actions which return strings. This is all behind the scenes and was only volatile for a fraction of a second before Lua pushed the string onto the stack..but this fix seals the tiny gap.
  • Fixed recursion issue in acGetDesktopWindow()
  • Changed acMessageBox() to make the foreground window the owner (to prevent message boxes from being behind other windows)
  • Updated StrokesPlus.msi to not be so ... well stupid about upgrading, etc.

New in Portable StrokesPlus.net 1.0.17 Beta (Jan 4, 2012)

  • Made some adjustments to the code dealing with the Lua script text box and CR & LF characters, normalizing it a bit. Should be a little cleaner (if you had even noticed).
  • S+ now handles WM_DISPLAYCHANGE gracefully, properly re-sizing the gesture draw window.

New in Portable StrokesPlus.net 1.0.16 Beta (Jan 4, 2012)

  • Added:
  • acGetMonitorFromName()
  • acGetMonitorLeft()
  • acGetMonitorTop()
  • acGetMonitorRight()
  • acGetMonitorBottom()

New in Portable StrokesPlus.net 1.0.15 Beta (Jan 4, 2012)

  • Added:
  • acGetMonitorFromPoint()
  • acGetMonitorName()
  • acSendWindowToPreviousMonitor()
  • acSendWindowToNextMonitor()
  • acSendWindowToMonitorByHandle()
  • acSendWindowToMonitorByName()

New in Portable StrokesPlus.net 1.0.14 Beta (Dec 30, 2011)

  • Changed MouseProc, init system metric in setMyHook instead of on each proc callback (performance improvement)
  • Replaced rounded rectangle in Actions and Gesture Name windows with static control to improve performance when drawing gesture thumbnails
  • Updated Gesture Name window thumbnail draw code to match Actions window functionality, rather than drawing on WM_PAINT
  • Removed DrawArc, DrawEllipse, and DrawRoundRect since they're no longer used due to above change
  • Added some text to the actions window, explaining the gestures and modifiers a little bit (nothing awesome, but it was just empty space anyway)
  • Added option to download a simple MSI setup package; creates programs menu folder and puts a shortcut to StrokesPlus in the Startup folder

New in Portable StrokesPlus.net 1.0.13 Beta (Dec 30, 2011)

  • Actually included the right version (1.0.12 had 1.0.11's files in it :-/)
  • Corrected an issue with acFindWindowByTitleRegex() where the string was being stored as a const, so subsequent calls or changes to the string were being ignored until S+ restarted.

New in Portable StrokesPlus.net 1.0.12 Beta (Dec 30, 2011)

  • Added acFitWindowToScreen(), which *drumroll* fits the window to the current screen! Kinda like maximizing it, but without actually maximizing it (see Lua forum for details)
  • Added acMaximizeToAllScreens() (see Lua forum for details)
  • S+ recognizes when a screen layout has changed. Of course, right now it just presents a suicidal message and exits. Will make it handle this the right way later
  • acCenterWindow() to acCenterWindowToScreen()
  • acClipWindow() to acClipWindowToScreen()

New in Portable StrokesPlus.net 1.0.11 Beta (Dec 30, 2011)

  • Added acCenterWindow(), acClipWindow() (see exposed functions post http://www.strokesplus.com/forum/topic.asp?TOPIC_ID=5)
  • Removed Lua script message box on error, can be too big to fit on screen

New in Portable StrokesPlus.net 1.0.9 Beta (Dec 30, 2011)

  • Added the following actions to handle independently controlling modifier key down and up events:
  • acSendControlDown()
  • acSendControlUp()
  • acSendAltDown()
  • acSendAltUp()
  • acSendShiftDown()
  • acSendShiftUp()
  • acSendWinDown()
  • acSendWinUp()

New in Portable StrokesPlus.net 1.0.8 Beta (Dec 30, 2011)

  • Added hotkey CTRL+SHIFT+WIN+Z to toggle disabling StrokesPlus
  • Updated clearCaptureVars() to ensure ignore gesture flag is properly reset. Certain race conditions involving the ignore key and disabling S+ could collide, leaving S+ permanently disabled until restarting program

New in Portable StrokesPlus.net 1.0.7 Beta (Dec 30, 2011)

  • Refactored config saving/loading code, reducing overhead and size of exe (only
  • about 10k) as well as improving performance in Actions window when changing between apps/actions (I/O activity dramatically reduced)
  • Embedded a manifest into StrokesPlus.exe to invoke administrator UAC prompt when starting. Admin is necessary for certain functionality and the app's interaction with various windows to occur as one would expect.

New in Portable StrokesPlus.net 1.0.6 Beta (Dec 30, 2011)

  • acDisableNext() changes S+ icon to disabled until after next hook button is
  • released
  • Autosave: Added code to prevent changing apps/actions while autosave is updating config file. This prevents rapid changing of actions/apps from overwriting/appending values of previous selection. e.g. if you clicked an action, then pressed the up/down arrows very quickly, values from a previously selected node can overwrite or add to the next setting. This change introduces state checking/locking to ensure the proper settings are saved and subsequent tree node changes are queued up.
  • This likely hasn't affected anyone as you would have had to change nodes very rapidly to experience the problem, but this fix should prevent the possibility completely.

New in Portable StrokesPlus.net 1.0.5 Beta (Dec 30, 2011)

  • Fixed the forum link so it hides properly
  • Added an Autosave checkbox to Actions window. If checked, individual App and Action changes will be saved when you either close the Actions window or when you change to a different app/action. If unchecked, you must click Save to store the new settings for each action or app. This new setting is remembered and stored in a new config setting under config.settings.Autosave in StrokesPlus.XML; the setting will be created automatically in your config file if it doesn't exist, with Autosave defaulted to off.

New in Portable StrokesPlus.net 1.0.4 Beta (Dec 30, 2011)

  • Added link in actions screen to the Lua Scripts forum
  • Added "style" parameter to: acRunProgram(fullpath, parameters, seconds, style)
  • IMPORTANT! Having a missing style parameter defaults to 0, which means run the program hidden.
  • Previous acRunProgram actions in the default config file did not specify a style
  • parameter.
  • Simply ad ",1" before the closing paren to show the window as normal.