--------------------------------------------------------------------------------------------------- 0.5.7.8 - 10/20/2023 --------------------------------------------------------------------------------------------------- - Version bump, needed to update installer to purge ClearScript files as well - no code changes --------------------------------------------------------------------------------------------------- 0.5.7.7 - 10/20/2023 --------------------------------------------------------------------------------------------------- - Fixed crash due to leftover ClearScript DLL from newer version that shouldn't be there --------------------------------------------------------------------------------------------------- 0.5.7.6 - 10/19/2023 --------------------------------------------------------------------------------------------------- - Fixed issue with fixing hints in 0.5.7.5 --------------------------------------------------------------------------------------------------- 0.5.7.5 - 10/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 --------------------------------------------------------------------------------------------------- 0.5.7.4 - 2/21/2023 --------------------------------------------------------------------------------------------------- - Updated clear gesture logic to use GetClientRect before calling FillRect instead of using the desktop coordinates --------------------------------------------------------------------------------------------------- 0.5.7.3 - 2/21/2023 --------------------------------------------------------------------------------------------------- - Added sp_config.UseLegacyClearGestureMethod (hidden for now, default is false) to tell S+ to use the gesture clearing method from prior version. New (default) method is to fill the gesture surface's background with the transparent color. This is to address leftover gesture artifacts and is the recommended method unless you have a lower powered GPU and see flickering after you finish drawing gestures --------------------------------------------------------------------------------------------------- 0.5.7.2 - 12/28/2022 --------------------------------------------------------------------------------------------------- - Fixed crash relating to No Match section --------------------------------------------------------------------------------------------------- 0.5.7.1 - 12/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 --------------------------------------------------------------------------------------------------- 0.5.7.0 - 7/14/2022 --------------------------------------------------------------------------------------------------- - Fixed error when deleting multiple gesture patterns - Added Global Actions > Mouse Events > No Match tab which executes when no gesture/app/action match was found --------------------------------------------------------------------------------------------------- 0.5.6.9 - 6/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 --------------------------------------------------------------------------------------------------- 0.5.6.8 - 6/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 --------------------------------------------------------------------------------------------------- 0.5.6.7 - 6/17/2022 --------------------------------------------------------------------------------------------------- - Fixed issue with HistoryScripts not having the script property assigned - Updated history script logic to include awareness of the ExecuteByIndex method --------------------------------------------------------------------------------------------------- 0.5.6.6 - 6/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 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) 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 Options selection - Added language entries ThemeModeLight ThemeModeDark ThemeModeSelect ThemeDefaultNameLight ThemeDefaultNameDark --------------------------------------------------------------------------------------------------- 0.5.6.5 - 2/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) 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 --------------------------------------------------------------------------------------------------- 0.5.6.4 - 2/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 --------------------------------------------------------------------------------------------------- 0.5.6.3 - 2/19/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 --------------------------------------------------------------------------------------------------- 0.5.6.2 - 2/19/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 --------------------------------------------------------------------------------------------------- 0.5.6.1 - 2/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. - See here for some example color schemes: https://forum.strokesplus.net/posts/m12763-Dark-mode - Updated to ClearScript 7.2.2 - Updated to WebView2 1.0.1108.44 --------------------------------------------------------------------------------------------------- 0.5.6.0 - 2/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 --------------------------------------------------------------------------------------------------- 0.5.5.9 - 2/1/2022 --------------------------------------------------------------------------------------------------- - Fixed issue with custom hint location setting - Updated translations --------------------------------------------------------------------------------------------------- 0.5.5.8 - 1/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 --------------------------------------------------------------------------------------------------- 0.5.5.7 - 1/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 --------------------------------------------------------------------------------------------------- 0.5.5.6 - 1/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 --------------------------------------------------------------------------------------------------- 0.5.5.5 - 1/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 --------------------------------------------------------------------------------------------------- 0.5.5.4 - 12/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] - 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 --------------------------------------------------------------------------------------------------- 0.5.5.3 - 12/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 --------------------------------------------------------------------------------------------------- 0.5.5.2 - 11/23/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 --------------------------------------------------------------------------------------------------- 0.5.5.1 - 11/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 - Narrator: "It didn't." - 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 --------------------------------------------------------------------------------------------------- 0.5.5.0 - 9/1/2021 --------------------------------------------------------------------------------------------------- - Fixed bug with Text Expansion losing type selection when changing to app without Text Expansions - Fixed issue with Image Combo text rendering --------------------------------------------------------------------------------------------------- 0.5.4.9 - 8/25/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 --------------------------------------------------------------------------------------------------- 0.5.4.8 - 8/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 --------------------------------------------------------------------------------------------------- 0.5.4.7 - 8/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 0.5.4.1, you can enable that method by calling sp_config.Enable2DTextRendering = true; --------------------------------------------------------------------------------------------------- 0.5.4.6 - 8/12/2021 --------------------------------------------------------------------------------------------------- - Added Exclusion Zones to Applications to define application-specific exclusion zones --------------------------------------------------------------------------------------------------- 0.5.4.5 - 8/11/2021 --------------------------------------------------------------------------------------------------- - Fixed floater state error during import - Updated key mode image text rectangle boundaries --------------------------------------------------------------------------------------------------- 0.5.4.4 - 8/11/2021 --------------------------------------------------------------------------------------------------- - Moved floater loading logic to separate thread to prevent hang during load/image caching - Updated floaters to hide instead of close/recreate when ignore key pressed/capture disabled - Updated console to prevent switching tabs if console is foreground window - Updated size and wrapping calculations for floater text to ensure best fit without clipping - Updated WebView2 Evergreen installer to latest version --------------------------------------------------------------------------------------------------- 0.5.4.3 - 8/9/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 --------------------------------------------------------------------------------------------------- 0.5.4.2 - 8/6/2021 --------------------------------------------------------------------------------------------------- - Couple quick tweaks with floater text, still more to do but I will need to come back to it --------------------------------------------------------------------------------------------------- 0.5.4.1 - 8/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 --------------------------------------------------------------------------------------------------- 0.5.4.0 - 8/5/2021 --------------------------------------------------------------------------------------------------- - Fixed issue with update installer not starting S+ due to missing temp path - Added catch to suppress token saving error during unload --------------------------------------------------------------------------------------------------- 0.5.3.9 - 8/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 --------------------------------------------------------------------------------------------------- 0.5.3.8 - 8/4/2021 --------------------------------------------------------------------------------------------------- - IMPORTANT - Promoted Beta channel to live - IMPORTANT - BACKUP YOUR CONFIG FILE! Just to be safe. - If you are the cautious type, you may want to wait a week or so to be sure things are stable - If you run into issue, revert to the previous version and submit your issue to the forum Previous Version Installer: https://cdn.strokesplus.net/files/StrokesPlus.net_Setup_0.4.3.5.exe Previous Version Portable: https://cdn.strokesplus.net/files/StrokesPlus.net_Portable_0.4.3.5.zip - 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! - Lots of changes, PLEASE read the change log starting from version 0.5.0.0! https://www.strokesplus.net/ChangeLog.txt - 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 --------------------------------------------------------------------------------------------------- 0.5.3.7 - 7/31/2021 --------------------------------------------------------------------------------------------------- - One more Beta release, tying up some loose ends... - Added Additional References tab to Plug-Ins section - Added Script tab to Options, moved some items from Advanced to the new tab - Added UI for script editor Replacement Tokens - Added Use New Classes Only preference to Options - Added color options button to console window - Updated console window to use the current settings object like floaters - Updated language entries: ActionStepMethods.SendWinUp.HelpTip V8ObjectLoadErrorMessage PlugInFooterText - Added language entries: ConsoleSetColorsMenu ConsoleSetBackgroundColorMenu ConsoleSetForegroundColorMenu ConsoleSetLogColorMenu ConsoleSetWarningColorMenu ConsoleSetErrorColorMenu PlugInTabReferences ReferenceFooterText AddReference RemoveReference tabPreferencesScriptReplAddTokenLabel tabPreferencesScriptReplAddValueLabel tabPreferencesScriptReplSectionLabel tabPreferencesScriptReplHeaderLabel tabPreferencesUseNewClassesOnly --------------------------------------------------------------------------------------------------- 0.5.3.6 - 7/29/2021 --------------------------------------------------------------------------------------------------- - I think this will be the last Beta release for now, I'm going to try to make the update check automatically switch you back to the main channel when the production version is higher than the beta version you're running - Added the stored decimal methods to the sp. list, as well as delete all stored methods - I've decided instead of trying to make the new StrokesPlus script namespace grow independently, that all functionality will be added to the sp. class first then referenced by the StrokesPlus namespace - This way, the StrokesPlus namespace is just an organized way to find methods or properties - Of course, if sp_config.UseNewClassesOnly is set to true, you won't see sp. and most types as well as plugins will need to be fully qualified, aliased, or accessed within with/using blocks Updated language entries: ScriptHelp.ActionMethod.DeleteStoredBool.Description ScriptHelp.ActionMethod.GetStoredBool.Description ScriptHelp.ActionMethod.DeleteStoredHistoryScript.Description ScriptHelp.ActionMethod.GetStoredHistoryScript.Description ScriptHelp.ActionMethod.DeleteStoredString.Description ScriptHelp.ActionMethod.GetStoredString.Description ScriptHelp.ActionMethod.DeleteStoredRectangle.Description ScriptHelp.ActionMethod.GetStoredRectangle.Description ScriptHelp.ActionMethod.DeleteStoredPoint.Description ScriptHelp.ActionMethod.GetStoredPoint.Description ScriptHelp.ActionMethod.DeleteStoredObject.Description ScriptHelp.ActionMethod.GetStoredObject.Description ScriptHelp.ActionMethod.DeleteStoredNumber.Description ScriptHelp.ActionMethod.GetStoredNumber.Description ScriptHelp.ActionMethod.DeleteStoredHandle.Description ScriptHelp.ActionMethod.GetStoredHandle.Description ScriptHelp.ActionMethod.StoreObject.Description Added language entries: ScriptHelp.ActionMethod.DeleteStoredDecimal.Name ScriptHelp.ActionMethod.DeleteStoredDecimal.Description ScriptHelp.ActionMethod.DeleteStoredDecimal.Returns ScriptHelp.ActionMethod.DeleteStoredDecimal.Example.Simple ScriptHelp.ActionMethod.DeleteStoredDecimal.Parameters.name.Name ScriptHelp.ActionMethod.DeleteStoredDecimal.Parameters.name.Description ScriptHelp.ActionMethod.DeleteStoredDecimal.Parameters.name.Type ScriptHelp.ActionMethod.StoreDecimal.Name ScriptHelp.ActionMethod.StoreDecimal.Description ScriptHelp.ActionMethod.StoreDecimal.Returns ScriptHelp.ActionMethod.StoreDecimal.Example.Simple ScriptHelp.ActionMethod.StoreDecimal.Parameters.name.Name ScriptHelp.ActionMethod.StoreDecimal.Parameters.name.Description ScriptHelp.ActionMethod.StoreDecimal.Parameters.name.Type ScriptHelp.ActionMethod.StoreDecimal.Parameters.value.Name ScriptHelp.ActionMethod.StoreDecimal.Parameters.value.Description ScriptHelp.ActionMethod.StoreDecimal.Parameters.value.Type ScriptHelp.ActionMethod.GetStoredDecimal.Name ScriptHelp.ActionMethod.GetStoredDecimal.Description ScriptHelp.ActionMethod.GetStoredDecimal.Returns ScriptHelp.ActionMethod.GetStoredDecimal.Example.Simple ScriptHelp.ActionMethod.GetStoredDecimal.Parameters.name.Name ScriptHelp.ActionMethod.GetStoredDecimal.Parameters.name.Description ScriptHelp.ActionMethod.GetStoredDecimal.Parameters.name.Type ScriptHelp.ActionMethod.DeleteAllStoredBools.Name ScriptHelp.ActionMethod.DeleteAllStoredBools.Description ScriptHelp.ActionMethod.DeleteAllStoredBools.Returns ScriptHelp.ActionMethod.DeleteAllStoredBools.Example.Simple ScriptHelp.ActionMethod.DeleteAllStoredHandles.Name ScriptHelp.ActionMethod.DeleteAllStoredHandles.Description ScriptHelp.ActionMethod.DeleteAllStoredHandles.Returns ScriptHelp.ActionMethod.DeleteAllStoredHandles.Example.Simple ScriptHelp.ActionMethod.DeleteAllStoredNumbers.Name ScriptHelp.ActionMethod.DeleteAllStoredNumbers.Description ScriptHelp.ActionMethod.DeleteAllStoredNumbers.Returns ScriptHelp.ActionMethod.DeleteAllStoredNumbers.Example.Simple ScriptHelp.ActionMethod.DeleteAllStoredObjects.Name ScriptHelp.ActionMethod.DeleteAllStoredObjects.Description ScriptHelp.ActionMethod.DeleteAllStoredObjects.Returns ScriptHelp.ActionMethod.DeleteAllStoredObjects.Example.Simple ScriptHelp.ActionMethod.DeleteAllStoredPoints.Name ScriptHelp.ActionMethod.DeleteAllStoredPoints.Description ScriptHelp.ActionMethod.DeleteAllStoredPoints.Returns ScriptHelp.ActionMethod.DeleteAllStoredPoints.Example.Simple ScriptHelp.ActionMethod.DeleteAllStoredRectangles.Name ScriptHelp.ActionMethod.DeleteAllStoredRectangles.Description ScriptHelp.ActionMethod.DeleteAllStoredRectangles.Returns ScriptHelp.ActionMethod.DeleteAllStoredRectangles.Example.Simple ScriptHelp.ActionMethod.DeleteAllStoredStrings.Name ScriptHelp.ActionMethod.DeleteAllStoredStrings.Description ScriptHelp.ActionMethod.DeleteAllStoredStrings.Returns ScriptHelp.ActionMethod.DeleteAllStoredStrings.Example.Simple ScriptHelp.ActionMethod.DeleteAllStoredHistoryScripts.Name ScriptHelp.ActionMethod.DeleteAllStoredHistoryScripts.Description ScriptHelp.ActionMethod.DeleteAllStoredHistoryScripts.Returns ScriptHelp.ActionMethod.DeleteAllStoredHistoryScripts.Example.Simple ScriptHelp.ActionMethod.DeleteAllStoredDecimals.Name ScriptHelp.ActionMethod.DeleteAllStoredDecimals.Description ScriptHelp.ActionMethod.DeleteAllStoredDecimals.Returns ScriptHelp.ActionMethod.DeleteAllStoredDecimals.Example.Simple ScriptHelp.ActionMethod.DeleteAllStoredValues.Name ScriptHelp.ActionMethod.DeleteAllStoredValues.Description ScriptHelp.ActionMethod.DeleteAllStoredValues.Returns ScriptHelp.ActionMethod.DeleteAllStoredValues.Example.Simple ActionStepMethods.StoreDecimal.DisplayName ActionStepMethods.StoreDecimal.HelpTip ActionStepMethods.DeleteStoredDecimal.DisplayName ActionStepMethods.DeleteStoredDecimal.HelpTip ActionStepMethods.GetStoredDecimal.DisplayName ActionStepMethods.GetStoredDecimal.HelpTip ActionStepMethods.DeleteAllStoredBools.DisplayName ActionStepMethods.DeleteAllStoredBools.HelpTip ActionStepMethods.DeleteAllStoredHandles.DisplayName ActionStepMethods.DeleteAllStoredHandles.HelpTip ActionStepMethods.DeleteAllStoredNumbers.DisplayName ActionStepMethods.DeleteAllStoredNumbers.HelpTip ActionStepMethods.DeleteAllStoredObjects.DisplayName ActionStepMethods.DeleteAllStoredObjects.HelpTip ActionStepMethods.DeleteAllStoredPoints.DisplayName ActionStepMethods.DeleteAllStoredPoints.HelpTip ActionStepMethods.DeleteAllStoredRectangles.DisplayName ActionStepMethods.DeleteAllStoredRectangles.HelpTip ActionStepMethods.DeleteAllStoredStrings.DisplayName ActionStepMethods.DeleteAllStoredStrings.HelpTip ActionStepMethods.DeleteAllStoredDecimals.DisplayName ActionStepMethods.DeleteAllStoredDecimals.HelpTip ActionStepMethods.DeleteAllStoredValues.DisplayName ActionStepMethods.DeleteAllStoredValues.HelpTip --------------------------------------------------------------------------------------------------- 0.5.3.5 - 7/27/2021 --------------------------------------------------------------------------------------------------- - Updated AudioSwitcher.AudioApi libraries - Updated to ClearScript 7.1.5 - Updated to WebView2 1.0.902.49 - Added sp.TouchFloaterGetLocation() - Added sp.GetCaretLocation() - Added sp.TraceEnabledSections (List) - Added BackgroundAlternateColor and TextAlternateColor parameters to sp.PopupList - Added numerous sp.Console...() methods which mostly mirror the methods/properties within the StrokesPlus.Console. class - Updated language entries ScriptHelp.ActionMethod.CreateTimer.Parameters.interval.Description (milliseconds) ScriptHelp.ActionMethod.Sleep.Description (milliseconds) - Added language entries ScriptHelpCategoryNameConsole ScriptHelp.ActionMethod.ConsoleError.Name ScriptHelp.ActionMethod.ConsoleError.Description ScriptHelp.ActionMethod.ConsoleError.Returns ScriptHelp.ActionMethod.ConsoleError.Example.Simple ScriptHelp.ActionMethod.ConsoleError.Parameters.message.Name ScriptHelp.ActionMethod.ConsoleError.Parameters.message.Description ScriptHelp.ActionMethod.ConsoleError.Parameters.message.Type ScriptHelp.ActionMethod.ConsoleError.Parameters.label.Name ScriptHelp.ActionMethod.ConsoleError.Parameters.label.Description ScriptHelp.ActionMethod.ConsoleError.Parameters.label.Type ScriptHelp.ActionMethod.ConsoleError.Parameters.color.Name ScriptHelp.ActionMethod.ConsoleError.Parameters.color.Description ScriptHelp.ActionMethod.ConsoleError.Parameters.color.Type ScriptHelp.ActionMethod.ConsoleLog.Name ScriptHelp.ActionMethod.ConsoleLog.Description ScriptHelp.ActionMethod.ConsoleLog.Returns ScriptHelp.ActionMethod.ConsoleLog.Example.Simple ScriptHelp.ActionMethod.ConsoleLog.Parameters.message.Name ScriptHelp.ActionMethod.ConsoleLog.Parameters.message.Description ScriptHelp.ActionMethod.ConsoleLog.Parameters.message.Type ScriptHelp.ActionMethod.ConsoleLog.Parameters.label.Name ScriptHelp.ActionMethod.ConsoleLog.Parameters.label.Description ScriptHelp.ActionMethod.ConsoleLog.Parameters.label.Type ScriptHelp.ActionMethod.ConsoleLog.Parameters.color.Name ScriptHelp.ActionMethod.ConsoleLog.Parameters.color.Description ScriptHelp.ActionMethod.ConsoleLog.Parameters.color.Type ScriptHelp.ActionMethod.ConsoleWarning.Name ScriptHelp.ActionMethod.ConsoleWarning.Description ScriptHelp.ActionMethod.ConsoleWarning.Returns ScriptHelp.ActionMethod.ConsoleWarning.Example.Simple ScriptHelp.ActionMethod.ConsoleWarning.Parameters.message.Name ScriptHelp.ActionMethod.ConsoleWarning.Parameters.message.Description ScriptHelp.ActionMethod.ConsoleWarning.Parameters.message.Type ScriptHelp.ActionMethod.ConsoleWarning.Parameters.label.Name ScriptHelp.ActionMethod.ConsoleWarning.Parameters.label.Description ScriptHelp.ActionMethod.ConsoleWarning.Parameters.label.Type ScriptHelp.ActionMethod.ConsoleWarning.Parameters.color.Name ScriptHelp.ActionMethod.ConsoleWarning.Parameters.color.Description ScriptHelp.ActionMethod.ConsoleWarning.Parameters.color.Type ScriptHelp.ActionMethod.ConsoleEnableTimestamps.Name ScriptHelp.ActionMethod.ConsoleEnableTimestamps.Description ScriptHelp.ActionMethod.ConsoleEnableTimestamps.Returns ScriptHelp.ActionMethod.ConsoleEnableTimestamps.Example.Simple ScriptHelp.ActionMethod.ConsoleEnableTimestamps.Parameters.value.Name ScriptHelp.ActionMethod.ConsoleEnableTimestamps.Parameters.value.Description ScriptHelp.ActionMethod.ConsoleEnableTimestamps.Parameters.value.Type ScriptHelp.ActionMethod.ConsoleShowOnSystemError.Name ScriptHelp.ActionMethod.ConsoleShowOnSystemError.Description ScriptHelp.ActionMethod.ConsoleShowOnSystemError.Returns ScriptHelp.ActionMethod.ConsoleShowOnSystemError.Example.Simple ScriptHelp.ActionMethod.ConsoleShowOnSystemError.Parameters.value.Name ScriptHelp.ActionMethod.ConsoleShowOnSystemError.Parameters.value.Description ScriptHelp.ActionMethod.ConsoleShowOnSystemError.Parameters.value.Type ScriptHelp.ActionMethod.ConsoleClearUser.Name ScriptHelp.ActionMethod.ConsoleClearUser.Description ScriptHelp.ActionMethod.ConsoleClearUser.Returns ScriptHelp.ActionMethod.ConsoleClearUser.Example.Simple ScriptHelp.ActionMethod.ConsoleClearAll.Name ScriptHelp.ActionMethod.ConsoleClearAll.Description ScriptHelp.ActionMethod.ConsoleClearAll.Returns ScriptHelp.ActionMethod.ConsoleClearAll.Example.Simple ScriptHelp.ActionMethod.ConsoleCopySystem.Name ScriptHelp.ActionMethod.ConsoleCopySystem.Description ScriptHelp.ActionMethod.ConsoleCopySystem.Returns ScriptHelp.ActionMethod.ConsoleCopySystem.Example.Simple ScriptHelp.ActionMethod.ConsoleCopyUser.Name ScriptHelp.ActionMethod.ConsoleCopyUser.Description ScriptHelp.ActionMethod.ConsoleCopyUser.Returns ScriptHelp.ActionMethod.ConsoleCopyUser.Example.Simple ScriptHelp.ActionMethod.ConsoleHide.Name ScriptHelp.ActionMethod.ConsoleHide.Description ScriptHelp.ActionMethod.ConsoleHide.Returns ScriptHelp.ActionMethod.ConsoleHide.Example.Simple ScriptHelp.ActionMethod.ConsoleIsVisible.Name ScriptHelp.ActionMethod.ConsoleIsVisible.Description ScriptHelp.ActionMethod.ConsoleIsVisible.Returns ScriptHelp.ActionMethod.ConsoleIsVisible.Example.Simple ScriptHelp.ActionMethod.ConsoleShow.Name ScriptHelp.ActionMethod.ConsoleShow.Description ScriptHelp.ActionMethod.ConsoleShow.Returns ScriptHelp.ActionMethod.ConsoleShow.Example.Simple ScriptHelp.ActionMethod.TouchFloaterGetLocation.Name ScriptHelp.ActionMethod.TouchFloaterGetLocation.Description ScriptHelp.ActionMethod.TouchFloaterGetLocation.Returns ScriptHelp.ActionMethod.TouchFloaterGetLocation.Example.Simple ActionStepMethods.GetMainFloaterLocation.DisplayName ActionStepMethods.GetMainFloaterLocation.HelpTip ScriptHelp.ActionMethod.GetCaretLocation.Name ScriptHelp.ActionMethod.GetCaretLocation.Description ScriptHelp.ActionMethod.GetCaretLocation.Returns ScriptHelp.ActionMethod.GetCaretLocation.Example.Simple ActionStepMethods.GetCaretLocation.DisplayName ActionStepMethods.GetCaretLocation.HelpTip --------------------------------------------------------------------------------------------------- 0.5.3.4 - 7/25/2021 --------------------------------------------------------------------------------------------------- - **NOTE ABOUT PLUGINS** Plugins types which have the same name as its assembly will need to have script references updated. For example, the Tesseract OCR plugin from this link: https://forum.strokesplus.net/posts/t8294-Tesseract--OCR--Plug-In The assembly name is "SPTesseract" and the class (type) is also named "SPTesseract". Where before SPTesseract.GetPage() would work fine, it cannot share the same JavaScript object as the assembly so it must the fully qualified, e.g. SPTesseract.SPTesseract.GetPage() - I think this is probably limited to simple plugins, so far seems to just be the ones I made... - Fixed portable first run issue with incorrect default config file format - Fixed issue with mouse wheel events in certain situations - Micro-optimizations in application/action matching - Updated autocomplete logic to handle plugins with type names the same as assembly names - Added confirm (Yes/No) box, sp.Confirm(message, title) and StrokesPlus.UI.Confirm(message, title) Returns true if Yes is clicked - Added language entries: ActionStepMethods.ShowConfirm.DisplayName ActionStepMethods.ShowConfirm.HelpTip ScriptHelp.ActionMethod.Confirm.Name ScriptHelp.ActionMethod.Confirm.Description ScriptHelp.ActionMethod.Confirm.Returns ScriptHelp.ActionMethod.Confirm.Example.Simple ScriptHelp.ActionMethod.Confirm.Parameters.message.Name ScriptHelp.ActionMethod.Confirm.Parameters.message.Description ScriptHelp.ActionMethod.Confirm.Parameters.message.Type ScriptHelp.ActionMethod.Confirm.Parameters.title.Name ScriptHelp.ActionMethod.Confirm.Parameters.title.Description ScriptHelp.ActionMethod.Confirm.Parameters.title.Type --------------------------------------------------------------------------------------------------- 0.5.3.3 - 7/21/2021 --------------------------------------------------------------------------------------------------- - More floater state fixes --------------------------------------------------------------------------------------------------- 0.5.3.2 - 7/20/2021 --------------------------------------------------------------------------------------------------- - Another set of floater state fixes --------------------------------------------------------------------------------------------------- 0.5.3.1 - 7/18/2021 --------------------------------------------------------------------------------------------------- - More floater fixes --------------------------------------------------------------------------------------------------- 0.5.3.0 - 7/18/2021 --------------------------------------------------------------------------------------------------- - ...yet more fixes to floater logic... --------------------------------------------------------------------------------------------------- 0.5.2.9 - 7/18/2021 --------------------------------------------------------------------------------------------------- - Fixed issue with closing a custom floater causing all floaters to close - Other tweaks to float saving state/UI logic --------------------------------------------------------------------------------------------------- 0.5.2.8 - 7/18/2021 --------------------------------------------------------------------------------------------------- - Tweak to floater saving logic when finished loading floaters --------------------------------------------------------------------------------------------------- 0.5.2.7 - 7/18/2021 --------------------------------------------------------------------------------------------------- - Updates to floater layout selection while Floaters section selected in Settings window --------------------------------------------------------------------------------------------------- 0.5.2.6 - 7/16/2021 --------------------------------------------------------------------------------------------------- - Updates to floater handling from other windows --------------------------------------------------------------------------------------------------- 0.5.2.5 - 7/15/2021 --------------------------------------------------------------------------------------------------- - Fixed issue added in 0.5.2.4 in Console logging - Major overhaul to floater handling, probably some issues I haven't found yet - Added language entry AreYouSure --------------------------------------------------------------------------------------------------- 0.5.2.4 - 7/13/2021 --------------------------------------------------------------------------------------------------- - Update Console Log/Warning/Error params from string to object, which internally calls .ToString() - BREAKING CHANGE: 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 This will be REMOVED in the future! - Added calling StrokesPlusEngineReload in static plugins whenever engines are reloaded Use this signature in your plugin: public static void StrokesPlusEngineReload() { //your reload code here } - Notes: Use Microsoft.ClearScript.ScriptEngine.Current in your plugin to get the current executing engine when in the context of a script execution If doing something during init or reload, use the method below to work with the available script engines: StrokesPlus.net.Engine.ActionFunctions.EngineList() --------------------------------------------------------------------------------------------------- 0.5.2.3 - 7/13/2021 --------------------------------------------------------------------------------------------------- - Added missing logic to save state of floater visibility in some pathways --------------------------------------------------------------------------------------------------- 0.5.2.2 - 7/13/2021 --------------------------------------------------------------------------------------------------- - Tweaks to number of saves happening when floaters are closing --------------------------------------------------------------------------------------------------- 0.5.2.1 - 7/12/2021 --------------------------------------------------------------------------------------------------- - Fixed issue with Console default values Note that if you set console colors, they will be reset to default the first run --------------------------------------------------------------------------------------------------- 0.5.2.0 - 7/12/2021 --------------------------------------------------------------------------------------------------- - Merged in fix from production version 0.4.3.5 --------------------------------------------------------------------------------------------------- 0.5.1.9 - 7/12/2021 --------------------------------------------------------------------------------------------------- - Updated Console to switch to tab where entry is being added - Updated Console set Show In Taskbar to false during initial load - Updated Console to remember if maximized - Additional Console tweaks - Enabled Close (X) button in main Settings window, works the same as clicking Cancel - Fixed issue with Console script errors not resetting engine's IsExecuting flag - Fixed various issues with auto complete; will likely always have some issues due to complexity - Fixed logic which assigns version to settings file --------------------------------------------------------------------------------------------------- 0.5.1.8 - 7/9/2021 --------------------------------------------------------------------------------------------------- - Fixed issue with StrokesPlus.Console.Show() in load script and related race conditions - Changed Console Engine dropdown to include Any which means use any available engine, instead of selecting a specific engine - Minor tweaks to Console UI/UX - Added Stop button to Console for interrupting running Script - Moved Console script execution to thread - Added Always on Top toggle and window opacity slider to Console - Added language entries: Any AlwaysOnTop --------------------------------------------------------------------------------------------------- 0.5.1.7 - 7/8/2021 --------------------------------------------------------------------------------------------------- - Updates to Script console properties to match other console controls --------------------------------------------------------------------------------------------------- 0.5.1.6 - 7/8/2021 --------------------------------------------------------------------------------------------------- - Updated Console Script tab to save the script so it will be there next time Note: This saves to your settings, but is not included during Import/Export --------------------------------------------------------------------------------------------------- 0.5.1.5 - 7/8/2021 --------------------------------------------------------------------------------------------------- - Added Comment/Uncomment toolbar buttons to Console Script tab Ctrl+' - Comment Ctrl+Shift+' - Uncomment - Moved initial position of Console to 30000,30000 to prevent form from briefly showing on load --------------------------------------------------------------------------------------------------- 0.5.1.4 - 7/8/2021 --------------------------------------------------------------------------------------------------- - Added missing tool button icon to Console Script tab - Changed Engine dropdown style in Console to list --------------------------------------------------------------------------------------------------- 0.5.1.3 - 7/8/2021 --------------------------------------------------------------------------------------------------- - Added Script tab to Console to allow testing/executing scripts from the console and selecting which engine is used - Console Script hotkeys: F1 - Script Help F5 - Execute Control+T - Move caret/focus out of script editor Control+D - Toggle Script Console Panel - Added Copy button to Console window which copies the console text from the current tab - Added calls to copy respective log text StrokesPlus.Console.CopySystem() StrokesPlus.Console.CopyUser() - Additional tweaks to Console and script engine error logging - Added Console button to Settings screen - Added Word Wrap option to Console - Added language entries: WordWrap Execute Engine ConsoleWindowScriptShow --------------------------------------------------------------------------------------------------- 0.5.1.2 - 7/5/2021 --------------------------------------------------------------------------------------------------- - Fixed Console showing when Show On System Errors is selected and a user entry is added --------------------------------------------------------------------------------------------------- 0.5.1.1 - 7/7/2021 --------------------------------------------------------------------------------------------------- - Removed StrokesPlus.Console.Clear(), replaced with: StrokesPlus.Console.ClearSystem() StrokesPlus.Console.ClearUser() StrokesPlus.Console.ClearAll() - Removed StrokesPlus.Console.Load() - Removed StrokesPlus.Console.IsLoaded - Removed StrokesPlus.Console.Close() - Added StrokesPlus.Console.AddTimestamps property (bool) - Added StrokesPlus.Console.ShowOnSystemErrors property (bool) - Added tabs to Console window, new System tab for internal messages and User tab for custom entries - Added Advanced Option to Log Script Engine Errors To Console Only, this will not show a message box on error, instead showing it in the new System tab of the Console window - Added Console menu item to tray icon menu - Added checkable button in Console for Show On System Errors, if checked the console will appear if a script error occurs and Log Script Engine Errors To Console Only is ignored - Console is now always loaded when S+ starts - Updated Console to remember location and size - Updated to latest MicrosoftEdgeWebview2Setup.exe - Updated to ClearScript 7.1.4 - Added language entries: ConsoleTabSystemTitle ConsoleTabUserTitle ConsoleWindowShowOnError tabPreferencesLogErrorsToConsoleOnly --------------------------------------------------------------------------------------------------- 0.5.1.0 - 7/6/2021 --------------------------------------------------------------------------------------------------- - Micro-optimizations in GetGestureName logic - Added System.Management to script engine - Changed Console timestamp to use the fore color instead of the line color, for visual distinction - Added button in Console to control whether timestamp is prepended to new lines - Added settings entries (type is .NET Color struct) StrokesPlus.Configuration.Settings.ConsoleBackColor = Color.Black StrokesPlus.Configuration.Settings.ConsoleForeColor = Color.White StrokesPlus.Configuration.Settings.ConsoleLogColor = Color.LimeGreen StrokesPlus.Configuration.Settings.ConsoleWarningColor = Color.Yellow StrokesPlus.Configuration.Settings.ConsoleErrorColor = Color.Red - Added language entries: ConsoleWindowTitle ConsoleWindowAddTimestamp Hide --------------------------------------------------------------------------------------------------- 0.5.0.9 - 7/2/2021 --------------------------------------------------------------------------------------------------- - Changed clear key in Console to Delete instead of C - Added optional third param to console Log/Warning/Error to pass in a .NET Color for the line, e.g. StrokesPlus.Console.Log("Test", "Info", System.Drawing.Color.SteelBlue); --------------------------------------------------------------------------------------------------- 0.5.0.8 - 7/2/2021 --------------------------------------------------------------------------------------------------- - Added StrokesPlus.Console.IsVisible property - Updated Console key handling to allow Ctrl+C to copy, while only C clears --------------------------------------------------------------------------------------------------- 0.5.0.7 - 7/2/2021 --------------------------------------------------------------------------------------------------- - Few more fixes/tweaks to console --------------------------------------------------------------------------------------------------- 0.5.0.6 - 7/2/2021 --------------------------------------------------------------------------------------------------- - Fixed console scroll bars - Added keys C to clear Console, Escape to Hide - Note that if you click the X to close the console, logging will not be captured - Logging only occurs if the console is loaded via StrokesPlus.Console.Load()/Show() --------------------------------------------------------------------------------------------------- 0.5.0.5 - 7/2/2021 --------------------------------------------------------------------------------------------------- - Added StrokesPlus.Console class to support logging information from scripts --------------------------------------------------------------------------------------------------- 0.5.0.4 - 7/1/2021 --------------------------------------------------------------------------------------------------- - Fixed issue with multiple instances not generating a random Guid for mutex name - Fixed some issues with invoking plugin classes under new structure - Set ScintillaNET default font property to match keywords/etc so spacing remains consistent - Plugins which have same type name as assembly name can only be referenced by AssemblyName.TypeName --------------------------------------------------------------------------------------------------- 0.5.0.3 - 6/28/2021 --------------------------------------------------------------------------------------------------- - Gestures tab updated on gesture changes within actions - Restored legacy autocomplete behavior (sp.), though it is only invoked if no new matches are found, and UseNewClassesOnly is false - Note that by default in prior beta releases, your config was updated to add editor replacement tokens - you can clear them by executing sp_config.EditorReplacementTokens.Clear() - Added Version to settings file, this is for checking backward compatibility on imports, etc. Note the actual logic to check has not yet been implemented --------------------------------------------------------------------------------------------------- 0.5.0.2 - 6/24/2021 --------------------------------------------------------------------------------------------------- - Added recognition of pressing F5 in Macros script to execute the current editor text --------------------------------------------------------------------------------------------------- 0.5.0.1 - 6/23/2021 --------------------------------------------------------------------------------------------------- - Added "(beta)" to version in About tab - Mostly just testing the update flow here --------------------------------------------------------------------------------------------------- 0.5.0.0 - 6/23/2021 --------------------------------------------------------------------------------------------------- - Added beta channel for release updates - Added StrokesPlusAutoCompleteShowCallback() and StrokesPlusAutoCompleteSelectedCallback() to hook into the autocompletion process, in case you want to add your own function StrokesPlusAutoCompleteShowCallback() { //See https://github.com/jacobslusser/ScintillaNET for __sp_ScintillaEditor properties/methods/etc var documentText= __sp_ScintillaEditor.Text; var caretPos = __sp_ScintillaEditor.CurrentPosition; var isDot = __sp_ScintillaEditor.GetTextRange(caretPos - 1, 1) == "."; var isParen = __sp_ScintillaEditor.GetTextRange(caretPos - 1, 1) == ")"; var isLetterAfterDot = __sp_ScintillaEditor.GetTextRange(caretPos - 2, 1) == "."; var wordStartPos = __sp_ScintillaEditor.WordStartPosition((isDot ? caretPos - 1 : (isLetterAfterDot ? caretPos - 2 : caretPos)), true); var wordEndPos = __sp_ScintillaEditor.WordEndPosition(wordStartPos, true); var currentLine = __sp_ScintillaEditor.Lines.ElementAt(__sp_ScintillaEditor.CurrentLine); /* See: /ScintillaNET/blob/master/src/ScintillaNET/Line.cs currentLine.Position // line start position in entire document currentLine.EndPosition //line end position in entire document currentLine.Text //text of current line */ var linePosition = caretPos - currentLine.Position; var lineTextToCurrentPosition = linePosition > 0 ? currentLine.Text.substring(0, linePosition) : ""; // Only if at start of line and type 'x.' if(lineTextToCurrentPosition == "x.") { var list = []; list.push("TestA"); list.push("TestB"); return list; } else { return null; } } function StrokesPlusAutoCompleteSelectedCallback() { /* See: /ScintillaNET/blob/master/src/ScintillaNET/AutoCSelectionEventArgs.cs __sp_Scintilla_AutoCSelectionEventArgs = the above event handler object */ if(__sp_Scintilla_AutoCSelectionEventArgs.Text == "TestA" || __sp_Scintilla_AutoCSelectionEventArgs.Text == "TestB" ) { var tooltip = {}; tooltip.LineNumber = __sp_ScintillaEditor.CurrentLine; tooltip.Position = __sp_Scintilla_AutoCSelectionEventArgs.Position; tooltip.Text = `Tooltip for: ${__sp_Scintilla_AutoCSelectionEventArgs.Text}`; return tooltip } else { return null; } } - BACKWARD BREAKING CHANGES! Any scripts using the new class hierarchy will not be backward compatible. This won't cause any catastrophic issues, but scripts will show errors like "could not find x of undefined" - This is an unpublished version, still needs more testing, help updates, default settings, etc. - Big change to classes / namespaces to be less S+ specific and more general. For example, "sp." is now "StokesPlus.", "sp_config" is now "StrokesPlus.Configuration.Settings" - Significantly improved the autocomplete functionality in the script editor - The previous autocomplete objects have been removed, though the scripts/objects/methods will still function, as long as you haven't set StrokesPlus.Configuration.Settings.UseNewClassesOnly = true - There are MANY changes in this area, I'd recommend looking through the various autocomplete lists in the script editor. - Ctrl+Space to show root namespaces (StrokesPlus, Microsoft, System, plugins) - Ctrl+Shift+Space to show SystemWindow members - shortcut to list the main window properties and methods, since you may have a "wnd" variable and the autocomplete won't know it's a SystemWindow, so this shortcut will list those members for autocomplete selection - Ctrl+Alt+Space to search for members for word at caret location - for example, pressing this combination at the end of the word "dialogres" will select System.Windows.Forms.DialogResult. If there are more than 1 match found, a list will be shown. - Added StrokesPlus.Configuration.Settings.EditorReplacementTokens (Dictionary) This holds shortcuts like "sp" expands to "StrokesPlus" (works upon pressing ".") Key is the token, Value is the text to replace the token with - Added StrokesPlus.Configuration.Settings.UserLibraries (List) This holds the file paths/names of any additional .NET Framework/Standard assemblies you want to load with S+ (experimental, not tested much) - Added StrokesPlus.Configuration.Settings.UseNewClassesOnly property (default false) NOTE: Nearly all existing scripts will NOT work without conversion if you set this to true!! TL;DR: Don't use this setting! This is for my testing and historical reference only at this time - .NET Framework classes now also use the global namespace, so instead of drawing.System.Drawing.Point it can be references via System.Drawing.Point - New StrokesPlus and ClearScript namespaces exposed to script engine, more details to follow - Added support for psuedo keyword using, which wraps the script in one or more (nested) JavaScript with statements. This will allow the following script to work: using System.Windows.Forms; using System.IO; if(File.Exists("C:\\Temp\\VMWareSwitch.txt")) { MessageBox.Show("File exists"); } It is simply translated to this: with (System.Windows.Forms) { with (System.IO) { if(File.Exists("C:\\Temp\\VMWareSwitch.txt")) { MessageBox.Show("File exists"); } }} - It should be noted that this requires a lot more testing and that this will result in unscoped objects working upward through the chained with/using statements BEFORE reaching the global scope/namespace. For example, String is both a JavaScript and .NET type and with the using statement below, the .NET type is found first: using System; var x = String("test"); // Fails with an Invalid Generic Type Argument error (.NET String) // Works fine without the using line since is uses JavaScript String This works with the using to directly access the global scope for the JavaScript String type: using System; using globalThis; var x = String("a"); Or: using System; var x = globalThis.String("a"); However, this will NOT work because it works upward and finds String in System first: using globalThis; using System; var x = String("a"); - IMPORTANT: Accessing this feature requires that "using" is the first 5 characters of the script! This is for performance reasons since the method uses Regex to transform the text to the with structure. - IMPORTANT 2: Lines with using must start with "using" and end with ";" - no leading/trailing characters - IMPORTANT 3: The Regex pattern matches any line which starts with "using" and ends with a ";" so if you have a comment block surrounding another using line, it will result in a script error since there will be extra "}" characters added to the end of the script for each using line - You can avoid all of these rules by wrapping the code blocks using the with syntax yourself, this feature is just for convenience and to simplify copying existing C#/.NET Framework code snippets into S+ with minimimal refactoring (varies greatly depending on the code, however!) - Changed script check logic regarding executing history scripts, should not result in any different behavior, but noting her for historical purposes --------------------------------------------------------------------------------------------------- 0.4.3.5 - 7/12/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 --------------------------------------------------------------------------------------------------- 0.4.3.4 - 6/25/2021 --------------------------------------------------------------------------------------------------- - Increased MaxJsonLength to int.MaxValue for JSON settings operations --------------------------------------------------------------------------------------------------- 0.4.3.3 - 6/24/2021 --------------------------------------------------------------------------------------------------- - Fixed issue with HTML window not setting title - Removed mouse wheel event over Steps combo boxes --------------------------------------------------------------------------------------------------- 0.4.3.2 - 6/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) --------------------------------------------------------------------------------------------------- 0.4.3.1 - 5/24/2021 --------------------------------------------------------------------------------------------------- - This is a non-published release due to the high risk nature of the changes starting with 0.4.2.8, you can enter 0.4.3.1 at the bottom of the Downloads page to install: https://www.strokesplus.net/Downloads - Removed debug mode code I left in the tray menu logic in 0.4.3.0 - Refactored InitializeNewerSettings() to support reference and calling from website code - Updated settings sync to compare uploaded settings and if the only differences are insignificant ones like which tab was selected, settings window location, match count - the most recent stored settings are simply updated with the new upload. This will greatly reduce the amount of settings that show in the sync window and the storage used by the database. Note that this check is based on the same username and computer name. This is almost entirely a server-side release, but putting here for historical purposes. --------------------------------------------------------------------------------------------------- 0.4.3.0 - 5/21/2021 --------------------------------------------------------------------------------------------------- - This is a non-published release due to the high risk nature of the changes starting with 0.4.2.8, you can enter 0.4.3.0 at the bottom of the Downloads page to install: https://www.strokesplus.net/Downloads - Added Process extension method IsElevated() which returns true if S+ cannot obtain a token when calling OpenProcessToken or if the process is running in the context of an admin. With S+ running as normal, S+ cannot access the Task Manager process, so this returns true. With S+ running as Administrator, IsElevated() will also return true, but this is because S+ can obtain the Task Manager process token and confirm that it is specifically running with admin privileges. Essentially it's the same thing, but I wanted to be clear on exactly how this is implemented as there may be situations where a process is not actually elevated, but other processes are not allowed to query the process token - in which case S+ would still see it as an elevated process Example: sp.MessageBox(action.Window.Process.IsElevated(), "IsElevated"); - Fixed issue with custom settings file json not being found when param has .bin but no .bin file exists - Added future UI language entries (not currently visible): Yes No Primary Secondary Category Name SettingsActionListConflictMessage SettingsActionConflictMessage SettingsStrokeLuminanceMessage - Updated language entries: SettingsApplyCancelMessage ScriptHelp.SystemWindowMethod.ScreenFromPoint.Example.Simple --------------------------------------------------------------------------------------------------- 0.4.2.9 - 5/19/2021 --------------------------------------------------------------------------------------------------- - This is a non-published release due to the high risk nature of these changes, you can enter 0.4.2.9 at the bottom of the Downloads page to install: https://www.strokesplus.net/Downloads - Fixed issue with not being able to set a password when using JSON settings format - Fixed issue with failed temporary settings file save parsing not aborting file replace on error - Hide sp_config.ConvertToJSON() method if settings file already .json --------------------------------------------------------------------------------------------------- 0.4.2.8 - 5/18/2021 --------------------------------------------------------------------------------------------------- - This is a non-published release due to the high risk nature of these changes, you can enter 0.4.2.8 at the bottom of the Downloads page to install: https://www.strokesplus.net/Downloads - IMPORTANT: Due to changes with the account credentials class, you will need to login again from the tray icon! Note that the encryption is case-sensitive on username, so be sure to use the same casing as you did before. - New installations will now use JSON as the file format to store S+ settings, the file name will be StrokesPlus.net.json instead of StrokesPlus.net.bin - You can convert your existing settings to JSON by executing this command once: sp_config.ConvertToJSON(); This will rename your current settings file, appending .bak, and create the new settings file ending in .json If you use a custom location via the settingsfile parameter, the same applies, however S+ will also check for settingsfile + ".json" as well when starting, to make the transition simple so you don't need to change the command line parameter. Note that if the format is JSON, the file extension must also be .json or S+ will fallback to deserializing the file as the binary format. - The rules governing settings file precedence is .json first, then .bin if both files exist. - Updated sp.PopupList to have optional 7th parameter to enable multiple select using mouse clicks or the space bar - Code cleanup, should not impact any functionality - Updated to WebView2 1.0.818.41 - Updated to ClearScript 7.1.2 - Plugins may need to be updated/recompiled if they're referencing ClearScript DLLs MouseWheelAcceleration plugin updated in post, download here: https://www.strokesplus.net/files/plugins/MouseWheelAcceleration_Source_1.2.zip - Note: You will notice an HTML folder and files, these are part of the new UI I am working on. These files are not even remotely functional yet, but I'm working to make this a smooth and optional (for a while) transition, so I have baked in some functionality to handle using the new and current settings workflow/screens. For now, it's easier if I continue working on those updates in the same code branch to ensure I don't introduce any regression issues due to getting out of sync when I make fixes or enhancements to the production release, and allows me to have some folks test things live as I get closer to opening up the new UI. Some of these files are also used for sp.HTMLWindow - Added language entries: ScriptHelp.ActionMethod.PopupList.Parameters.MultiSelect.Name ScriptHelp.ActionMethod.PopupList.Parameters.MultiSelect.Description ScriptHelp.ActionMethod.PopupList.Parameters.MultiSelect.Type - Updated language entry: LoadSettingsErrorMessage --------------------------------------------------------------------------------------------------- 0.4.2.7 - 5/12/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) Example (using existing sample script values already defined): sp.PopupList(items, new Point(), font, Color.FromName("White"), //Background Color (NO alpha, will crash) drawing.System.Drawing.SystemColors.MenuHighlight, // Highlight color (supports alpha) Color.FromArgb(128,255,0,0) // Text color (supports alpha) ); - 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 --------------------------------------------------------------------------------------------------- 0.4.2.6 - 4/29/2021 --------------------------------------------------------------------------------------------------- - Fixed bad XML in Chinese translation files preventing them from being released with S+ setup --------------------------------------------------------------------------------------------------- 0.4.2.5 - 4/16/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 --------------------------------------------------------------------------------------------------- 0.4.2.4 - 4/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 --------------------------------------------------------------------------------------------------- 0.4.2.3 - 4/4/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 --------------------------------------------------------------------------------------------------- 0.4.2.2 - 4/4/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. But if you have any issues with plugins, please let me know. --------------------------------------------------------------------------------------------------- 0.4.2.1 - 3/22/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 --------------------------------------------------------------------------------------------------- 0.4.2.0 - 3/15/2021 --------------------------------------------------------------------------------------------------- - Updated PopupList to ensure the popup 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 --------------------------------------------------------------------------------------------------- 0.4.1.9 - 3/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 - 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 Plug-Ins Add Folder button to use the Ookii VistaFolderBrowserDialog instead of the .NET Framework folder browser - 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 --------------------------------------------------------------------------------------------------- 0.4.1.8 - 3/10/2021 --------------------------------------------------------------------------------------------------- - Added sp.PopupList to show a simple list similar to the popup menu, but with keyboard input See this post for details: https://forum.strokesplus.net/posts/m11980-Combo-Text-expansion - Added FontFamily to base script engine and editor - Changed installer to kick off WebView2 install/update without making you wait for it to finish --------------------------------------------------------------------------------------------------- 0.4.1.7 - 3/5/2021 --------------------------------------------------------------------------------------------------- - Updated sp.DisplayTextUpdate to also check for background and foreground color changes --------------------------------------------------------------------------------------------------- 0.4.1.6 - 2/17/2021 --------------------------------------------------------------------------------------------------- - Added missing Type (return) property to GetHelpJson Property entries --------------------------------------------------------------------------------------------------- 0.4.1.5 - 2/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 --------------------------------------------------------------------------------------------------- 0.4.1.4 - 2/7/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 --------------------------------------------------------------------------------------------------- 0.4.1.3 - 1/29/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 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 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 ScriptHelp.ActionMethod.HTMLWindow.Name ScriptHelp.ActionMethod.HTMLWindow.Description ScriptHelp.ActionMethod.HTMLWindow.Returns ScriptHelp.ActionMethod.HTMLWindow.Parameters.Title.Name ScriptHelp.ActionMethod.HTMLWindow.Parameters.Title.Description ScriptHelp.ActionMethod.HTMLWindow.Parameters.Title.Type ScriptHelp.ActionMethod.HTMLWindow.Parameters.HTML.Name ScriptHelp.ActionMethod.HTMLWindow.Parameters.HTML.Description ScriptHelp.ActionMethod.HTMLWindow.Parameters.HTML.Type ScriptHelp.ActionMethod.HTMLWindow.Parameters.ScriptCallback.Name ScriptHelp.ActionMethod.HTMLWindow.Parameters.ScriptCallback.Description ScriptHelp.ActionMethod.HTMLWindow.Parameters.ScriptCallback.Type ScriptHelp.ActionMethod.HTMLWindow.Parameters.OnDocumentCreatedScript.Name ScriptHelp.ActionMethod.HTMLWindow.Parameters.OnDocumentCreatedScript.Description ScriptHelp.ActionMethod.HTMLWindow.Parameters.OnDocumentCreatedScript.Type ScriptHelp.ActionMethod.HTMLWindow.Parameters.ID.Name ScriptHelp.ActionMethod.HTMLWindow.Parameters.ID.Description ScriptHelp.ActionMethod.HTMLWindow.Parameters.ID.Type ScriptHelp.ActionMethod.HTMLWindow.Parameters.IncludeBootstrapJQuery.Name ScriptHelp.ActionMethod.HTMLWindow.Parameters.IncludeBootstrapJQuery.Description ScriptHelp.ActionMethod.HTMLWindow.Parameters.IncludeBootstrapJQuery.Type ScriptHelp.ActionMethod.HTMLWindow.Example.Full ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Name ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Description ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Returns ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Parameters.Handle.Name ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Parameters.Handle.Description ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Parameters.Handle.Type ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Parameters.Script.Name ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Parameters.Script.Description ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Parameters.Script.Type ScriptHelp.ActionMethod.HTMLWindowExecuteScriptAsync.Example.Full --------------------------------------------------------------------------------------------------- 0.4.1.2 - 1/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 } --------------------------------------------------------------------------------------------------- 0.4.1.1 - 1/20/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 correctly Post 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 --------------------------------------------------------------------------------------------------- 0.4.1.0 - 12/23/2020 --------------------------------------------------------------------------------------------------- - Fixed issue with importing macros when no macros or categories already exist --------------------------------------------------------------------------------------------------- 0.4.0.9 - 12/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 --------------------------------------------------------------------------------------------------- 0.4.0.8 - 12/21/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 --------------------------------------------------------------------------------------------------- 0.4.0.7 - 12/20/2020 --------------------------------------------------------------------------------------------------- - Fixed issues with no param callbacks - Fixed issue with no param PInvoke definition --------------------------------------------------------------------------------------------------- 0.4.0.6 - 12/20/2020 --------------------------------------------------------------------------------------------------- ** PLEASE POST IN THE FORUM OR DISCORD (#bugs) IF YOU HAVE ISSUES DUE TO .NET UPGRADE ** - 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 - For next 5 items below, see the forum post (an #scripts Discord channel) for more details: https://forum.strokesplus.net/posts/m11783-Example---Test-Code-for-Native-Binding - 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 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 --------------------------------------------------------------------------------------------------- 0.4.0.5 - 12/9/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 --------------------------------------------------------------------------------------------------- 0.4.0.4 - 12/8/2020 --------------------------------------------------------------------------------------------------- - Changed action list/editor from a table layout to a split container - Updated default config to fix typos and change menu example to use PopupMenuInfoEx instead - Added change log since current version to Update Available window --------------------------------------------------------------------------------------------------- 0.4.0.3 - 12/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 --------------------------------------------------------------------------------------------------- 0.4.0.2 - 11/28/2020 --------------------------------------------------------------------------------------------------- - Fixed error with creating and naming a new action, then adding a new gesture --------------------------------------------------------------------------------------------------- 0.4.0.1 - 11/28/2020 --------------------------------------------------------------------------------------------------- - Hotkeys now executed on separate threads to prevent blocking/queueing - Changed portable default config file name to Default_StrokesPlus.net.bin to prevent overwriting when extracting ZIP file. If no config file is found in the normal locations first and the default file exists in the same folder as StrokesPlus.net.exe, the default file will be renamed to StrokesPlus.net.bin when the app starts --------------------------------------------------------------------------------------------------- 0.4.0.0 - 11/27/2020 --------------------------------------------------------------------------------------------------- - Added sp.SetMouseCursor([string] cursorType, [string] fileName) - Valid cursorType values: Arrow IBeam WaitCursor Cross UpArrow SizeNWSE SizeNESW SizeWE SizeNS SizeAll No 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 --------------------------------------------------------------------------------------------------- 0.3.9.9 - 11/24/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 --------------------------------------------------------------------------------------------------- 0.3.9.8 - 11/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) --------------------------------------------------------------------------------------------------- 0.3.9.7 - 10/28/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 --------------------------------------------------------------------------------------------------- 0.3.9.6 - 9/24/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 --------------------------------------------------------------------------------------------------- 0.3.9.5 - 9/18/2020 --------------------------------------------------------------------------------------------------- - Fixed issue with Step file browse not showing any files to select - Updated zh-CN language --------------------------------------------------------------------------------------------------- 0.3.9.4 - 8/28/2020 --------------------------------------------------------------------------------------------------- - Not officially releasing this through the website or via update check due to core changes - Changed logic that gets the EXE name/path for ignored/app qualifiers to address protected apps - Added Culture/Language selection in Options, Current Culture is the default and is based on the current default culture when S+ starts. Note that this setting only affects the UI after clicking OK, clicking Apply does not update the culture since the window is open - Upgrade ClearScript/Chrome V8 to version 6.0.2 (Chrome V8 8.3.110.9) - Requires VC runtime upgrade to 14.27, installer will handle automatically, but portable users should install the appropriate platform from Microsoft or https://www.strokesplus.net/Downloads - Added sp.StartManualCapture([bool] useSecondary) and sp.StopManualCapture() to begin/end capturing the mouse as if you were holding the primary or secondary (based on the bool param) stroke button. This is experimental right now and is not documented, but the use case could be if you bound to the keyboard hook event to hold a key instead of a stroke button, though it still treats the action as if the appropriate mouse button was being held since S+ was not built to support a key based stroke button. So just playing around with this for now. - Added language entries: tabPreferencesSelectedCultureLabel tabPreferencesSelectedCultureDefaultOption --------------------------------------------------------------------------------------------------- 0.3.9.3 - 6/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 --------------------------------------------------------------------------------------------------- 0.3.9.2 - 6/4/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 --------------------------------------------------------------------------------------------------- 0.3.9.1 - 6/3/2020 --------------------------------------------------------------------------------------------------- - Not triggering an automatic update for this release pending further testing - Removed these properties: MouseHook.EnableSyncHookEvents KeyboardHook.EnableSyncHookEvents - Added separate async events instead: MouseHook.OnMouseHookButtonEventAsync MouseHook.OnMouseHookMoveEventAsync KeyboardHook.OnKeyboardHookEventAsync - Updated post details to reflect changes: https://forum.strokesplus.net/posts/m10429-Mouse---Keyboard-Event-Subscriptions - 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 --------------------------------------------------------------------------------------------------- 0.3.9.0 - 6/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 --------------------------------------------------------------------------------------------------- 0.3.8.9 - 5/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 --------------------------------------------------------------------------------------------------- 0.3.8.8 - 5/16/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 --------------------------------------------------------------------------------------------------- 0.3.8.7 - 5/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 --------------------------------------------------------------------------------------------------- 0.3.8.6 - 5/12/2020 --------------------------------------------------------------------------------------------------- - Disabled fallback WMI method for retrieving process EXE name as it was causing S+ to freeze - Added hidden setting (bool) sp_config.EnableWMIMethodForProcessFileName to enable that method, but I don't recommend using it unless asked - I will need to revisit the module name methods again - Updated several languages due to SQL issue missing some translations --------------------------------------------------------------------------------------------------- 0.3.8.5 - 4/24/2020 --------------------------------------------------------------------------------------------------- - Updated code signing certificate...which I wasn't able to have them use "Rob" instead of "Robert" this time :( - Fixed issue with Relative to Window Exclusion Zone type not working properly - Changed almost all .ToLower() calls to .ToLowerInvariant() to address Turkish (and possibly other) language issues when comparing strings - Fixed some language references for translation - Update zh-CN translation --------------------------------------------------------------------------------------------------- 0.3.8.4 - 4/3/2020 --------------------------------------------------------------------------------------------------- - Added XmlDocument type to script engine --------------------------------------------------------------------------------------------------- 0.3.8.3 - 3/22/2020 --------------------------------------------------------------------------------------------------- - Added third method for obtaining EXE name using WMI if .NET and WinAPI calls fail - Added command line switch enablerunninginstance which just posts the sp.Enable(); script to the first running instance of StrokesPlus.net found - Fixed issue with long text expansion tokens being reset, causing unexpected behavior - Added GetLastError details to failed to register hot key messaging to troubleshoot issues --------------------------------------------------------------------------------------------------- 0.3.8.2 - 3/5/2020 --------------------------------------------------------------------------------------------------- - Fixed issue with exporting introduced in 0.3.8.1 - Added sp.GetSyncKeyState(vk) which calls the true GetKeyState Win API cll, where sp.GetKeyState(vk) actually calls the GetAsyncKeyState Win API call. This new function isn't generally recommended for a variety of technical reasons, which is why it's not described in the help; but I was testing something and added it, so I will leave it in case it's ever needed for some uncommon situation --------------------------------------------------------------------------------------------------- 0.3.8.1 - 2/29/2020 --------------------------------------------------------------------------------------------------- - Updated Save settings file to verify contents of temporary file before replacing the current settings, then copy the current settings file to "Last_{filename}", then move the temp file to the main settings file name, then delete the temp settings file. This was to address a rare issue someone encountered where there was an I/O issue while saving their settings which resulted in the file being full of NULL bytes. - Updated ScintillaNet editor to clear undo/redo history when changing between scripts. Note: I'm still researching the use of Scintilla Documents to retain the history for each script separately but it's a little more complicated, thus not ready yet. - Added sp.GetItemsInExplorer(windowHandle, onlyName, includeFolder, includeLinks) - when windowHandle is an Explorer window (e.g. action.Window.HWnd) it will return a string array of the items in the Explorer window - Added method sp.GetActiveExplorerPath(windowHandle) method to get current folder in Explorer. If it's a special folder, it will just return the name of the item/object, e.g. "Network" - Added Steps category Explorer to added the 4 available Explorer functions to Steps - Added generatePublisherEvidence = false to app.config to reduce initial load times on new version - Added language entries: ActionStepMethodCategories.Explorer.DisplayName ActionStepMethods.GetSelectedFilesInExplorer.DisplayName ActionStepMethods.GetSelectedFilesInExplorer.HelpTip ActionStepMethods.GetItemsInExplorer.DisplayName ActionStepMethods.GetItemsInExplorer.HelpTip ActionStepMethods.GetCurrentExplorerPath.DisplayName ActionStepMethods.GetCurrentExplorerPath.HelpTip ScriptHelp.ActionMethod.GetItemsInExplorer.Name ScriptHelp.ActionMethod.GetItemsInExplorer.Description ScriptHelp.ActionMethod.GetItemsInExplorer.Returns ScriptHelp.ActionMethod.GetItemsInExplorer.Example.Simple ScriptHelp.ActionMethod.GetItemsInExplorer.Example.Full ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.hWnd.Name ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.hWnd.Description ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.hWnd.Type ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.onlyNames.Name ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.onlyNames.Description ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.onlyNames.Type ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.includeFolders.Name ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.includeFolders.Description ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.includeFolders.Type ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.includeLinks.Name ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.includeLinks.Description ScriptHelp.ActionMethod.GetItemsInExplorer.Parameters.includeLinks.Type ScriptHelp.ActionMethod.GetActiveExplorerPath.Name ScriptHelp.ActionMethod.GetActiveExplorerPath.Description ScriptHelp.ActionMethod.GetActiveExplorerPath.Returns ScriptHelp.ActionMethod.GetActiveExplorerPath.Example.Simple ScriptHelp.ActionMethod.GetActiveExplorerPath.Example.Full ScriptHelp.ActionMethod.GetActiveExplorerPath.Parameters.hWnd.Name ScriptHelp.ActionMethod.GetActiveExplorerPath.Parameters.hWnd.Description ScriptHelp.ActionMethod.GetActiveExplorerPath.Parameters.hWnd.Type ActionStepMethods.GetSelectedFilesOnDesktop.DisplayName ActionStepMethods.GetSelectedFilesOnDesktop.HelpTip --------------------------------------------------------------------------------------------------- 0.3.8.0 - 2/15/2020 --------------------------------------------------------------------------------------------------- - Replaced InputSimulator NuGet package with direct compiled library from another fork where scan codes were addressed: https://github.com/TChatzigiannakis/InputSimulatorPlus - Added mouse acceleration under Options > Advanced, just boosts the movements per axis. It might not be 100% tested - kinda got side-tracked but wanted to get the scan code issue fixed - Added language entries: tabPreferencesMouseAccelerationLabel tabPreferencesMouseAccelerationY --------------------------------------------------------------------------------------------------- 0.3.7.9 - 1/25/2020 --------------------------------------------------------------------------------------------------- - Added sp.IsKeyToggled which is intended for checking Caps, Num, and Scroll lock keys to see if they are toggle on or not - Added floater object to scripts, only set if executing within a floater. Object name in script is floater, properties/methods: Name (string, read only) Text (string) TextColor (Color) KeyMode (bool) Opacity (float) Location (point) X (int) Y (int) Settings (CustomFloaterSetting) Size (int) Update() (void) - Fixed issue with some floater events not firing if using Steps and script tab is empty - Changed sp.StoreNumber/sp.GetStoredNumber from an int to a long to store larger numbers - Added the follow Step commands: Get Color From RBG Get Color From Hex Is Key Toggled Set Custom Floater Text Set Custom Floater Text Color Set Custom Floater Opacity Set Custom Floater Key Mode - Added language entries: CustomFloaterEnter CustomFloaterHover CustomFloaterLeave CustomFloaterHoverDelay ScriptHelp.ActionMethod.StoreNumber.Parameters.value.Type ScriptHelp.ActionMethod.GetStoredNumber.Returns ScriptHelp.ActionMethod.IsKeyToggled.Name ScriptHelp.ActionMethod.IsKeyToggled.Description ScriptHelp.ActionMethod.IsKeyToggled.Returns ScriptHelp.ActionMethod.IsKeyToggled.Parameters.name.Name ScriptHelp.ActionMethod.IsKeyToggled.Parameters.name.Description ScriptHelp.ActionMethod.IsKeyToggled.Parameters.name.Type ScriptHelp.ActionMethod.IsKeyToggled.Example.Simple ScriptHelp.ActionMethod.IsKeyToggled.Example.Full ActionStepMethods.IsKeyToggled.DisplayName ActionStepMethods.IsKeyToggled.HelpTip ActionStepMethods.GetColorFromRGB.DisplayName ActionStepMethods.GetColorFromRGB.HelpTip ActionStepMethods.GetColorFromHex.DisplayName ActionStepMethods.GetColorFromHex.HelpTip ScriptHelpClassFloaterVarsName ScriptHelpScriptObjectsFloaterVarsText ActionStepMethods.SetCustomFloaterText.DisplayName ActionStepMethods.SetCustomFloaterText.HelpTip ActionStepMethods.SetCustomFloaterTextColor.DisplayName ActionStepMethods.SetCustomFloaterTextColor.HelpTip ActionStepMethods.SetCustomFloaterOpacity.DisplayName ActionStepMethods.SetCustomFloaterOpacity.HelpTip ActionStepMethods.SetCustomFloaterKeyMode.DisplayName ActionStepMethods.SetCustomFloaterKeyMode.HelpTip ActionStepMethods.SetCustomFloaterSize.DisplayName ActionStepMethods.SetCustomFloaterSize.HelpTip - Updated language entries: ScriptHelpCategoryTextScriptObjects --------------------------------------------------------------------------------------------------- 0.3.7.8 - 1/22/2020 --------------------------------------------------------------------------------------------------- - Fixed logic issue with click script consume checkbox --------------------------------------------------------------------------------------------------- 0.3.7.7 - 1/3/2020 --------------------------------------------------------------------------------------------------- - Added sp.RunStoreApp('name') and Run Store App step command. This is just a simple encapsulation of the script in this post and uses a full or partial name match: https://forum.strokesplus.net/posts/t7121-How-can-I-open-an-UWP-application-in-Windows10 - You can use the full package name like "Microsoft.WindowsCalculator" or just "Calc" if there are no other Store apps with "calc" in their name. If multiple matches are found, the first match is used. - There is a slight delay as all Store apps are enumerated and searched. - Microsoft makes Store apps very difficult to work with, so this is not an efficient function, but at least provides the basic functionality of opening a Store app. For more responsive actions and to have more conditional logic/control, you really should find the installation folder of the app and use that EXE. Though it can change when the publisher updates the app. Hopefully since Microsoft is loosening the UWP rules they will also add some better methods for Desktop apps to access installed Store apps in the future. - Added language entries: ActionStepMethods.RunStoreApp.DisplayName ActionStepMethods.RunStoreApp.HelpTip ScriptHelp.ActionMethod.RunStoreApp.Name ScriptHelp.ActionMethod.RunStoreApp.Description ScriptHelp.ActionMethod.RunStoreApp.Returns ScriptHelp.ActionMethod.RunStoreApp.Example.Simple ScriptHelp.ActionMethod.RunStoreApp.Parameters.packageName.Name ScriptHelp.ActionMethod.RunStoreApp.Parameters.packageName.Description ScriptHelp.ActionMethod.RunStoreApp.Parameters.packageName.Type --------------------------------------------------------------------------------------------------- 0.3.7.6 - 12/30/2019 --------------------------------------------------------------------------------------------------- - Removed bindings for the following events as I was having inconsistent behavior, sometimes S+ was staying disabled. Replaced with just reacting to the WM_DISPLAYCHANGE message via WndProc instead/ SystemEvents.DisplaySettingsChanging SystemEvents.DisplaySettingsChanged - Removed restriction of defining click steps/script for primary/secondary stroke buttons, though the option to consume the event is disabled. - However, only the mouse Down event is processed for these buttons, you will need to use the Release tab and check the mouse button there to handle the button Up event, checking the click.Button property, e.g. if(click.Button == MouseButtons.Right) - Added language entry: ClickEventStrokeButtonText --------------------------------------------------------------------------------------------------- 0.3.7.5 - 12/27/2019 --------------------------------------------------------------------------------------------------- - Updated script editor (via new property on BaseAction and SavedMacro) to remember the last caret position within the script. This will ensure the area is scrolled into view, but the scroll location won't likely be the exact same. Meaning the script editor may not look exactly as you left it (same exact lines in view), but the line where you left off will be visible; usually at the bottom of the script area. - Added Copy/Paste to Hot Keys section and red text color for hot key conflicts - Fixed issue with hot key images not being properly updated for category events - Added calls in other views to update images/text color on paste events --------------------------------------------------------------------------------------------------- 0.3.7.4 - 12/26/2019 --------------------------------------------------------------------------------------------------- - Added Help button in steps toolbar, which opens the URL: https://www.strokesplus.net/Help/Steps - Update load hot keys code to not attempt to register if there is no key (like a new/empty hot key) - Updated the major tree and list views to no longer refresh each time a change is made as this was a poor UX leftover from very early development. There are still a couple cases where this happens, but the majority of just working with actions, etc. will feel much less jarring. Note that sorting occurs when the tree/list is loaded, so changes made while in the screen will be added to the end of the tree node or list, but will be ordered then next time it is fully reloaded. --------------------------------------------------------------------------------------------------- 0.3.7.3 - 12/23/2019 --------------------------------------------------------------------------------------------------- - Added Screen class extension to get the friendly name of the Screen's display, e.g. "HP 2511". If no friendly name is found, it will return the device name, e.g. "\\.\DISPLAY1". Example usage: sp.MessageBox(action.Window.Screen.DeviceFriendlyName(), "Screen Friendly Name"); - Updated Exclusion Zones to add "Fixed" and "Relative To Screen". Relative To Screen allows for simplified exclusions across multiple monitor systems, where you want to exclude the same region regardless of which screen the mouse is on. Fixed is just the same as before if Relative to Window wasn't checked - Updated several language entries which used the word "script" to be more generic with the introduction of Steps - Added language entries: ExclusionZoneUseRelativeToScreenPosition - Updated language entries: frmAppBeforeAfterTab BeforeActionScriptLabel AfterActionScriptLabel BeforeAfterActionGlobal BeforeAfterActionOwn TextExpansionTypeScript TextExpansionTypeScriptDescription tabPreferencesFireOnLeftClick tabPreferencesFireOnLoadAction tabPreferencesFireOnMiddleClick tabPreferencesFireOnMouseWheel tabPreferencesFireOnRelease tabPreferencesFireOnRightClick tabPreferencesFireOnX1Click tabPreferencesFireOnX2Click tabPreferencesFireOnCloseAction tabPreferencesMouseWheelTick tabPreferencesUseAfterActionScript tabPreferencesUseBeforeActionScript tabPreferencesFireOnWindowFocus tabPreferencesHorzMouseWheelTick tabGlobalLoadUnloadTabName ScriptHelpCategoryTextScriptObjects LeftClickScriptTab MiddleClickScriptTab RightClickScriptTab X1ClickTab X2ClickTab HorizontalWheelScriptTab LoadScriptsErrorMessage LoadScriptsErrorTitle OnReleaseTab LoadScriptTab UnloadScriptTab WheelScriptTab --------------------------------------------------------------------------------------------------- 0.3.7.2 - 12/19/2019 --------------------------------------------------------------------------------------------------- - Added missing check to hide fading hint in floater touch down code - Steps help tip typo fix - Fixed issue with Hint popup sizing related to 0.3.7.0 code changes - Fixed issue with Keep Hotkeys Active When Disabled not being honored when S+ is already disabled --------------------------------------------------------------------------------------------------- 0.3.7.1 - 12/18/2019 --------------------------------------------------------------------------------------------------- - Reverted default setting for Send Keys for App Commands, it is now defaulted to being enabled. It will only be defaulted the first time you run, after that your setting will be honored. The app commands were working fine for me initially, but suddenly stopped, so I want to put the behavior back to the original method unless someone is specifically having issues and opts to disable the setting themselves. - Added logic in InitializeNewerSettings function to flag events/checks as completed, this is an internal item but noting here for my own reference --------------------------------------------------------------------------------------------------- 0.3.7.0 - 12/17/2019 --------------------------------------------------------------------------------------------------- - Added ability to hide App Name from Hint popup in Options > Hints - Added Fade Steps setting for Hint popup, higher means it fades away more slowly. 0 means no fading - Added HintLocationEnum.CursorCenterBottom (Cursor Center Bottom), note the top location is mouse cursor Y + hint padding * 2 - getting the actual cursor's height is pretty resource intensive and for now doesn't seem worth it - Added language entries: tabPreferencesHintLocationCursorCenterBottom tabPreferencesHintFadeStepsLabel tabPreferencesHintHideAppName --------------------------------------------------------------------------------------------------- 0.3.6.9 - 12/16/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with pasting copied Steps multiple times, resulting in object references instead of deep cloned objects. This created odd behavior like changing the sequence not being reflected and other unexpected events. - Fixed issue with {stackTake} and {stackLeave} (used in Step expressions) not escaping single quotes for string evaluations --------------------------------------------------------------------------------------------------- 0.3.6.8 - 12/15/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with importing hot keys and saved macros - Moved Steps restore/max buttons to steps toobar and steps toolbar to new table layout - Added Steps command Evaluate As Boolean to reduce the steps needed for simple comparisons. Search the Microsoft site for DataColumn.Expression for usage and syntax, be sure to enclose strings with single quotes; even when pulling from the stack e.g. '{stackTake}' = 'someValue'. https://docs.microsoft.com/en-us/dotnet/api/system.data.datacolumn.expression?view=netframework-4.6.2 - Added step commands, which use the same logic from above, the If Expression/Else If Expression command can be used interchangebly with the standard If/Else If/Else blocks: If Expression Else If Expression Break If Expression (for use within Loop blocks) - Added language entries: ActionStepMethods.EvaluateAsBoolean.DisplayName ActionStepMethods.EvaluateAsBoolean.HelpTip ActionStepMethods.IfExpression.DisplayName ActionStepMethods.IfExpression.HelpTip ActionStepMethods.ElseIfExpression.DisplayName ActionStepMethods.ElseIfExpression.HelpTip ActionStepMethods.BreakIfExpression.DisplayName ActionStepMethods.BreakIfExpression.HelpTip --------------------------------------------------------------------------------------------------- 0.3.6.7 - 12/13/2019 --------------------------------------------------------------------------------------------------- - Corrected logic issue in the Steps were treating If/Else If/Else blocks, the subsequent section was still being executed even if one of the previous section evaluations were met - Added Steps command Stop which stops processing any further steps within the sequence - Updated object property/field Step commands to support deep names (Object.Property.Field) and for each depth checks if the name is a field or property and retrieves the appropriate value for the next depth call. This effectively makes the Get/Set Field/Property commands redundant as they ultimately end up using the same logic, so the Field commands have been removed. - Updated language entries: ScriptHelp.ActionMethod.DisableNext.Description ActionStepMethods.DisableNext.HelpTip ActionStepMethods.GetObjectPropertyByName.HelpTip ActionStepMethods.SetObjectPropertyByName.HelpTip - Added language entries: ActionStepMethods.Stop.DisplayName ActionStepMethods.Stop.HelpTip --------------------------------------------------------------------------------------------------- 0.3.6.6 - 12/12/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with pasting Steps not using the language entry for the command name - Fixed issue with click/wheel events not showing the Event Object dropdown for bool parameters - Fixed issue with Boolean parameters not saving True correctly - Updated a few paste Steps UX items - Updated Steps list to ensure selected item is visible on load - Updated Steps list to support multiselect, for bulk actions like toggle active, move, or delete; however only contiguous Steps can be moved up or down together - Added Step commands: Is Window Always On Top Toggle Window Always On Top Set Window Always On Top - Added language entries: ActionStepMethods.IsWindowAlwaysOnTop.DisplayName ActionStepMethods.IsWindowAlwaysOnTop.HelpTip ActionStepMethods.ToggleWindowAlwaysOnTop.DisplayName ActionStepMethods.ToggleWindowAlwaysOnTop.HelpTip ActionStepMethods.SetWindowAlwaysOnTop.DisplayName ActionStepMethods.SetWindowAlwaysOnTop.HelpTip - Updated language entry: GenericDeleteConfirmMessage --------------------------------------------------------------------------------------------------- 0.3.6.5 - 12/11/2019 --------------------------------------------------------------------------------------------------- - BUCKLE UP, BUCKAROOS! This is a major release! - NEW FEATURE: Added Steps as an option instead of using a Script. This applies anywhere the Script editor is shown (except macros). This enables less technical users to make simple actions without the need to learn scripting. It also doesn't use the script engine, so in theory it should use less resources and might be a little faster; though reflection is involved, so it might be a wash. - The method used (Steps or Script) is based on whichever tab is selected. - Steps operate using a stack to hold variables, a stack is like a stack of papers. You can add a piece of paper to the top of the stack, take a piece of paper from the top of the stack, or simply look at the paper on the top of the stack without removing it. - For any Step which retrieves or creates a value, the value is added to the top of the stack. You can then use those values in subsequent Steps by selecting the From Stack option. If you select the Leave On Stack option, it will only get the value to use it, but it will remain on the top of the stack. Once an item is removed from the stack, it is gone. You can use the various "Store" step functions to store values for later use by calling the matching "GetStored" function to put the stored value back on the top of the stack. - Stacks are LIFO (Last In First Out), so you need to keep that in mind when adding and removing items from the stack; you want to add them to the stack in the reverse order that the values will be used in later steps. Thinking of the stack as a literal stack of papers which Steps add to and pull from will help you visualize how this works. - For example, you're going to call ShowMessageBox but instead of specifying the Message and Title directly, you're going to use the stack. So you first add the strings to the stack then pull them off the stack when calling ShowMessageBox. Since the first parameter for ShowMessageBox is the message, it will be the first item pulled from the stack, then title will be populated with the next item on the stack, so we want message to be on the top of the stack before calling Show Message Box: Step: GetString - "This is the title" (adds this string to the top of the empty stack) Step: GetString - "This is the message" (adds this string to the top of the stack, above the title) Step: ShowMessageBox Parameter: message = From Stack (removes the item on the top of the stack [message]) Parameter: title = From Stack (removes the item on the top of the stack [title]) - You can also use the Stack functions to help manage the items on the stack, for example you could have an If / ElseIf / ElseIf / Else / EndIf block for which the If / ElseIf steps test two values on the stack using the Leave On Stack option so each test doesn't remove them for the next ElseIf statement to use. After the EndIf (or within an If / ElseIf block) you could call RemoveItemsFromStack (2) to remove those two values after you no longer need them. There is also GetNumberOfItemsOnStack which puts a number on the top of the stack for how many items there were in the stack BEFORE adding the result. And you can call Clear Stack to remove all items from the stack. - Steps support the simple control functions If and Loop. To keep things simple, these cannot be nested within themselves, for example an If block within an If block (though ElseIf and Else are supported for If blocks) or a Loop block within a Loop block. However, If and Loop can exist within each other's blocks, just no self-nesting. If you're getting that complex, you should probably just use a script at that point! - Replaced the default install configuration, utilizing Steps instead of Scripts for most of the simple actions. Note that each action still has the Script tab populated with the script, for reference, but Steps is the selected action method. - Updated sp.SendVKey, sp.SendVKeyDown, sp.SendVKeyUp to recognize special app command keys and instead posts the WM_APPCOMMAND message for the key instead of injecting the actual key into the input queue. Please let me know if you have any issues, but you can enable the new option "Send Keys for App Commands" to just send the keys like before. This is a list of keys affected: vk.BROWSER_BACK vk.BROWSER_FAVORITES vk.BROWSER_FORWARD vk.BROWSER_HOME vk.BROWSER_REFRESH vk.BROWSER_SEARCH vk.BROWSER_STOP vk.LAUNCH_APP1 vk.LAUNCH_APP2 vk.LAUNCH_MAIL vk.LAUNCH_MEDIA_SELECT vk.MEDIA_NEXT_TRACK vk.MEDIA_PLAY_PAUSE vk.MEDIA_PREV_TRACK vk.MEDIA_STOP vk.VOLUME_DOWN vk.VOLUME_MUTE vk.VOLUME_UP - Added option to disable single click tray icon to toggle enable/disable StrokesPlus.net - Added option to only use the root window to activate, for Always Activate Window on Gesture Complete The previous update is probably better, but this will revert to the previous behavior - Added sp.RunOrActivate which takes a full path and EXE name, if there is a window running by that EXE it is activated, otherwise the EXE is started - Added sp.StopAllActions which stops processing of action steps - Added sp.GetPlaybackVolume, sp.SetPlaybackVolume, sp.TogglePlaybackMute, sp.GetCommunicationsVolume, sp.SetCommunicationsVolume, sp.ToggleCommunicationsMute to simplify basic volume operations - Added Keep Hotkeys Active When Disabled option under Advanced, check to prevent hot keys from being unregistered when StrokesPlus.net is disabled - Removed JournalEngine from ActionType enum as it's not used - Added types to script engine FloaterLayout CustomFloaterLayout Enumerable KeyValuePair (as KeyValuePairObject) ActionStepParameter - Upon loading, updates all existing Text Expansions items using scripts to have the correct base action Type - ActionStep.Parameters made obsolete, replaced by ActionStep.MethodParameters, which is a List. Any existing values will be converted to the new type with LeaveOnStack set to false. Of course, since action steps have never been enabled, this shouldn't affect anyone at all - but just to be on the safe side since I may have had some in the default configuration - Added Steps/Script area Max/Restore buttons (only visible in ActionEditor currently) to vertically expand/collapse the Steps/Script for more room to work with Steps/Scripts - Enabled Double Buffering for frmMain, ActionStepsScript, and ActionStepEditor, not sure if it will make a difference or cause a problem, so noting it here - Updated language entries: ActionTab - Added language entries: tabPreferencesKeepHotkeysActiveWhenDisabled tabPreferencesDisableSingleTrayClick tabPreferencesActivateWindowUseRootParent tabPreferencesSendKeysForAppCommands StackEmptyErrorMessage ScriptHelp.ActionMethod.GetStoredObject.Name ScriptHelp.ActionMethod.GetStoredObject.Description ScriptHelp.ActionMethod.GetStoredObject.Returns ScriptHelp.ActionMethod.GetStoredObject.Example.Simple ScriptHelp.ActionMethod.GetStoredObject.Parameters.name.Name ScriptHelp.ActionMethod.GetStoredObject.Parameters.name.Description ScriptHelp.ActionMethod.GetStoredObject.Parameters.name.Type ScriptHelp.ActionMethod.DeleteStoredObject.Name ScriptHelp.ActionMethod.DeleteStoredObject.Description ScriptHelp.ActionMethod.DeleteStoredObject.Returns ScriptHelp.ActionMethod.DeleteStoredObject.Example.Simple ScriptHelp.ActionMethod.DeleteStoredObject.Parameters.name.Name ScriptHelp.ActionMethod.DeleteStoredObject.Parameters.name.Description ScriptHelp.ActionMethod.DeleteStoredObject.Parameters.name.Type ScriptHelp.ActionMethod.StoreObject.Name ScriptHelp.ActionMethod.StoreObject.Description ScriptHelp.ActionMethod.StoreObject.Returns ScriptHelp.ActionMethod.StoreObject.Example.Simple ScriptHelp.ActionMethod.StoreObject.Parameters.name.Name ScriptHelp.ActionMethod.StoreObject.Parameters.name.Description ScriptHelp.ActionMethod.StoreObject.Parameters.name.Type ScriptHelp.ActionMethod.StoreObject.Parameters.value.Name ScriptHelp.ActionMethod.StoreObject.Parameters.value.Description ScriptHelp.ActionMethod.StoreObject.Parameters.value.Type ScriptHelp.ActionMethod.StopAllActionSteps.Name ScriptHelp.ActionMethod.StopAllActionSteps.Description ScriptHelp.ActionMethod.StopAllActionSteps.Returns ScriptHelp.ActionMethod.StopAllActionSteps.Example.Simple ScriptHelp.ActionMethod.Run.Parameters.command.Type ScriptHelp.ActionMethod.Run.Parameters.command.Description ScriptHelp.ActionMethod.RunOrActivate.Name ScriptHelp.ActionMethod.RunOrActivate.Description ScriptHelp.ActionMethod.RunOrActivate.Returns ScriptHelp.ActionMethod.RunOrActivate.Example.Simple ScriptHelp.ActionMethod.RunOrActivate.Parameters.exeName.Name ScriptHelp.ActionMethod.RunOrActivate.Parameters.exeName.Description ScriptHelp.ActionMethod.RunOrActivate.Parameters.exeName.Type ScriptHelp.ActionMethod.GetPlaybackVolume.Name ScriptHelp.ActionMethod.GetPlaybackVolume.Description ScriptHelp.ActionMethod.GetPlaybackVolume.Returns ScriptHelp.ActionMethod.GetPlaybackVolume.Example.Simple ScriptHelp.ActionMethod.TogglePlaybackMute.Name ScriptHelp.ActionMethod.TogglePlaybackMute.Description ScriptHelp.ActionMethod.TogglePlaybackMute.Returns ScriptHelp.ActionMethod.TogglePlaybackMute.Example.Simple ScriptHelp.ActionMethod.SetPlaybackVolume.Name ScriptHelp.ActionMethod.SetPlaybackVolume.Description ScriptHelp.ActionMethod.SetPlaybackVolume.Returns ScriptHelp.ActionMethod.SetPlaybackVolume.Example.Simple ScriptHelp.ActionMethod.SetPlaybackVolume.Parameters.newVolumeLevel.Name ScriptHelp.ActionMethod.SetPlaybackVolume.Parameters.newVolumeLevel.Description ScriptHelp.ActionMethod.SetPlaybackVolume.Parameters.newVolumeLevel.Type ScriptHelp.ActionMethod.GetCommunicationsVolume.Name ScriptHelp.ActionMethod.GetCommunicationsVolume.Description ScriptHelp.ActionMethod.GetCommunicationsVolume.Returns ScriptHelp.ActionMethod.GetCommunicationsVolume.Example.Simple ScriptHelp.ActionMethod.ToggleCommunicationsMute.Name ScriptHelp.ActionMethod.ToggleCommunicationsMute.Description ScriptHelp.ActionMethod.ToggleCommunicationsMute.Returns ScriptHelp.ActionMethod.ToggleCommunicationsMute.Example.Simple ScriptHelp.ActionMethod.SetCommunicationsVolume.Name ScriptHelp.ActionMethod.SetCommunicationsVolume.Description ScriptHelp.ActionMethod.SetCommunicationsVolume.Returns ScriptHelp.ActionMethod.SetCommunicationsVolume.Example.Simple ScriptHelp.ActionMethod.SetCommunicationsVolume.Parameters.newVolumeLevel.Name ScriptHelp.ActionMethod.SetCommunicationsVolume.Parameters.newVolumeLevel.Description ScriptHelp.ActionMethod.SetCommunicationsVolume.Parameters.newVolumeLevel.Type InsertStep MoveUp MoveDown NewStep Command ParameterSource LeaveOnStack LeaveOnStackTip CommandParameters MethodInvokeParameters PressKeysBelow EnterOrSelectValue False True InsertParameter EventValue EnterNotes DirectInput FromStack EventObject None Info Warning Error Normal Minimized Maximized Hidden NewParameterName Returns ActionStepMethodCategories.AllCategories.DisplayName ActionStepMethodCategories.WindowsControls.DisplayName ActionStepMethodCategories.StoreRetrieveValues.DisplayName ActionStepMethodCategories.Keyboard.DisplayName ActionStepMethodCategories.Mouse.DisplayName ActionStepMethodCategories.InputDisplay.DisplayName ActionStepMethodCategories.Values.DisplayName ActionStepMethodCategories.Utility.DisplayName ActionStepMethodCategories.Media.DisplayName ActionStepMethodCategories.Floaters.DisplayName ActionStepMethodCategories.ControlFlow.DisplayName ActionStepMethodCategories.Math.DisplayName ActionStepMethodCategories.Arrays.DisplayName ActionStepMethodCategories.Objects.DisplayName ActionStepMethodCategories.Screens.DisplayName ActionStepMethodCategories.MultipleMonitors.DisplayName ActionStepMethodCategories.Stack.DisplayName ActionStepMethodCategories.Clipboard.DisplayName ActionStepMethodCategories.Strings.DisplayName ActionStepMethods.Add.DisplayName ActionStepMethods.Add.HelpTip ActionStepMethods.AppendText.DisplayName ActionStepMethods.AppendText.HelpTip ActionStepMethods.Break.DisplayName ActionStepMethods.Break.HelpTip ActionStepMethods.BreakIf.DisplayName ActionStepMethods.BreakIf.HelpTip ActionStepMethods.ClearStack.DisplayName ActionStepMethods.ClearStack.HelpTip ActionStepMethods.CloseSettings.DisplayName ActionStepMethods.CloseSettings.HelpTip ActionStepMethods.CloseWindow.DisplayName ActionStepMethods.CloseWindow.HelpTip ActionStepMethods.ConsumePhysicalInput.DisplayName ActionStepMethods.ConsumePhysicalInput.HelpTip ActionStepMethods.ContainsRegex.DisplayName ActionStepMethods.ContainsRegex.HelpTip ActionStepMethods.ContainsText.DisplayName ActionStepMethods.ContainsText.HelpTip ActionStepMethods.ConvertToType.DisplayName ActionStepMethods.ConvertToType.HelpTip ActionStepMethods.Delay.DisplayName ActionStepMethods.Delay.HelpTip ActionStepMethods.DeleteStoredBool.DisplayName ActionStepMethods.DeleteStoredBool.HelpTip ActionStepMethods.DeleteStoredHandle.DisplayName ActionStepMethods.DeleteStoredHandle.HelpTip ActionStepMethods.DeleteStoredNumber.DisplayName ActionStepMethods.DeleteStoredNumber.HelpTip ActionStepMethods.DeleteStoredObject.DisplayName ActionStepMethods.DeleteStoredObject.HelpTip ActionStepMethods.DeleteStoredPoint.DisplayName ActionStepMethods.DeleteStoredPoint.HelpTip ActionStepMethods.DeleteStoredRectangle.DisplayName ActionStepMethods.DeleteStoredRectangle.HelpTip ActionStepMethods.DeleteStoredString.DisplayName ActionStepMethods.DeleteStoredString.HelpTip ActionStepMethods.GetDesktopWindow.DisplayName ActionStepMethods.GetDesktopWindow.HelpTip ActionStepMethods.GetDesktopWindowListView.DisplayName ActionStepMethods.GetDesktopWindowListView.HelpTip ActionStepMethods.Disable.DisplayName ActionStepMethods.Disable.HelpTip ActionStepMethods.DisableCapture.DisplayName ActionStepMethods.DisableCapture.HelpTip ActionStepMethods.DisableNext.DisplayName ActionStepMethods.DisableNext.HelpTip ActionStepMethods.DisplayText.DisplayName ActionStepMethods.DisplayText.HelpTip ActionStepMethods.Divide.DisplayName ActionStepMethods.Divide.HelpTip ActionStepMethods.Else.DisplayName ActionStepMethods.Else.HelpTip ActionStepMethods.ElseIf.DisplayName ActionStepMethods.ElseIf.HelpTip ActionStepMethods.EmptyRecycleBins.DisplayName ActionStepMethods.EmptyRecycleBins.HelpTip ActionStepMethods.EnableCapture.DisplayName ActionStepMethods.EnableCapture.HelpTip ActionStepMethods.EndIf.DisplayName ActionStepMethods.EndIf.HelpTip ActionStepMethods.EndLoop.DisplayName ActionStepMethods.EndLoop.HelpTip ActionStepMethods.Evaluate.DisplayName ActionStepMethods.Evaluate.HelpTip ActionStepMethods.Exit.DisplayName ActionStepMethods.Exit.HelpTip ActionStepMethods.GetExpandedEnvironmentVariables.DisplayName ActionStepMethods.GetExpandedEnvironmentVariables.HelpTip ActionStepMethods.GetForegroundWindow.DisplayName ActionStepMethods.GetForegroundWindow.HelpTip ActionStepMethods.GetAllScreens.DisplayName ActionStepMethods.GetAllScreens.HelpTip ActionStepMethods.GetArrayItemByIndex.DisplayName ActionStepMethods.GetArrayItemByIndex.HelpTip ActionStepMethods.GetArrayItemCount.DisplayName ActionStepMethods.GetArrayItemCount.HelpTip ActionStepMethods.GetBlueValueFromColor.DisplayName ActionStepMethods.GetBlueValueFromColor.HelpTip ActionStepMethods.GetBoolean.DisplayName ActionStepMethods.GetBoolean.HelpTip ActionStepMethods.GetClipboardText.DisplayName ActionStepMethods.GetClipboardText.HelpTip ActionStepMethods.GetCommunicationsVolume.DisplayName ActionStepMethods.GetCommunicationsVolume.HelpTip ActionStepMethods.GetControlFromPoint.DisplayName ActionStepMethods.GetControlFromPoint.HelpTip ActionStepMethods.GetControlFromPointXY.DisplayName ActionStepMethods.GetControlFromPointXY.HelpTip ActionStepMethods.GetCurrentMouseCursor.DisplayName ActionStepMethods.GetCurrentMouseCursor.HelpTip ActionStepMethods.GetCurrentMousePoint.DisplayName ActionStepMethods.GetCurrentMousePoint.HelpTip ActionStepMethods.GetFirstMoveableParentFromPoint.DisplayName ActionStepMethods.GetFirstMoveableParentFromPoint.HelpTip ActionStepMethods.GetFirstMoveableParentFromPointXY.DisplayName ActionStepMethods.GetFirstMoveableParentFromPointXY.HelpTip ActionStepMethods.GetGreenValueFromColor.DisplayName ActionStepMethods.GetGreenValueFromColor.HelpTip ActionStepMethods.GetNumber.DisplayName ActionStepMethods.GetNumber.HelpTip ActionStepMethods.GetNumberOfItemsOnStack.DisplayName ActionStepMethods.GetNumberOfItemsOnStack.HelpTip ActionStepMethods.GetObjectFieldByName.DisplayName ActionStepMethods.GetObjectFieldByName.HelpTip ActionStepMethods.GetObjectPropertyByName.DisplayName ActionStepMethods.GetObjectPropertyByName.HelpTip ActionStepMethods.GetPixelColorFromPoint.DisplayName ActionStepMethods.GetPixelColorFromPoint.HelpTip ActionStepMethods.GetPlaybackVolume.DisplayName ActionStepMethods.GetPlaybackVolume.HelpTip ActionStepMethods.GetPoint.DisplayName ActionStepMethods.GetPoint.HelpTip ActionStepMethods.GetRectangle.DisplayName ActionStepMethods.GetRectangle.HelpTip ActionStepMethods.GetRedValueFromColor.DisplayName ActionStepMethods.GetRedValueFromColor.HelpTip ActionStepMethods.GetScreenFromHandle.DisplayName ActionStepMethods.GetScreenFromHandle.HelpTip ActionStepMethods.GetScreenFromPoint.DisplayName ActionStepMethods.GetScreenFromPoint.HelpTip ActionStepMethods.GetScreenFromPointXY.DisplayName ActionStepMethods.GetScreenFromPointXY.HelpTip ActionStepMethods.GetScreenFromRectangle.DisplayName ActionStepMethods.GetScreenFromRectangle.HelpTip ActionStepMethods.GetStoredBool.DisplayName ActionStepMethods.GetStoredBool.HelpTip ActionStepMethods.GetStoredHandle.DisplayName ActionStepMethods.GetStoredHandle.HelpTip ActionStepMethods.GetStoredNumber.DisplayName ActionStepMethods.GetStoredNumber.HelpTip ActionStepMethods.GetStoredObject.DisplayName ActionStepMethods.GetStoredObject.HelpTip ActionStepMethods.GetStoredPoint.DisplayName ActionStepMethods.GetStoredPoint.HelpTip ActionStepMethods.GetStoredRectangle.DisplayName ActionStepMethods.GetStoredRectangle.HelpTip ActionStepMethods.GetStoredString.DisplayName ActionStepMethods.GetStoredString.HelpTip ActionStepMethods.GetString.DisplayName ActionStepMethods.GetString.HelpTip ActionStepMethods.GetTextLength.DisplayName ActionStepMethods.GetTextLength.HelpTip ActionStepMethods.GetTopLevelWindowFromPoint.DisplayName ActionStepMethods.GetTopLevelWindowFromPoint.HelpTip ActionStepMethods.GetTopLevelWindowFromPointXY.DisplayName ActionStepMethods.GetTopLevelWindowFromPointXY.HelpTip ActionStepMethods.GetWindowClassName.DisplayName ActionStepMethods.GetWindowClassName.HelpTip ActionStepMethods.GetWindowHeight.DisplayName ActionStepMethods.GetWindowHeight.HelpTip ActionStepMethods.GetWindowLocation.DisplayName ActionStepMethods.GetWindowLocation.HelpTip ActionStepMethods.GetWindowLocationX.DisplayName ActionStepMethods.GetWindowLocationX.HelpTip ActionStepMethods.GetWindowLocationY.DisplayName ActionStepMethods.GetWindowLocationY.HelpTip ActionStepMethods.GetWindowMainModuleFileName.DisplayName ActionStepMethods.GetWindowMainModuleFileName.HelpTip ActionStepMethods.GetWindowMainModuleFilePath.DisplayName ActionStepMethods.GetWindowMainModuleFilePath.HelpTip ActionStepMethods.GetWindowRectangle.DisplayName ActionStepMethods.GetWindowRectangle.HelpTip ActionStepMethods.GetWindowRectangleFull.DisplayName ActionStepMethods.GetWindowRectangleFull.HelpTip ActionStepMethods.GetWindowText.DisplayName ActionStepMethods.GetWindowText.HelpTip ActionStepMethods.GetWindowWidth.DisplayName ActionStepMethods.GetWindowWidth.HelpTip ActionStepMethods.If.DisplayName ActionStepMethods.If.HelpTip ActionStepMethods.InputBox.DisplayName ActionStepMethods.InputBox.HelpTip ActionStepMethods.InvokeObjectMethodByName.DisplayName ActionStepMethods.InvokeObjectMethodByName.HelpTip ActionStepMethods.IsWindowMaximized.DisplayName ActionStepMethods.IsWindowMaximized.HelpTip ActionStepMethods.IsWindowMinimized.DisplayName ActionStepMethods.IsWindowMinimized.HelpTip ActionStepMethods.GetLastActiveWindow.DisplayName ActionStepMethods.GetLastActiveWindow.HelpTip ActionStepMethods.SwitchToLastApplication.DisplayName ActionStepMethods.SwitchToLastApplication.HelpTip ActionStepMethods.GetLastFocusControl.DisplayName ActionStepMethods.GetLastFocusControl.HelpTip ActionStepMethods.Loop.DisplayName ActionStepMethods.Loop.HelpTip ActionStepMethods.MaximizeOrRestoreWindow.DisplayName ActionStepMethods.MaximizeOrRestoreWindow.HelpTip ActionStepMethods.MaximizeWindow.DisplayName ActionStepMethods.MaximizeWindow.HelpTip ActionStepMethods.ShowMessageBox.DisplayName ActionStepMethods.ShowMessageBox.HelpTip ActionStepMethods.MinimizeWindow.DisplayName ActionStepMethods.MinimizeWindow.HelpTip ActionStepMethods.MouseClick.DisplayName ActionStepMethods.MouseClick.HelpTip ActionStepMethods.MouseClickXY.DisplayName ActionStepMethods.MouseClickXY.HelpTip ActionStepMethods.MouseMove.DisplayName ActionStepMethods.MouseMove.HelpTip ActionStepMethods.MouseMoveXY.DisplayName ActionStepMethods.MouseMoveXY.HelpTip ActionStepMethods.MouseRestrictActive.DisplayName ActionStepMethods.MouseRestrictActive.HelpTip ActionStepMethods.MouseRestrictClear.DisplayName ActionStepMethods.MouseRestrictClear.HelpTip ActionStepMethods.MouseRestrictToRectangle.DisplayName ActionStepMethods.MouseRestrictToRectangle.HelpTip ActionStepMethods.MouseWheel.DisplayName ActionStepMethods.MouseWheel.HelpTip ActionStepMethods.MouseWheelXY.DisplayName ActionStepMethods.MouseWheelXY.HelpTip ActionStepMethods.MoveWindowToNextScreen.DisplayName ActionStepMethods.MoveWindowToNextScreen.HelpTip ActionStepMethods.MoveWindowToPreviousScreen.DisplayName ActionStepMethods.MoveWindowToPreviousScreen.HelpTip ActionStepMethods.MoveWindowToScreen.DisplayName ActionStepMethods.MoveWindowToScreen.HelpTip ActionStepMethods.Multiply.DisplayName ActionStepMethods.Multiply.HelpTip ActionStepMethods.SwitchToNextApplication.DisplayName ActionStepMethods.SwitchToNextApplication.HelpTip ActionStepMethods.OpenSettings.DisplayName ActionStepMethods.OpenSettings.HelpTip ActionStepMethods.OpenURL.DisplayName ActionStepMethods.OpenURL.HelpTip ActionStepMethods.PlaySound.DisplayName ActionStepMethods.PlaySound.HelpTip ActionStepMethods.RelayGesture.DisplayName ActionStepMethods.RelayGesture.HelpTip ActionStepMethods.Reload.DisplayName ActionStepMethods.Reload.HelpTip ActionStepMethods.ReloadScriptEnginePool.DisplayName ActionStepMethods.ReloadScriptEnginePool.HelpTip ActionStepMethods.RemoveItemsFromStack.DisplayName ActionStepMethods.RemoveItemsFromStack.HelpTip ActionStepMethods.ReplaceText.DisplayName ActionStepMethods.ReplaceText.HelpTip ActionStepMethods.RestoreWindow.DisplayName ActionStepMethods.RestoreWindow.HelpTip ActionStepMethods.Run.DisplayName ActionStepMethods.Run.HelpTip ActionStepMethods.RunOrActivate.DisplayName ActionStepMethods.RunOrActivate.HelpTip ActionStepMethods.RunProgram.DisplayName ActionStepMethods.RunProgram.HelpTip ActionStepMethods.SendAltDown.DisplayName ActionStepMethods.SendAltDown.HelpTip ActionStepMethods.SendAltUp.DisplayName ActionStepMethods.SendAltUp.HelpTip ActionStepMethods.SendControlDown.DisplayName ActionStepMethods.SendControlDown.HelpTip ActionStepMethods.SendControlUp.DisplayName ActionStepMethods.SendControlUp.HelpTip ActionStepMethods.SendHotKey.DisplayName ActionStepMethods.SendHotKey.HelpTip ActionStepMethods.SendKeys.DisplayName ActionStepMethods.SendKeys.HelpTip ActionStepMethods.SendShiftDown.DisplayName ActionStepMethods.SendShiftDown.HelpTip ActionStepMethods.SendShiftUp.DisplayName ActionStepMethods.SendShiftUp.HelpTip ActionStepMethods.SendString.DisplayName ActionStepMethods.SendString.HelpTip ActionStepMethods.SendVirtualKey.DisplayName ActionStepMethods.SendVirtualKey.HelpTip ActionStepMethods.SendVirtualKeyDown.DisplayName ActionStepMethods.SendVirtualKeyDown.HelpTip ActionStepMethods.SendVirtualKeyUp.DisplayName ActionStepMethods.SendVirtualKeyUp.HelpTip ActionStepMethods.SendWinDown.DisplayName ActionStepMethods.SendWinDown.HelpTip ActionStepMethods.SendWinUp.DisplayName ActionStepMethods.SendWinUp.HelpTip ActionStepMethods.SetClipboardText.DisplayName ActionStepMethods.SetClipboardText.HelpTip ActionStepMethods.SetCommunicationsVolume.DisplayName ActionStepMethods.SetCommunicationsVolume.HelpTip ActionStepMethods.SetForegroundWindow.DisplayName ActionStepMethods.SetForegroundWindow.HelpTip ActionStepMethods.SetObjectFieldByName.DisplayName ActionStepMethods.SetObjectFieldByName.HelpTip ActionStepMethods.SetObjectPropertyByName.DisplayName ActionStepMethods.SetObjectPropertyByName.HelpTip ActionStepMethods.SetPlaybackVolume.DisplayName ActionStepMethods.SetPlaybackVolume.HelpTip ActionStepMethods.SetWindowHeight.DisplayName ActionStepMethods.SetWindowHeight.HelpTip ActionStepMethods.SetWindowLocation.DisplayName ActionStepMethods.SetWindowLocation.HelpTip ActionStepMethods.SetWindowLocationXY.DisplayName ActionStepMethods.SetWindowLocationXY.HelpTip ActionStepMethods.SetWindowSize.DisplayName ActionStepMethods.SetWindowSize.HelpTip ActionStepMethods.SetWindowWidth.DisplayName ActionStepMethods.SetWindowWidth.HelpTip ActionStepMethods.ShowBalloonTip.DisplayName ActionStepMethods.ShowBalloonTip.HelpTip ActionStepMethods.StopAllActionSteps.DisplayName ActionStepMethods.StopAllActionSteps.HelpTip ActionStepMethods.StopAllScripts.DisplayName ActionStepMethods.StopAllScripts.HelpTip ActionStepMethods.StoreBool.DisplayName ActionStepMethods.StoreBool.HelpTip ActionStepMethods.StoreHandle.DisplayName ActionStepMethods.StoreHandle.HelpTip ActionStepMethods.StoreNumber.DisplayName ActionStepMethods.StoreNumber.HelpTip ActionStepMethods.StoreObject.DisplayName ActionStepMethods.StoreObject.HelpTip ActionStepMethods.StorePoint.DisplayName ActionStepMethods.StorePoint.HelpTip ActionStepMethods.StoreRectangle.DisplayName ActionStepMethods.StoreRectangle.HelpTip ActionStepMethods.StoreString.DisplayName ActionStepMethods.StoreString.HelpTip ActionStepMethods.Subtract.DisplayName ActionStepMethods.Subtract.HelpTip ActionStepMethods.ToggleCommunicationsMute.DisplayName ActionStepMethods.ToggleCommunicationsMute.HelpTip ActionStepMethods.TogglePlaybackMute.DisplayName ActionStepMethods.TogglePlaybackMute.HelpTip ActionStepMethods.ToggleTrayIcon.DisplayName ActionStepMethods.ToggleTrayIcon.HelpTip ActionStepMethods.CloseCustomFloater.DisplayName ActionStepMethods.CloseCustomFloater.HelpTip ActionStepMethods.HideFloaters.DisplayName ActionStepMethods.HideFloaters.HelpTip ActionStepMethods.IsCustomFloaterLoaded.DisplayName ActionStepMethods.IsCustomFloaterLoaded.HelpTip ActionStepMethods.IsMainFloaterShown.DisplayName ActionStepMethods.IsMainFloaterShown.HelpTip ActionStepMethods.LoadCustomFloater.DisplayName ActionStepMethods.LoadCustomFloater.HelpTip ActionStepMethods.LoadFloaterLayout.DisplayName ActionStepMethods.LoadFloaterLayout.HelpTip ActionStepMethods.SetCustomFloaterLocation.DisplayName ActionStepMethods.SetCustomFloaterLocation.HelpTip ActionStepMethods.SetMainFloaterLocation.DisplayName ActionStepMethods.SetMainFloaterLocation.HelpTip ActionStepMethods.ShowMainFloater.DisplayName ActionStepMethods.ShowMainFloater.HelpTip ActionStepMethods.ResetFloaters.DisplayName ActionStepMethods.ResetFloaters.HelpTip ActionStepMethods.ToggleFloaters.DisplayName ActionStepMethods.ToggleFloaters.HelpTip ActionStepMethods.ToggleSecondaryFloaters.DisplayName ActionStepMethods.ToggleSecondaryFloaters.HelpTip ActionStepMethods.GetWindowFromClassOrTitle.DisplayName ActionStepMethods.GetWindowFromClassOrTitle.HelpTip ActionStepMethods.GetWindowFromHandle.DisplayName ActionStepMethods.GetWindowFromHandle.HelpTip ActionStepMethods.GetWindowsFromTitlePartial.DisplayName ActionStepMethods.GetWindowsFromTitlePartial.HelpTip ActionStepMethods.GetWindowsFromTitleRegex.DisplayName ActionStepMethods.GetWindowsFromTitleRegex.HelpTip ActionStepMethods.RecordTemporaryMacro.DisplayName ActionStepMethods.RecordTemporaryMacro.HelpTip ActionStepMethods.PlayTemporaryMacro.DisplayName ActionStepMethods.PlayTemporaryMacro.HelpTip ActionStepMethods.PlaySavedMacro.DisplayName ActionStepMethods.PlaySavedMacro.HelpTip ActionStepMethodCategories.Macros.DisplayName --------------------------------------------------------------------------------------------------- 0.3.6.4 - 11/29/2019 --------------------------------------------------------------------------------------------------- - Added the ability to save floater layouts. These are managed via right-clicking any floater and accessing the Layouts menu - Added sp.TouchFloaterLoadLayout('LayoutName') to load saved floater layouts via script. Note that you can check the currently selected layout in script by reading the property (string) sp_config.SelectedFloaterLayout - Added language entries: NewEllipses FloaterLayoutsMenu FloaterToggleSecondaryMenu FloaterLayoutsNewTitle FloaterLayoutsNewMessage FloaterLayoutsRenameTitle FloaterLayoutsRenameMessage ItemAlreadyExistsTitle ItemAlreadyExistsMessage ScriptHelp.ActionMethod.TouchFloaterLoadLayout.Name ScriptHelp.ActionMethod.TouchFloaterLoadLayout.Description ScriptHelp.ActionMethod.TouchFloaterLoadLayout.Returns ScriptHelp.ActionMethod.TouchFloaterLoadLayout.Example.Simple ScriptHelp.ActionMethod.TouchFloaterLoadLayout.Parameters.name.Name ScriptHelp.ActionMethod.TouchFloaterLoadLayout.Parameters.name.Description ScriptHelp.ActionMethod.TouchFloaterLoadLayout.Parameters.name.Type --------------------------------------------------------------------------------------------------- 0.3.6.3 - 11/28/2019 --------------------------------------------------------------------------------------------------- - Added option for Unregistered hot keys to consume the final (non-modifier) key down and up - Added language entry: HotkeyConsumeLabel --------------------------------------------------------------------------------------------------- 0.3.6.2 - 11/27/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with Unregistered hot keys not working for Win and Shift modifiers (copy/paste fail) --------------------------------------------------------------------------------------------------- 0.3.6.1 - 11/26/2019 --------------------------------------------------------------------------------------------------- - Added a set of tray icons for additional instances, looks kind of like a 2, but is really just a sort of backward S because I'm not a designer and it was easy. These tray icons are used when StrokesPlus.net is started with the allowmultipleinstances argument. There's no 3 icon set, but I can't imagine a reason to run three instances of StrokesPlus.net --------------------------------------------------------------------------------------------------- 0.3.6.0 - 11/26/2019 --------------------------------------------------------------------------------------------------- - Added Disable Capture on Full Screen Windows option to prevent capture of primary or secondary stroke button in full screen windows. - Note that if you're looking for maximum performance (e.g. games), you should define an ignored app which disables StrokesPlus.net if the window becomes active. You can pair this with the option Enable on No Ignore App Match, which will re-enable StrokesPlus.net if the active window is not an ignored application - Brought previously hidden option to Disable High Resolution Sleep into Options. This tells StrokesPlus.net to use the standard Thread.Sleep call instead of a high resolution (accurate) timer. High resolution requires much more CPU usage during Sleep calls, but is extremely accurate. Standard Thread.Sleep calls uses CPU slices and is not predictable or accurate, but is often good enough for simple delays. However, for macro replaying, the aggregate effect of the standard Thread.Sleep call not being high resolution can result in noticeably slower overall replay of events when many very short duration Sleep calls are made - Removed initial Thread.Sleep(0) call in the high resolution sleep mode logic - Added option in Ignore List items to only ignore if the matched window is full screen - Added option for Application definition criteria to include a check for full screen. Meaning the application will not be matched if the matched application's window is full screen. This does not interrupt StrokesPlus.net from continue to capture and check for Global Action matches. Use the matching option in the Ignore List item definition to create a definition to disable capture only if the app is full screen - Added checks in base app editor (Apps/Ignored) to prevent option item from being active if no fields/settings have any values - Added extra check for custom settingsfile parameter to try looking for just the file name within the same folder StrokesPlus.net is running, so a full path isn't needed - Added ability to manage floater settings while the Settings window is open. This was a very complicated process and I wouldn't be shocked if there are still issues I didn't find - Added these new floater functions: sp.TouchFloaterIsCustomFloaterLoaded sp.TouchFloaterLoadCustomFloater sp.TouchFloaterCloseCustomFloater sp.TouchFloaterSetCustomFloaterLocation sp.TouchFloaterSetLocation - Update import/export code to account for hot key categories - Fix for S+ tray icon when changing display settings - Fixed issue with losing focus while typing when Text Expansions are active and Floaters are shown - Fixed issue with Floaters import - Fixed issue with Text Expansion scripts not saving unless you clicked Apply or OK first - Fixed issue with floater options not being loaded/assigned to the controls in Settings window - Fixed issue with allowing the same floater to be loaded multiple times, this causes state issues and was never the original intent - Added language entries: AppDefinitionIgnoreFullScreen tabPreferencesPreventCaptureOnFullScreenWindows tabPreferencesDisableHighResolutionSleep ScriptHelp.ActionMethod.TouchFloaterIsCustomFloaterLoaded.Name ScriptHelp.ActionMethod.TouchFloaterIsCustomFloaterLoaded.Description ScriptHelp.ActionMethod.TouchFloaterIsCustomFloaterLoaded.Returns ScriptHelp.ActionMethod.TouchFloaterIsCustomFloaterLoaded.Example.Simple ScriptHelp.ActionMethod.TouchFloaterIsCustomFloaterLoaded.Parameters.name.Name ScriptHelp.ActionMethod.TouchFloaterIsCustomFloaterLoaded.Parameters.name.Description ScriptHelp.ActionMethod.TouchFloaterIsCustomFloaterLoaded.Parameters.name.Type ScriptHelp.ActionMethod.TouchFloaterLoadCustomFloater.Name ScriptHelp.ActionMethod.TouchFloaterLoadCustomFloater.Description ScriptHelp.ActionMethod.TouchFloaterLoadCustomFloater.Returns ScriptHelp.ActionMethod.TouchFloaterLoadCustomFloater.Example.Simple ScriptHelp.ActionMethod.TouchFloaterLoadCustomFloater.Parameters.name.Name ScriptHelp.ActionMethod.TouchFloaterLoadCustomFloater.Parameters.name.Description ScriptHelp.ActionMethod.TouchFloaterLoadCustomFloater.Parameters.name.Type ScriptHelp.ActionMethod.TouchFloaterCloseCustomFloater.Name ScriptHelp.ActionMethod.TouchFloaterCloseCustomFloater.Description ScriptHelp.ActionMethod.TouchFloaterCloseCustomFloater.Returns ScriptHelp.ActionMethod.TouchFloaterCloseCustomFloater.Example.Simple ScriptHelp.ActionMethod.TouchFloaterCloseCustomFloater.Parameters.name.Name ScriptHelp.ActionMethod.TouchFloaterCloseCustomFloater.Parameters.name.Description ScriptHelp.ActionMethod.TouchFloaterCloseCustomFloater.Parameters.name.Type ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Name ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Description ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Returns ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Example.Simple ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Parameters.name.Name ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Parameters.name.Description ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Parameters.name.Type ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Parameters.point.Name ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Parameters.point.Description ScriptHelp.ActionMethod.TouchFloaterSetCustomFloaterLocation.Parameters.point.Type ScriptHelp.ActionMethod.TouchFloaterSetLocation.Name ScriptHelp.ActionMethod.TouchFloaterSetLocation.Description ScriptHelp.ActionMethod.TouchFloaterSetLocation.Returns ScriptHelp.ActionMethod.TouchFloaterSetLocation.Example.Simple ScriptHelp.ActionMethod.TouchFloaterSetLocation.Parameters.point.Name ScriptHelp.ActionMethod.TouchFloaterSetLocation.Parameters.point.Description ScriptHelp.ActionMethod.TouchFloaterSetLocation.Parameters.point.Type --------------------------------------------------------------------------------------------------- 0.3.5.9 - 11/21/2019 --------------------------------------------------------------------------------------------------- - Added sp.Run for simpler execution of programs or files, when you don't need to have granular control, e.g. sp.Run("calc"); to open the calculator. Note that paths must have backslashes escaped (add an extra \) like sp.Run("C:\\Temp\\TestFile.txt"); - Added language entries: ScriptHelp.ActionMethod.Run.Name ScriptHelp.ActionMethod.Run.Description ScriptHelp.ActionMethod.Run.Returns ScriptHelp.ActionMethod.Run.Example.Simple ScriptHelp.ActionMethod.Run.Parameters.command.Name --------------------------------------------------------------------------------------------------- 0.3.5.8 - 11/20/2019 --------------------------------------------------------------------------------------------------- - Multiple changes to SystemWindow relating to the handling of size and location. - Generally speaking, most people want to move or size windows based on what they see, not having to account for the invisible borders Windows puts around the window frame. - Updates to SystemWindow.Location to return and assign based on screen coordinates (adjusting for window borders) instead of the workspace coordinates used by .Position (via Get/SetWindowPlacement) - Removed SystemWindow.FrameRectangle, .Rectangle now returns the same value while the new .AbsoluteRectangle property returns the full window's rectangle - SystemWindow.Position remains unchanged - Changed SystemWindow.Size to use the .RECT property instead of .Position, assigning .Size adjusts for window borders (frame), if the window has a frame. Meaning if you size the window to be the full size of the screen, the window's rect will be slightly larger to include frame borders, so the main area of the window will fill the screen as expected - SystemWindow.RECT, .Rectangle, and .RectangleF now return the window rectangle without borders - Added SystemWindow.AbsoluteRectangle which returns the true window's rectangle, without adjusting for window borders - SystemWindow.RECT is now an assignable property - Note that on assignment, the window's frame borders are added to the RECT value passed in, to size/position the window as expected - Updated SystemWindow MoveToNextScreen, MoveToPreviousScreen, MoveToScreen, and EnsureVisible methods to use .RECT instead of .Position, for absolute screen coordinates - Updated SystemWindow.EnsureVisible to use the screen's .WorkingArea rectangle instead of .Bounds - updated SystemWindow.ClipToScreen to also adjust Top and Left instead of only Right and Bottom - Updated Settings window to call .EnsureVisible after the window has been shown - Make sure exclusion zone single toggle button disabled on load if zone inactive - Added language entries: ScriptHelp.SystemWindowProperty.AbsoluteRectangle.Name ScriptHelp.SystemWindowProperty.AbsoluteRectangle.Description ScriptHelp.SystemWindowProperty.AbsoluteRectangle.Type ScriptHelp.SystemWindowProperty.AbsoluteRectangle.Example.Simple - Updated language entries: ScriptHelp.SystemWindowProperty.Position.Description ScriptHelp.SystemWindowProperty.RECT.Description ScriptHelp.SystemWindowProperty.Rectangle.Description ScriptHelp.SystemWindowProperty.Location.Description ScriptHelp.SystemWindowProperty.RectangleF.Description ScriptHelp.SystemWindowProperty.Size.Description - Removed language entries: ScriptHelp.SystemWindowProperty.FrameRectangle.Name ScriptHelp.SystemWindowProperty.FrameRectangle.Description ScriptHelp.SystemWindowProperty.FrameRectangle.Type ScriptHelp.SystemWindowProperty.FrameRectangle.Example.Simple --------------------------------------------------------------------------------------------------- 0.3.5.7 - 11/18/2019 --------------------------------------------------------------------------------------------------- - Fixed rectangle retrieval for non-relative exclusion zones to be the original rectangle --------------------------------------------------------------------------------------------------- 0.3.5.6 - 11/18/2019 --------------------------------------------------------------------------------------------------- - Final updates to exclusion zones, added ability to define fixed border distances in relative mode - Added .FrameRectangle property to SystemWindow, which returns the window rectangle without any window borders - Added function to MouseHookExclusionZone class which returns the adjusted rectangle GetRelativeRectangle(Rectangle originalBoundingRect, Rectangle currentBoundingRect, Rectangle sourceRect) - originalBoundingRect: The rectangle (screen) within which the exclusion zone was originally defined - currentBoundingRect: The rectangle (screen) in which the rectangle is being adjusted - sourceRect: The rectangle (window) being used to adjust the exclusion zone within - Added language entries: ExclusionZoneScale ExclusionZoneFixed ExclusionZoneFixedEdge ScriptHelp.SystemWindowProperty.FrameRectangle.Name ScriptHelp.SystemWindowProperty.FrameRectangle.Description ScriptHelp.SystemWindowProperty.FrameRectangle.Type ScriptHelp.SystemWindowProperty.FrameRectangle.Example.Simple - Removed language entries: ExclusionZoneScaleHeight ExclusionZoneScaleWidth ExclusionZoneScaleTop ExclusionZoneScaleLeft --------------------------------------------------------------------------------------------------- 0.3.5.5 - 11/17/2019 --------------------------------------------------------------------------------------------------- - Added option to have exclusion zones be relative to the window below the mouse. Meaning the rectangle for the exclusion zone will be positioned and scaled (optionally, per axis) to the window's rectangle. - Relative exclusion zones are based on a screen rectangle, for translation to a window rectangle, thus are limited to the bounds of the screen where the zone is being drawn. - If the zone is not marked as relative, it can be any size/position - When creating a relative exclusion zone, imagine the screen is the fully maximized window. When the code is testing the exclusion zone, it will transform the screen-sized exclusion zone rectangle(s) to fit within the bounds of the window's rectangle and adjust the axes accordingly. - The Scale Width and Scale Height options for exclusion zones tells S+.net whether or not to scale those axes when transforming the rectangle. - The Scale Top and Scale Left options for exclusion zones tells S+.net to adjust the position based on the distance from the top/left scaled from the screen's distance along each axis. If unchecked, the rectangle's position always the same distance from the top/left of the window - For example, say you want to exclude a 20px edge on the left side of an application, you want that area to always be exactly 20px regardless of how big or small the window is. So you create a relative exclusion zone, drawing the square to cover from top to bottom of the screen, 20px wide. Then you check Use Relative Position, and uncheck Scale Width. When the code runs, it will set the location of the exclusion zone to the top left corner of the window, scale the height to match the full height of the window, but leave the width alone, so it is only 20px wide. - Or you want an exclusion zone that is always the bottom 1/3 of the window, just create a relative exclusion zone and leave Scale Width and Scael Height checked, so it will adjust automatically to fit the window's area accordingly - The Scale Top and Scale Left options for exclusion zones tells S+.net to adjust the position based on the distance from the top/left scaled from the screen's distane along each axis. If unchecked, the rectangle's position always the same distance from the top/left of the window - Toggle All Exclusion Zones button now only shows when there are exclusion zones defined - Hide exclusion zone area buttons when area is too small for them to fit - Added language entries: ExclusionZoneUseRelativePosition ExclusionZoneScaleTop ExclusionZoneScaleLeft ExclusionZoneScaleHeight ExclusionZoneScaleWidth --------------------------------------------------------------------------------------------------- 0.3.5.4 - 11/15/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with failing to load settings due to null reference - Fixed issue with SystemWindow.EnsureVisible() which shifted the window unexpectedly when the Taskbar is not docked at the bottom of the desktop --------------------------------------------------------------------------------------------------- 0.3.5.3 - 11/15/2019 --------------------------------------------------------------------------------------------------- - Fixed error message in Hot Keys area when no hot keys exist - Added tab in Options to manage mouse hook exclusion zones added in 0.3.5.1 - Added language entries: tabPreferencesTabExclusionZones AddExclusionZone NewExclusionZoneName ShowHideAllExclusionZones ShowHideSingleExclusionZone Width Height ExclusionZoneVerticalWheelEvents ExclusionZoneHorizontalWheelEvents ExclusionZonePrimaryStrokeEvents ExclusionZoneSecondaryStrokeEvents ExclusionZoneHeaderText --------------------------------------------------------------------------------------------------- 0.3.5.2 - 11/15/2019 --------------------------------------------------------------------------------------------------- - Copied Macro settings into the Options area, since they are actually program-wide options. But leaving those settings in the Macros tab as well for convenience - Added categories for hot keys - Added import/export for hot keys - NewApplicationDefaultCategoryName ("General") is the default category for hot keys - Added option to allow mouse wheel window activation within exclusion zones - Added language entries: HotkeyFileFilterName tabPreferencesActivateMouseWheelWindowInExclusionZonesLabel --------------------------------------------------------------------------------------------------- 0.3.5.1 - 11/10/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with Text Expansions not saving Script text when changing between types - Updated Set Volume example script in default install (new user) to reflect the changes made in 0.3.5.0 - Added Ctrl+Shift+Z key combo to perform Redo in script editor, Ctrl+Y still works too - Added exception handling to import/export functions, just displays the error message instead of throwing a full blown exception if an issue is encountered reading/writing files - Added mouse hook exclusion zones. This tells StrokesPlus.net to not interfere with mouse clicks or mouse wheel events if the cursor is within one of the exclusion zones (rectangles). This was added to allow mouse wheel scripts to only execute when the mouse is at the edges of the screen, since scripts can slow down normal scrolling within the main content area. This will now allow the mouse event to pass right through when the mouse is inside the exclusion area, or execute if it is outside of the zone(s). However, this can also be used for primary/secondary stroke button events, based on the properties set on the MouseExclusionZone object. - These zones are stored in a new setting: sp_config.MouseHookExclusionZones (which is a List) - MouseExclusionZone class definition: public Rectangle Rectangle public bool HorizontalMouseWheelScroll public bool VerticalMouseWheelScroll public bool PrimaryStrokeButton public bool SecondaryStrokeButton public bool Active - These zones do not have UI control elements at this time, so you will need to set them manually via script. See this post for additional details and usage examples: https://forum.strokesplus.net/posts/m9817-Mouse-Hook-Exclusion-Zones - Added language entries: FileAccessErrorTitle FileAccessErrorMessage --------------------------------------------------------------------------------------------------- 0.3.5.0 - 10/20/2019 --------------------------------------------------------------------------------------------------- - BREAKING CHANGES: Upgraded AudioSwitcher library to v4. Scripts using the playback/communications mixer objects may not function properly due to changes in the component. For example, the code mixer.Volume = 50; will report the property is inaccesible due to it now being a read-only property. To set the volume, you have to call a new method: mixer.SetVolumeAsync(50); instead - Changes to the way the audio mixer code works, as the instantiation of the objects within the context of a script thread caused StrokesPlus.net to crash unexpectedly when GC came along to finalize the audio device. The code now posts a message to the UI thread to instantiate the object. This may or may not be necessary after the upgrade, but I'm leaving it anyway as it seems like a better way of handling these audio sessions/objects - Fixed sp.GetCommunicationsMixer() to return the comm playback mixer instead of the communications capture mixer - Added sp.GetCaptureMixer() which returns the default capture (record/input) mixer - Added sp.GetCommunicationsCaptureMixer() which returns the default communications capture (record/input) mixer - Added language entries: ScriptHelp.ActionMethod.GetCaptureMixer.Name ScriptHelp.ActionMethod.GetCaptureMixer.Description ScriptHelp.ActionMethod.GetCaptureMixer.Returns ScriptHelp.ActionMethod.GetCaptureMixer.Example.Simple ScriptHelp.ActionMethod.GetCommunicationsCaptureMixer.Name ScriptHelp.ActionMethod.GetCommunicationsCaptureMixer.Description ScriptHelp.ActionMethod.GetCommunicationsCaptureMixer.Returns ScriptHelp.ActionMethod.GetCommunicationsCaptureMixer.Example.Simple --------------------------------------------------------------------------------------------------- 0.3.4.9 - 10/17/2019 --------------------------------------------------------------------------------------------------- - Added .OrderByMultiple to IEnumerable objects in scripts. Usage is a string with the property name and sort order (0 = ascending, 1 = descending). For example, this would sort a list of objects with properties of Category and Description by Category ascending, then by Description descending: .OrderByMultiple("Category|0,Description|1") - Added .Distinct to IEnumerable objects in scripts. Usage is a string with the property name which returns a List of the specified property. For example, this would return a list of only distinct Category names (e.g. List): .Distinct("Category") --------------------------------------------------------------------------------------------------- 0.3.4.8 - 10/14/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with script insert hotkey pressing RCtrl+RShift+Right leading to invalid Control vk string insertion - Updated preferences to check for Windows 10 inactive window mouse scrolling. If setting is enabled in Windows, the Relay Mouse Wheel Events setting and option are disabled in StrokesPlus.net. NOTE: This setting is intended for older versions of Windows, the mouse relay does not currently function for UWP apps in Windows 10, it might not work for Windows 8 Metro apps either - Moved logic for Activate Window Under Mouse Wheel into the main hook instead of only being executed if certain other mouse wheel options were also enabled --------------------------------------------------------------------------------------------------- 0.3.4.7 - 10/2/2019 --------------------------------------------------------------------------------------------------- - Updated DisplayChanged event to walk through many of the startup/reload calls to resolve issue with the event resulting in keyboard input issues after a display change --------------------------------------------------------------------------------------------------- 0.3.4.6 - 10/2/2019 --------------------------------------------------------------------------------------------------- - Add mouse event and load/unload base action initialization if null during InitializeNewerSettings - Fixed issue on Exporting settings under certain conditions which resulted in unintentionally wiping out certain events' actions - Fixed issue with not honoring the export of the Right Click actions --------------------------------------------------------------------------------------------------- 0.3.4.5 - 9/27/2019 --------------------------------------------------------------------------------------------------- - Converted ShowPopupMenu and ShowPopupMenuEx to use .NET ContextMenu and MenuItems to resolve menu text display issues for international users --------------------------------------------------------------------------------------------------- 0.3.4.4 - 9/25/2019 --------------------------------------------------------------------------------------------------- - Changed SystemWindow.PostMessageObj and .SendMessageObj wParam & lParam to be cast to uint - Fixed issue with display change events causing more than one keyboard hook being installed --------------------------------------------------------------------------------------------------- 0.3.4.3 - 9/19/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with keyboard input not working in Microsoft Edge when a text expansion is active --------------------------------------------------------------------------------------------------- 0.3.4.2 - 9/10/2019 --------------------------------------------------------------------------------------------------- - Removed Use Script Engine Pool option as it leads to poor user experience with timer scripts I added a hidden option sp_config.CreateNewScriptEngineEachExecution which can be used to enable this option, but it is not recommended. All users have had script engine pools enabled with this release, the old setting is obsolete and no longer referenced, but remains in the settings object for config file compatibility reasons - Script engine pool size is now a minimum of 2 (max is still 20) - Script engine lock attempts minimum increased to 50, each attempt waits only 2 milliseconds, so the minimum wait time of 100 milliseconds is a reasonable amount of total time before showing the no script engines available message - Added simple numeric checks on keypress for appropriate Options > Advanced text boxes - Added try/catch in GetAvailableEngine to prevent crash if not dismissing the no script engines available message --------------------------------------------------------------------------------------------------- 0.3.4.1 - 9/8/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with drawing in negative top coordinate of virtual desktop - Add a timer to occassionally ping the gesture draw surface (if Draw Gesture is enabled) which quickly activates and deactivates the gesture drawing surface window, to prevent delays when the PC has been idle for some time. This only executes if S+ is not currently disabled, draw gesture is enabled, and more than 20 minutes have passed since the last input (obtained from Windows, didn't add code to watch input). Basically you'll never see or notice this happening, but it should hopefully prevent that gesture drawing delay when you draw a gesture and the computer was idle for a while. Worst case scenario, it won't have an effect but also won't cause any problems. - Added some additional checks to detect and correct if gesture drawing surface window is activated - Enabled auto scroll for script help heading grid - Deactivate gesture draw window in mouse hook click if surface is foreground - Added lock in mouse click function and locks per button within thread function to ensure resulting threads are executed in sequence. For example, make sure the down even script is executed prior to the up event script - Added sleep calls within the sp.RelayGesture function that I commented out for some reason. This should result in more successful replaying of events --------------------------------------------------------------------------------------------------- 0.3.4.0 - 8/31/2019 --------------------------------------------------------------------------------------------------- - Moved mouse hook to separate window/thread to improve mouse responsiveness and reduce contention - Moved gesture drawing out of mouse hook code, now rendered by the UI thread via messaging - Deprecated sp_config.UseAlternativeDrawingMethod, it is now the only drawing method and this setting no longer has any effect - Made a few mouse hook and application matching code optimizations - Updated trace builds to not prefer 32-bit (matches non-trace builds, to prevent bitness issues) - Replaced call to process max working set with a simple GC collect to avoid possible VMM issues - Added announcement popup. Checks for important announcements if Update Check is active, but also supports displaying a one-time message compiled into the code. This will only be used when there's something important I need to communicate to users, like an issue with the latest release suggesting they install the previous version, or when a breaking change is introduced. This checks the server before calling the update check, once you've seen an announcement you won't see it again, unless your settings are reverted. Only 1 announcement can exist at any time and it has a version which I will increment. In your settings S+ saves that number and only shows the message if your settings version is lower than the current one. --------------------------------------------------------------------------------------------------- 0.3.3.9 - 8/25/2019 --------------------------------------------------------------------------------------------------- - Added missing X1/X2 modifiers to trace build logging - Added some extra checks and try/catch in cancel timer functions - Added sp.TraceLogEntry("something here") to manually insert a trace line. Only works with trace build: https://forum.strokesplus.net/posts/t3012-Tracing-Logging-Builds-for-Troubleshooting --------------------------------------------------------------------------------------------------- 0.3.3.8 - 8/23/2019 --------------------------------------------------------------------------------------------------- - Added missing .Trim() call on gesture name in gesture training window to match other logic and prevent possibility of creating duplicate gesture names which cannot be managed - Updated popup menu code to destroy menu handles when menu is removed - Added sp.ShowPopupMenuEx() which supports more complex menu structures and eliminates the need for a callback function. See Script Help for an example. - Added language entries: ScriptHelp.ActionMethod.ShowPopupMenuEx.Name ScriptHelp.ActionMethod.ShowPopupMenuEx.Description ScriptHelp.ActionMethod.ShowPopupMenuEx.Returns ScriptHelp.ActionMethod.ShowPopupMenuEx.Example.Simple ScriptHelp.ActionMethod.ShowPopupMenuEx.Parameters.info.Name ScriptHelp.ActionMethod.ShowPopupMenuEx.Parameters.info.Description ScriptHelp.ActionMethod.ShowPopupMenuEx.Parameters.info.Type ScriptHelpClassPopupMenuInfoEx ScriptHelpScriptObjectsPopupMenuInfoExText ScriptHelpClassPopupMenuItem ScriptHelpScriptObjectsPopupMenuItemText --------------------------------------------------------------------------------------------------- 0.3.3.7 - 8/22/2019 --------------------------------------------------------------------------------------------------- - Added extra trace logging in mouse hook and hook state, move exit mouse move inside if block - Added locks around error count assignments to prevent runaway error messages in timer scripts - Updated error count check to delete all timers when threshold exceeded and message is shown - Fixed issue with DeleteAllTimers never resetting the StoppingTimers flag when complete, which prevented new timer scripts from executing until reload --------------------------------------------------------------------------------------------------- 0.3.3.6 - 8/21/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with Activate Window Under Mouse Wheel to use correct coordinates - Updated Activate Window Under Mouse Wheel to only activate if root owner window is not the same as the root owner window below the mouse cursor AND if the root owner is not the Desktop (to partially fix issues with list dropdowns) - Note that this still doesn't handle every situation seamlessly...still trying to see if there's a way to make it do so - This release also includes some changes to account token storage and adds dependencies to WPF. There's nothing visibly different, but just to mention it in case anyone experiences any oddities --------------------------------------------------------------------------------------------------- 0.3.3.5 - 8/20/2019 --------------------------------------------------------------------------------------------------- - Changed SystemWindow ForegroundWindow setter to use the handle supplied, not the parent window - Changed code for Always Activate Window Where Gesture Began to activate the first moveable parent window starting from the control. I think this is more inline with what most people expect, this should address things like having a Find window open and losing the focus of the Find window to the main window. However, I'm not sure if this will always behave properly for unconventional applications. I've included a hidden setting to use the previous method if needed: sp_config.ActivateWindowUseRootParent = true; - Added .FirstMoveableParent to SystemWindow class which is a SystemWindow for the first parent window which is moveable (has the WS_SYSMENU style). This should generally be the main window in which a control exists. If the SystemWindow itself is moveable, it returns itself. If no window was found, returns null - Added language entries: ScriptHelp.SystemWindowProperty.FirstMoveableParent.Name ScriptHelp.SystemWindowProperty.FirstMoveableParent.Description ScriptHelp.SystemWindowProperty.FirstMoveableParent.Returns ScriptHelp.SystemWindowProperty.FirstMoveableParent.Example.Simple --------------------------------------------------------------------------------------------------- 0.3.3.4 - 8/19/2019 --------------------------------------------------------------------------------------------------- - Remove SystemWindow's ApiHelper.FailIfZero from ClassName property, checking return directly --------------------------------------------------------------------------------------------------- 0.3.3.3 - 8/14/2019 --------------------------------------------------------------------------------------------------- - Added checkboxes to mouse click script panels to control whether or not the mouse event should be consumed (not received by other applications) when executing the script - Added .ClientRectangle property (read only) to SystemWindow class which returns a Rectangle with the client coordinates. Note that the top left of client coordinates always begin at 0,0. Also ClientRectangle size is exclusive, meaning the right and bottom values are always just outside of the actual client area e.g. action.Window.ClientRectangle sp.ForegroundWindow().ClientRectangle - Added .ScreenPointToClientPoint(point) to SystemWindow class which translates a screen point to a client point relative to the upper-left corner of the window's client area - Added .ClientPointToScreenPoint(point) to SystemWindow class which translates a client point to a screen point relative to the upper-left corner of the screen - Added language entries: ConsumeClick ScriptHelp.SystemWindowProperty.ClientRectangle.Name ScriptHelp.SystemWindowProperty.ClientRectangle.Description ScriptHelp.SystemWindowProperty.ClientRectangle.Type ScriptHelp.SystemWindowProperty.ClientRectangle.Example.Simple ScriptHelp.SystemWindowMethod.ClientPointToScreenPoint.Name ScriptHelp.SystemWindowMethod.ClientPointToScreenPoint.Description ScriptHelp.SystemWindowMethod.ClientPointToScreenPoint.Returns ScriptHelp.SystemWindowMethod.ClientPointToScreenPoint.Example.Simple ScriptHelp.SystemWindowMethod.ClientPointToScreenPoint.Parameters.clientPoint.Name ScriptHelp.SystemWindowMethod.ClientPointToScreenPoint.Parameters.clientPoint.Description ScriptHelp.SystemWindowMethod.ClientPointToScreenPoint.Parameters.clientPoint.Type ScriptHelp.SystemWindowMethod.ScreenPointToClientPoint.Name ScriptHelp.SystemWindowMethod.ScreenPointToClientPoint.Description ScriptHelp.SystemWindowMethod.ScreenPointToClientPoint.Returns ScriptHelp.SystemWindowMethod.ScreenPointToClientPoint.Example.Simple ScriptHelp.SystemWindowMethod.ScreenPointToClientPoint.Parameters.screenPoint.Name ScriptHelp.SystemWindowMethod.ScreenPointToClientPoint.Parameters.screenPoint.Description ScriptHelp.SystemWindowMethod.ScreenPointToClientPoint.Parameters.screenPoint.Type --------------------------------------------------------------------------------------------------- 0.3.3.2 - 8/5/2019 --------------------------------------------------------------------------------------------------- - Fixed crash on text expansion when no replacement value was entered in Settings for the entry --------------------------------------------------------------------------------------------------- 0.3.3.1 - 8/3/2019 --------------------------------------------------------------------------------------------------- - Updated SystemWindow.Rectangle property to get and set (was read only property) --------------------------------------------------------------------------------------------------- 0.3.3.0 - 8/2/2019 --------------------------------------------------------------------------------------------------- - Updated text expansion to allow OEM keys and numpad operators to be part of the token. These are keys like: comma, ü, -, /, +, *, backticks, etc. - Updated text expansion code to not treat the above characters as a space (reset token check) - Changed default text expansion method to Text instead of Text via Clipboard - Added Win key as an ignore key option - Experimental Feature: Added ability to define a hotkey as Unregistered, which means it is not registered as a global hotkey with Windows. StrokesPlus.net monitors keys/modifiers and executes script if the key or combination is pressed. Note that this does not absorb any keystrokes, so if made an Unregistered hotkey that was just the letter "g" and in your script you have it send the "h" key, what you would see while typing the letter "g" in Notepad would be "gh". Trying to keep track of the keys/modifiers and conditionally absorb is very intensive/complicated and could result in noticeable delays while typing. - Note that while I've tried my best to minimize the processing of monitoring keystrokes, having a lot of Unregistered hotkeys might start to cause a small noticeable delay while typing, on slower PCs. Having no Unregistered hotkeys does not result in any keyboard typing performance impact. I could be overstating this concern, but since it's something which happens each keystroke, it makes me apprehensive. - Added language entries: tabPreferencesIgnoreKeyWin HotkeyNotGlobalLabel --------------------------------------------------------------------------------------------------- 0.3.2.9 - 7/24/2019 --------------------------------------------------------------------------------------------------- - Ctrl+H (and Ctrl+F in last release) will focus the Replace (or Find) window if already open - Updated Release script to pass in a Click() object, which you can test against which button was released (primary, secondary, or touch). If the release script was fired from a touch floater, the click.Button will equal MouseButtons.None. The Window/Control properties are based on the window/control below the current mouse position. FWKeys is not set. Point is set to the current mouse position. Down will always be false. - Added missing call to release script in touch floater code --------------------------------------------------------------------------------------------------- 0.3.2.8 - 7/23/2019 --------------------------------------------------------------------------------------------------- - Added manual Win Event Hook call on activation of Settings window to ensure proper re-enabling of S+.net if coming from an ignore/disable window - Updated script engine to prevent endless script errors, for example a timer with a script error will continually show error messages for each execution until S+.net is stopped or the timer is deleted. Now if more than 5 script errors happen in a row within 10 seconds, you will receive a popup message and scripts are disabled until reloading from the tray icon or clicking Apply/OK in the Settings window - Fixed issue with stroke line opacity not being updated until reload/restart - Fixed issue with new action and immediately clicking the gesture picker while tree node still in label edit mode - Added language entries: ClearScriptTooManyErrorsTitle ClearScriptTooManyErrorsMessage --------------------------------------------------------------------------------------------------- 0.3.2.7 - 7/18/2019 --------------------------------------------------------------------------------------------------- - Added sp.CloseSettings(true/false) to close the Settings window if open, passing in whether to save or discard any changes - Added language entries: ScriptHelp.ActionMethod.CloseSettings.Name ScriptHelp.ActionMethod.CloseSettings.Description ScriptHelp.ActionMethod.CloseSettings.Returns ScriptHelp.ActionMethod.CloseSettings.Example.Simple ScriptHelp.ActionMethod.CloseSettings.Parameters.save.Name ScriptHelp.ActionMethod.CloseSettings.Parameters.save.Description ScriptHelp.ActionMethod.CloseSettings.Parameters.save.Type --------------------------------------------------------------------------------------------------- 0.3.2.6 - 7/11/2019 --------------------------------------------------------------------------------------------------- - Added parameter to DoesLibraryExist to suppress error messages for certain types of calls. This will stop showing an incorrect VC 2015 runtime missing error message for users running earlier than Windows 8.1 that started showing in version 0.3.2.4 --------------------------------------------------------------------------------------------------- 0.3.2.5 - 7/10/2019 --------------------------------------------------------------------------------------------------- - Added sp.GetSelectedFilesOnDesktop() which returns a string array containing the items currently selected in the Desktop list view. This may not work properly on all systems, I have only tested on my machine. It's just sending messages to the list view to get the items, checking their selected state, and getting the items text. This isn't a shell/COM based method like sp.GetSelectedFilesInExplorer; I tried to do that but was not successful! - Added language entries: ScriptHelp.ActionMethod.GetSelectedFilesOnDesktop.Name ScriptHelp.ActionMethod.GetSelectedFilesOnDesktop.Description ScriptHelp.ActionMethod.GetSelectedFilesOnDesktop.Returns ScriptHelp.ActionMethod.GetSelectedFilesOnDesktop.Example.Simple ScriptHelp.ActionMethod.GetSelectedFilesOnDesktop.Example.Full --------------------------------------------------------------------------------------------------- 0.3.2.4 - 7/1/2019 --------------------------------------------------------------------------------------------------- - Added error details on LoadLibrary calls for MSVCP140.DLL and VCRUNTIME140.dll - Added a try/catch around ActionMatched code to eliminate race condition crash with rockers --------------------------------------------------------------------------------------------------- 0.3.2.3 - 7/1/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with crashing on loading settings due to missed null check in previous release --------------------------------------------------------------------------------------------------- 0.3.2.2 - 6/30/2019 --------------------------------------------------------------------------------------------------- - Fixed Release script, was only executing after being in wheel or rocker mode - Fixed issue with not allowing the secondary stroke button to be a modifier as long as the capture dropdown is set to After --------------------------------------------------------------------------------------------------- 0.3.2.1 - 6/30/2019 --------------------------------------------------------------------------------------------------- - Changed timer execution to invoke on UI thread to ensure consistent behavior/COM access (clipboard) - Changed file writing to first write to temp file, then move to destination, to hopefully avoid issues with possible file loss or truncation due to I/O problem --------------------------------------------------------------------------------------------------- 0.3.2.0 - 6/29/2019 --------------------------------------------------------------------------------------------------- - Updated sync settings datetime passed to web server as culture invariant to hopefully correct issue with Chinese dates - Updates to read/write settings to show load exceptions instead of Password window, added file stream flush and close to maybe resolve odd issue with settings file getting truncated --------------------------------------------------------------------------------------------------- 0.3.1.9 - 6/29/2019 --------------------------------------------------------------------------------------------------- - Added some lines in the account section to copy failure responses/exceptions to the clipboard - Corrected lock reference in cancelCallbackTimer --------------------------------------------------------------------------------------------------- 0.3.1.8 - 6/26/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with text expansion via Text mode not sending proper/consistent newline sequences --------------------------------------------------------------------------------------------------- 0.3.1.7 - 6/25/2019 --------------------------------------------------------------------------------------------------- - Reverted change to sp.LastApplication() made in 0.3.1.6 as tracking windows in this way is not reliable and prone to exceptions as well as changes made regarding how Windows handles this. It is recommended you use Alt+Tab for a reliable way to switch between the current window and the previous application: sp.SendModifiedVKeys([vk.LMENU], [vk.TAB]); - Fixed a typo in the help for NextApplication, added some extra verbiage to the help for LastApplication specifying that it doesn't include minimized windows - Changed "failed to register hot key" message to show as a balloon/toast window if the tray icon is visible, otherwise it displays a message box like it always has --------------------------------------------------------------------------------------------------- 0.3.1.6 - 6/23/2019 --------------------------------------------------------------------------------------------------- - Added new catch on script interruption, so there's no error message displayed. If you want to see these error messages, run the following script: sp_config.EnableScriptInterruptedError = true; sp_config.Save(); sp.Reload(); - Altered sp.AllApplications() to not exclude minimized windows - Altered sp.LastApplication() to instead use the previous foreground app instead of the next window in the stack, so if the previous window was minimized it will restore and activate. NOTE: The only way to (easily) accomplish this is to track the foreground window during foreground window change events (which is already happening internally). However, Windows Event hooks of this type skip the caller's process. Meaning, things like the StrokesPlus.net Settings window will NOT be tracked in this. So this will work fine for most situations, but will have unexpected results if the S+.net window was the last foreground app. Since it cannot track that, it will switch to the window which was active BEFORE you activated the S+.net window. Overall, this change results in the most generally expected behavior, so it makes sense to update it with the caveat that the S+.net window(s) are excluded. - You can pass the useWindowStack parameter as true to use the previous logic method: sp.LastApplication(true) --------------------------------------------------------------------------------------------------- 0.3.1.5 - 6/18/2019 --------------------------------------------------------------------------------------------------- - Fixed sp.Enable(), it wasn't running in the UI thread, so it failed to install hooks/hotkeys - Fixed tray icon for sp.DisableNext() - Updated sp.Enable(), sp.Disable(), sp.EnableCapture(), and sp.DisableCapture() to set the tray icon accordingly --------------------------------------------------------------------------------------------------- 0.3.1.4 - 6/17/2019 --------------------------------------------------------------------------------------------------- - Updated WM_COPYDATA to support ANSI scripts, for the WParam parameter: 0 = Unicode, 1 = ANSI --------------------------------------------------------------------------------------------------- 0.3.1.3 - 6/17/2019 --------------------------------------------------------------------------------------------------- - Added support for script execution via sending WM_COPYDATA message to S+.net which will execute the script string passed in - COPYDATASTRUCT.dwData should be set to 100 (hex 0x64) to signal that the lpData contains a script - COPYDATASTRUCT.lpData string property (the script) is assumed to be Unicode (LPWStr) not ANSI - COPYDATASTRUCT.cbData is the length of the script string, + 1 (null terminated string) - NOTE: Since StrokesPlus.net often runs with elevated privileges, a process which is NOT elevated CANNOT send messages to elevated processes! - See https://forum.strokesplus.net/posts/m6271-Using-Windows-Messages-to-Execute-Scripts for example C# code to send the message --------------------------------------------------------------------------------------------------- 0.3.1.2 - 6/16/2019 --------------------------------------------------------------------------------------------------- - Removed checking WS_EX_NOREDIRECTIONBITMAP in RelayMouseWheel to allow wheel scripts in Windows Store Apps (Metro/UWP). This logic was in the original StrokesPlus code and carried over, though I do not recall the reason it was there, so let me know if you experience any oddities --------------------------------------------------------------------------------------------------- 0.3.1.1 - 6/11/2019 --------------------------------------------------------------------------------------------------- - Added sp.Pause(seconds) to sleep the script execution for the amount of seconds specified. See below for the reason this new function exists - Changed sp.Sleep to use QueryPerformanceTimer API instead of Thread.Sleep for more accurate delays Thread.Sleep uses the Sleep WinAPI function is doesn't guarantee the timing as it's based on CPU ticks and time slices, so delays less than or between clock ticks have a duration which is not exactly accurate. - Normally this isn't noticeable, but if you have a long macro script which replays a lot of mouse and keyboard events, the number of sp.Sleep calls cause the inflated delay to be significant. Also, if you're trying to time some delays precisely, you would have inconsistent results that you are unable to see. - NOTE: Since this is a high resolution timer, it uses much more CPU power during delays, as it is no longer giving up thread slices; it's running in a tight loop calling QueryPerformanceTimer until the specified time has passed. It is recommended that sp.Sleep only be used for short pauses, long delays will spin the CPU, as well as use more battery power if you're on a laptop, until the specified duration is reached. - For longer delays more than a couple seconds, and you are concerned with CPU utilization or battery life, you should use a timer function (See Script Help > Timers) or the new sp.Pause method - I didn't want to rename the sp.Sleep function which would cause many scripts to break, but I also didn't want to add a new high resolution function as the main benfactor are macro scripts, for which people may already have and not want to recreate them all - Added hidden setting sp_config.DisableHighResolutionSleep (bool) to disable this and use the old Thread.Sleep method instead. Use this script to change this setting and reload: sp_config.DisableHighResolutionSleep = true; sp_config.Save(); - Added some validation checks when showing sync settings or uploading new settings to ensure your login is still valid - Basically I had something weird happen on one of my machines that I don't use often when I opened the Sync Settings screen (error). I clicked Logout then logged back in and everything worked. Still not sure what the actual problem was, but I feel it's better to validate the account at certain times and trigger a login if it fails. I'll keep investigating the source of the issue, but this is a better UX than an ambiguous JSON parse error message - Added language entries: ScriptHelp.ActionMethod.Pause.Name ScriptHelp.ActionMethod.Pause.Description ScriptHelp.ActionMethod.Pause.Returns ScriptHelp.ActionMethod.Pause.Example.Simple ScriptHelp.ActionMethod.Pause.Parameters.seconds.Name ScriptHelp.ActionMethod.Pause.Parameters.seconds.Description ScriptHelp.ActionMethod.Pause.Parameters.seconds.Type - Updated text for: ScriptHelp.ActionMethod.Sleep.Description --------------------------------------------------------------------------------------------------- 0.3.1.0 - 6/10/2019 --------------------------------------------------------------------------------------------------- - Added missing filter (*.dll) to Add Plug-In open file browser - Fixed issue with open paren being consumed during auto complete fill up if method has parameters --------------------------------------------------------------------------------------------------- 0.3.0.9 - 6/7/2019 --------------------------------------------------------------------------------------------------- - Some updates to behind the scenes stuff relating to Plug-Ins section, improved UX - Fixed regression issue with showing same plug-in load failure message for each engine and attempt - Fixed Exclude Plug-In button/menu when in Failed To Load tab - Fixed issue with having no selected plug-in folder (and only default folder exists) and clicking Add Plug-In, wasn't opening browse dialog - Added console as base keyword for syntax coloring --------------------------------------------------------------------------------------------------- 0.3.0.8 - 6/6/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with losing mouse capture while using the App Definition drag operation - Fixed issue with script engines being added to pool on init even though Use Script Engine Pool is unchecked - Changed loading of Plug-Ins to binary instead of referencing the file, this allows deleting, etc. since they aren't in use - Added Plug-Ins section to Settings screen to manage search locations, excluding, etc. - Added language entries: PlugInTabLocations PlugInTabLoaded PlugInTabExcluded PlugInTabFailed PlugInFooterText PlugInAddLocation PlugInRemoveLocation PlugInAddPlugIn PlugInRemovePlugIn PlugInIncludePlugIn PlugInExcludePlugIn PlugInAddFailedMessage PlugInAddFailedTitle PlugInDeleteFailedMessage PlugInDeleteFailedTitle --------------------------------------------------------------------------------------------------- 0.3.0.7 - 6/5/2019 --------------------------------------------------------------------------------------------------- - Tweaks to better handle open parens during auto completion - Fixed issue with initial form settings for floaters being saved to floater during load. For example, the Shown checkbox is unchecked when the form first loads, when the floater was being loaded it was saving Shown = false to the floater during load even though the floater's shown setting was true - Updated floaters/settings interop. The settings object is volatile when the Settings window is open. The settings being referenced within the floaters are separate from the temporary settings created when the Settings window is open. So if you changed a floater (directly via the floater), and clicked Apply in the Settings window, the floater's config would be put back to what it was at the time the Settings window was opened; it's confusing, I know. To reduce confusion, I've removed the right-click menu and ability to move floaters while the Settings window is open. - Updated tray menu to allow toggling the floaters while the Settings window is open - Added toggle floater button to Settings window while in the Floaters section (lower left) - Changed TrayMenuToggleFloater from "Toggle Floater" to "Toggle Floaters" as it seems to make more sense - These floater changes are more of a temporary solution. Long term, the settings should reference the values in the Settings window if open, but it's pretty complicated to keep all of that in sync, as there are many potential collisions, etc. Each floater is its own form holding its own settings, and they're referenced everywhere inside each floater; so it's quite a lot to change for little gain. These updates aim to at least have a more consistent experience; where the changes made are properly reflected upon closing the Settings window instead of looking like some were applied and others were reverted (like screen location) --------------------------------------------------------------------------------------------------- 0.3.0.6 - 6/3/2019 --------------------------------------------------------------------------------------------------- - Set max size of sp.DisplayImage form to image dimensions and prevent maximizing as it doesn't make sense to allow it - Removed static methods/properties from SystemWindow in the auto complete list - Fixed issue with text expansion's call to AttachThreadInput causing foreground window change, which could prevent input from being properly processed when floater is active - Updated Chinese (CN) language --------------------------------------------------------------------------------------------------- 0.3.0.5 - 5/27/2019 --------------------------------------------------------------------------------------------------- - Moved loading window to lower right area of screen - Added sp.DisplayImage(image) which displays the passed in image (.NET Image type, not a file path) in a floating window. Click and drag to move, press Escape or double-click to close the popup - Added language entries: ScriptHelp.ActionMethod.DisplayImage.Name ScriptHelp.ActionMethod.DisplayImage.Description ScriptHelp.ActionMethod.DisplayImage.Returns ScriptHelp.ActionMethod.DisplayImage.Parameters.image.Name ScriptHelp.ActionMethod.DisplayImage.Parameters.image.Description ScriptHelp.ActionMethod.DisplayImage.Parameters.image.Type ScriptHelp.ActionMethod.DisplayImage.Parameters.Example.Simple ScriptHelp.ActionMethod.DisplayImage.Parameters.Example.Full --------------------------------------------------------------------------------------------------- 0.3.0.4 - 5/26/2019 --------------------------------------------------------------------------------------------------- - Added new Synchronize Settings feature available from tray icon menu. Note that this option is only visible if you have logged in via the Login tray menu item using your forum credentials. Right now, this simply encrypts and uploads your entire settings which are saved in a database. Every time you take an action which updates your settings, like clicking OK on the Settings window or when you login, they will be saved. Due to the amount of complexities and scenarios, downloading settings is a manual process, meaning your settings won't automatically sync between two computers for example. But you can easily open the Synchronize Settings window and select the configuration to download and apply. The date/time, computer name, IP address, and size of the upload are stored, so you can have different computers with different configurations backed up online. - Note: For now, there's no time restriction on the uploaded backups, but if storage space becomes an issue, I may have to start purging older backups. I'll engage the community before making any decisions to delete backups - Fixed some custom grid column/row setting and presentation oddities - Adjusted some controls' forecolors to use system colors instead of explicit - Added language entries: TrayMenuSyncSettings frmSyncSettingsTitle frmSyncSettingsHeaderText frmSyncSettingsFooterText frmSyncSettingsAvailableText frmSyncSettingsUploadNow frmSyncSettingsListComputerName frmSyncSettingsListIPAddress frmSyncSettingsListTimestamp frmSyncSettingsListSize frmSyncSettingsDownload frmSyncSettingsDate frmSyncSettingsCount Refresh - Changed language entry text: frmAccountLoginHeadingText --------------------------------------------------------------------------------------------------- 0.3.0.3 - 5/17/2019 --------------------------------------------------------------------------------------------------- - Added try/catch around loading System.Speech - if not present on the system, don't load the type --------------------------------------------------------------------------------------------------- 0.3.0.2 - 5/17/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with encryption key sizes - Note that any settings file encrypted with version 0.3.0.1 will not be able to be decrypted by 0.3.0.2 - Make sure you clear your password first before installing 0.3.0.2 --------------------------------------------------------------------------------------------------- 0.3.0.1 - 5/17/2019 --------------------------------------------------------------------------------------------------- - Not triggering auto update for this until some folks and myself have had time to test this out - Added Password protection and encryption of settings file. From the tray menu, select Set Password. This will encrypt your settings file and require a password when you start S+.net or attempt to Open the Settings window. To clear the password and decrypt your settings file, click the tray menu item again, enter your current password and leave the new password fields empty. PLEASE BACKUP YOUR SETTINGS FILE FIRST! I've tried to do my best to ensure everything works properly, but if something goes wrong with this code, it can leave your file encrypted, unusable, and unrecoverable. You have been warned! - Added language entries: frmPasswordTitle frmPasswordSetText Password TrayMenuPassword Confirm frmPasswordConfirmText frmPasswordCurrentPassword frmPasswordNewPassword frmPasswordConfirmNewPassword --------------------------------------------------------------------------------------------------- 0.3.0.0 - 5/16/2019 --------------------------------------------------------------------------------------------------- - StrokesPlus.net and installer now signed by official Certificate Authority - Fixed a couple typos in English script help - Fixed autocomplete issue with entering a dot after certain autocomplete entries - Added autocomplete list for sp.ForegroundWindow(). - Made a couple other small tweaks to autocomplete (don't get excited, very minimal) - Added a try/catch around interrupting the script engines when a different exception was encountered during a script. This was found when calling sp.RunProgram and passing true for the waitForExit parameter without having a variable to receive the return value from sp.RunProgram. The engine was already disposed after the expected exception, however in the exception blocks I was also calling to interrupt (stop) the script engine, since the engine was disposed it resulted in StrokesPlus.net crashing due to the unhandled exception. - Updated application matching code to remove control characters before comparing strings or regex values. When matching on titles via regex, hidden left-to-right unicode characters in the string prevented correct matching --------------------------------------------------------------------------------------------------- 0.2.9.9 - 4/24/2019 --------------------------------------------------------------------------------------------------- - Fixed two issues with comment/uncomment not behaving correctly in certain cases - Added logic to call sp.ConsumePhysicalInput(false) on session lock/switch, this is case you get stuck after calling sp.ConsumePhysicalInput(true) without making sure to call it again with false. Just press Ctrl+Alt+Del and lock or switch user and come back in (unlock/sign back in) - Added some missing logic to update some checkboxes' enabled status when changing stroke buttons - Updated German translations --------------------------------------------------------------------------------------------------- 0.2.9.8 - 4/18/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with hot key editor not handling all key events, e.g. pressing Win+Shift+E resulted in the text box reading "EShift+Win+E" and other standard edit control hot keys weren't being suppressed/absorbed/handled. - Added .IsCloaked property to the SystemWindow class which returns true for background Win8/10 apps or windows in a different virtual desktop - Updated sp.AllApplications() to check the new .IsCloaked property during enumeration - Updated CN translations - Added language entries: ScriptHelp.SystemWindowProperty.IsCloaked.Name ScriptHelp.SystemWindowProperty.IsCloaked.Description ScriptHelp.SystemWindowProperty.IsCloaked.Type ScriptHelp.SystemWindowProperty.IsCloaked.Example.Simple --------------------------------------------------------------------------------------------------- 0.2.9.7 - 4/8/2019 --------------------------------------------------------------------------------------------------- - Updated code to hide hint popup on mouse wheel action execution - Added PayPal donate button in About tab because hey, why not? :) - Added comment/uncomment functionality to script editor via toolbar buttons, context menu, or key combo Ctrl+' (Comment) and Ctrl+Shift+' (Uncomment) - Added languages entries: Comment Uncomment --------------------------------------------------------------------------------------------------- 0.2.9.6 - 4/8/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with mouse wheel gestures not working (caused by changes in 0.2.8.4) --------------------------------------------------------------------------------------------------- 0.2.9.5 - 4/4/2019 --------------------------------------------------------------------------------------------------- - Updated to ClearScript 5.5.5 (found memory leak in older version of Chrome V8 engine) - Updated code that lists class methods to exclude those inherited from object - Updated code to unsubscribe from SessionSwitchEventHandler on unload - Updated Chinese (CN) translations --------------------------------------------------------------------------------------------------- 0.2.9.4 - 3/31/2019 --------------------------------------------------------------------------------------------------- - Fixed issue with closing a secondary built-in floater then double-clicking the main floater - Added setting to control whether S+.net forces SPI_SETFOREGROUNDLOCKTIMEOUT value update. This always used to be on, but I've disabled it by default since it can cause some people to encounter unexpected behavior in other applications. Plus, since there is a loading splash screen, I don't think this is necessary due to the call made to AllowSetForegroundWindow on load. If you are having problems with S+.net bringing windows into focus/foreground (like the taskbar button for the window is flashing), enable this setting and restart S+.net. - Added language entry: tabPreferencesSetForegroundLockTimeout --------------------------------------------------------------------------------------------------- 0.2.9.3 - 3/29/2019 --------------------------------------------------------------------------------------------------- - Internal changes to capturing mouse hook data instead of referencing the struct data to separate variables. Another possibly moot change, but trying to eliminate some edge cases. - There is an apparently longer startup loading splash screen time, because the surface needs to be completely loaded before it can process messages. It was always taking that long to fully load, you just didn't see it happening. But without waiting, gestures wouldn't draw right after opening until everything was loaded, if the new hidden setting below is enabled. Honestly, it makes sense to let the whole program load up before accepting input anyway. - Just as a reminder, the main reason for the loading splash screen has to do with ensuring S+.net has the ability to activate other windows without causing the taskbar button for the window to flash instead of being brought to the foreground. It's a long and complicated explanation, but essentially Windows doesn't want hidden programs to pop other windows into focus. There are a variety of things you can do to allow this, and having the application's screen visible to the user on start up and when calling a function to allow set foreground window calls is one of them. - Added a hidden setting sp.UseAlternativeDrawingMethod (off/false by default). Instead of drawing inside the hook proc, it will post a message to the drawing surface to perform the drawing. I think this may resolve some edge cases where the drawing appears erratic, plus it's conceptually a better practice than tying up the hook. Although, this was only executed after a gesture has started, so it won't be noticeable. This will need to be tested quite a bit to ensure there are no issues, especially regarding cleaning up the gesture, to ensure there are no artifacts left behind during multiple quick gestures drawn back-to-back. In theory, nothing should appear or behave differently. But, the internal changes above has been reported to resolve the reporting user's issue, so I decided to leave this off for now. - Added some modifications to the gesture class to support multiple point sets, this will be for future touch screen enhancements, but shouldn't cause any issues. Only noting here for future reference in case something starts going wrong after this version. - Updated Chinese (zh-CN) translations --------------------------------------------------------------------------------------------------- 0.2.9.2 - 3/16/2019 --------------------------------------------------------------------------------------------------- - ** BREAKING CHANGE ** The Global Actions > Mouse Events > Left/Right/Middle/X1/X2 Click Scripts now execute on mouse down and mouse up instead of only on up (release). The click object passed into these scripts already now includes a Down property to tell if the event is mouse down: e.g. if(click.Down) {//mouse down event}; if(!click.Down) {//mouse up event}; - Added sp.GetKeyState (which really calls GetAsyncKeyState) to get the current physical state of a virtual key, see the Microsoft documentation for details. See the Script Help for a simple check to see if the key is currently pressed. - Fixed bad script insert for Insert Hotkey when it's only a single key - Change Insert Hotkey to detect the specific modifier keys instead of defaulting to the left version - Added Change Log link to About - Added call to engine interrupt on script failure to release engine back to pool - Added language entries: ChangeLog ScriptHelp.ActionMethod.GetKeyState.* (all for this new function) --------------------------------------------------------------------------------------------------- 0.2.9.1 - 3/7/2019 --------------------------------------------------------------------------------------------------- - Sorry for the spam, I just yanked out Synaptics entirely, not worth it --------------------------------------------------------------------------------------------------- 0.2.9.0 - 3/9/2019 --------------------------------------------------------------------------------------------------- - Added sp_config.EnableSynaptics NOTE: By default this is false (disabled) due to constant Synaptics issues that really are not making it worth bothering with anymore. Execute this if you want to enable Synaptics touchpad integration, but I'd recommend making a backup of your config file first in case S+.net fails to load after this is applied: sp_config.EnableSynaptics = true; sp_config.Save(); --------------------------------------------------------------------------------------------------- 0.2.8.9 - 3/9/2019 --------------------------------------------------------------------------------------------------- - Fixed reversed parameters in Script Help for sp.MessageBox - Converted all ToolStripButtons to ToolStripLabels in hopes it keeps DPI scaling consistent. Edit: It doesn't, but much like Synaptics described below, I'm done with DPI stuff for a while, it's always so much work for very little return. The entire UI would need to be rewritten using WPF or UWP. Maybe someday... - Changes to Synaptics event subscribing/unsubscribing to hopefully eliminate leaks - Added SynapticsCaptureEvents to Trace Options for similar but different logging of Synaptic events - Added check in Startup/Reload to see if Synaptics is disabled, if so do not bind event handlers - Few Synaptics updates to hopefully help with stability, but otherwise I'm just done with Synaptics for the foreseeable future, it's just a pain in the ass and they don't support developers - Honestly, I don't recommend using Synaptics (set it to Disabled) if you're using a laptop and care about battery life, just loading the packet data while you're using the touchpad eats up a bunch of CPU by StrokesPlus.net. I've tried everything I can for now, the only other option is try see if I can pull in the C++ files instead of using managed COM interfaces...but like I said, I'm done with it for a while. - Updated Chinese (zh-CN) translations --------------------------------------------------------------------------------------------------- 0.2.8.8 - 3/7/2019 --------------------------------------------------------------------------------------------------- - Added missing script help parameter topLevelOnly to sp.WindowFromPoint - Fixed issue where Script Help window may not open again after closing the Settings window while the Script Help window is still open - Updated Chinese (zh-CN) translations, big thank you to Discord user 小恐龙 for doing them all in less than one day!! --------------------------------------------------------------------------------------------------- 0.2.8.7 - 3/6/2019 --------------------------------------------------------------------------------------------------- - Added a Script Help window (button in script toolbar) which shows the various methods, objects, and properties available to use in scripts. This is not very polished, but I wanted to put something in place - Updated hotkey script to fire on a separate thread, not tie up the main message loop - Added the ability to quickly record and play a temporary macro, note that just like the other macro recording areas, this does stop the main mouse and keyboard hooks to record, and also unregisters and StrokesPlus.net hotkeys during recording. Important: This method uses the current values in the Macros section, but does NOT warn you about the need to press Ctrl+Break to stop recording. sp.RecordTemporaryMacro(); //See Script Help for an important note about hotkey use! sp.PlayTemporaryMacro(); //See Script Help for an important note about hotkey use! sp.GetTemporaryMacroScript(); //returns the script of the last temporary macro - Moved some of the hidden (script only) options to the Options screen - Brought over some of the main script toolbar buttons into the Macros section - Updated Insert Hotkey to output a script based on whether modifiers were pressed, probably a rare situation, but maybe some people will just want to send a single key - Changed sp.SendControl/Alt/Shift Down and Up to use the left key code instead of the non-specific key code, to be more internationally friendly - Removed old overload version of sp.WindowFromPoint(WinAPIFunctions.POINT pt, bool topLevelOnly), sp.WindowFromPoint(Point pt, bool topLevelOnly) still works and is now the only version of this - Removed wParam from SendMessageGetTextObj as it was not used - Added option of starting S+.net with "allowmultipleinstances" in the command line to support running multiple instances of S+.net, though this is an unsupported running mode and use of this feature is at your own risk! - Added ScintillaCommonEvents to tracing options - Added period as a fill up character in the editor when the auto complete popup is shown - Changed trace options screen to sort the list items alphabetically and updated the header text - Added SystemMetric type to the script editor - Updated zh-CN and pl-PL translations - Added language entries: tabPreferencesRelayOnGestureTimeout tabPreferencesEnableDisplayChangeMessage tabPreferencesEnableScriptEngineLockAttemptsExceededMessage tabPreferencesEnableAccountValidationConnectionError tabPreferencesEnableV8ScriptDebugging tabPreferencesMaxScriptEnginePoolSize tabPreferencesScriptEngineLockAttempts RequiresRestart ScriptHelp* (a LOT of new entries starting with ScriptHelp, seriously, over 1000 entries) (the ones below are the important ones to translate quickly, the others can wait) frmScriptHelpTitle ScriptHelpButtonText ScriptHelpLabel --------------------------------------------------------------------------------------------------- 0.2.8.6 - 3/2/2019 --------------------------------------------------------------------------------------------------- - Added Record (macro), Insert Hotkey, Find, Find Next/Previous toolbar and buttons to script editor - Now that I have a script toolbar, I plan to start adding more features there to make everyone's life easier..stay tuned! - Added Insert Hotkey window, shown from script toolbar, note that the output script always specifies to use the left version of the modifier key, e.g. Left Control, Left Win, etc. This is because it should be the most compatible for international users - The script macros and hotkey script is inserted at the current cursor location in the editor - Added some additional key logic for correctly detecting modifier keys by looking at the base, left and right key codes - Minor fix to trace window, it will now properly remember CoreCaptureEvents, bad index check.. - Added license prompt to the installer (sorry!) - Included License.txt in the installation folder, and in the portable ZIP file - Added Licenses & Attributions link in Settings > About section, which opens new License window - Added language entries: frmLicenseTitle License LoadLicenseFileErrorMessage InsertHotkey frmInsertHotkeyHeaderText --------------------------------------------------------------------------------------------------- 0.2.8.5 - 3/1/2019 --------------------------------------------------------------------------------------------------- - Fixed bug introduced in 0.2.8.4, single stroke clicks could sometime still lead to draw points not being cleared, producing unexpected results. --------------------------------------------------------------------------------------------------- 0.2.8.4 - 3/1/2019 --------------------------------------------------------------------------------------------------- - Major changes to mouse hook, gesture drawing/clearing, and related code. Not triggering an auto update. Not even posting this to the downloads page yet. - Stability and performance updates, or at least hopefully I didn't introduce new bugs! - Fixed issue with relay gesture on no match not moving the mouse to the right location - Fixed issue with not clearing part of the gesture under the unlikely circumstance of drawing a really large gesture, releasing the stroke button then pressing the stroke button again very quickly and drawing another gesture, before the previous gesture had been erased from the screen. This resulted in the first part of the second gesture not being cleared. - Added lock inside cancelTimer callback - Added lock inside clear gesture function - Added locks to gesture drawing functions and point assignments - Moved hint show call into separate thread - Various optimizations and performance improvements relating to hints and drawing, mostly noticeable when drawing a huge gesture, like in a circle 30 times. The hint popup no longer uses the lock used by the mouse hook, which greatly increases performance in your mouse movement. It copies the draw points first then looks for matches, so any performance hit is isolated to the hint thread. --------------------------------------------------------------------------------------------------- 0.2.8.3 - 2/28/2019 --------------------------------------------------------------------------------------------------- - Fixed Scintilla Search Box link in About section, so it actually opens the link when clicked - Added locks around cancel timer calls, in hopes it eliminates a rare race condition - Added Synchronize checks to missing areas (currently invisible, for future use) - Added Synchronize property to SavedMacros object, any existing macros will initialize this to false because it's a bool and that's the default value. Down the road when that feature is turned on, you'll have to enable (check) synchronization for those. Any new macros will have this property set to true - Updated trace build to remember your last options, so you don't see the window every time you start. Tray menu has a Set Trace Options item to open the window and change selections. --------------------------------------------------------------------------------------------------- 0.2.8.2 - 2/24/2019 --------------------------------------------------------------------------------------------------- - Changed the ignore key to check boxes to support multiple ignore keys - Note that to ensure backward compatibility, sp_config.IgnoreKey still exists, but it is only used when you first run a version starting at 0.2.8.2, to populate the new setting property sp_config.IgnoreKeyList which is a List type. IgnoreKeyTypes is still the enum used for the IgnoreKeyList items, though IgnoreKeyTypes.None is no longer used. - Fixed issue with export always including Floaters when selecting individual items to export - Fixed issue with importing partial settings resulted in an error about registering hotkeys, the code wasn't clearing out and registering hotkeys on the right thread - Fixed issue with the Settings class calling load/clear hotkeys which sometimes happens on a different thread than the main application. This resulted in receiving an error about failing to register hotkeys - Updated a few areas dealing with clearing and reloading hotkeys to properly watch the state and wait until the main thread finished with the hotkey action - Improved update check to detect if you're running the installer normal or trace build and downloading the full or trace update installer accordingly - Improved the update check to detect if you're running the portable version and opening a download link using the default web browser to the correct ZIP download for normal or trace portable build - This logic is based on two checks combined: 1) Is the running EXE signed? This means it was from the installer EXE, not the portable version 2) Does the file name of the running EXE have the word "Trace" in it? If so, it's the trace version - The result of those together determines the download URL used (described in the change notes for release 0.2.8.1), and whether to download the file directly and run (installer version), or open the default browser to download the corresponding portable ZIP file --------------------------------------------------------------------------------------------------- 0.2.8.1 - 2/23/2019 --------------------------------------------------------------------------------------------------- - There's really nothing new in this release, but I wanted to test out the whole build, publish, and update check process - New formatted download links Installer: https://www.strokesplus.net/download/latest/installer Trace Installer: https://www.strokesplus.net/download/latest/installertrace Portable: https://www.strokesplus.net/download/latest/portable Trace Portable: https://www.strokesplus.net/download/latest/portabletrace Previous version: Replace "latest" with the version number, for example: https://www.strokesplus.net/download/0.2.7.9/installer https://www.strokesplus.net/download/0.2.7.9/portable - All releases starting with 0.2.8.1 will also be published with a separate trace version as described below. The trace links above won't work for older versions where there wasn't a trace version published - The entries below shouldn't result in anything visible to you, but PLEASE let me know if all of the sudden something is not working right with the installer/uninstaller. - Some changes to the build and installer scripts to better support trace builds - Added "_Trace" portable and installers which contain just the exe and config file. You must already have S+.net installed for the trace version to run since it doesn't include all of the DLLs. The installer makes a separate Start menu item named "StrokesPlus.net Trace" and can be uninstalled separately, only removing the two files it added. For the portable version, just extract the two files into the same folder as S+.net and run the StrokesPlus.net_Trace.exe - These trace builds are really just for troubleshooting issues, usually something I would ask you to do and send me the logs. But you can certainly use them and view the log files for...fun? - The location of the log files is generally a Log subfolder of where your StrokesPlus.net.bin file resides. The default location is "C:\Users\{USERNAME}\AppData\Roaming\StrokesPlus.net\Log\" The trace files are timestamped with when you started the trace version and continues logging until you exit S+.net. - I do NOT recommend running these for every day use, as the tracing calls slow down the app and the log files can become quite large and waste disk space! - Updated normal installer to not overwrite StrokesPlus.net.exe.config if it exists --------------------------------------------------------------------------------------------------- 0.2.8.0 - 2/20/2019 --------------------------------------------------------------------------------------------------- - Disabled tooltips on the macro Record and Play buttons as they caused lingering visual artifacts during recording or playing a macro - Fixed issue with macro script not being updated internally when clicking Play, to ensure any changes you made in the editor are what is executed - Couple changes to the way the Macros tree view behaves, it was copied from the Actions tree view and some of the logic doesn't apply to macros tree nodes - Updated Macro and Action tree views to allow clicking in an empty area below the nodes, to select no nodes at all, which allows importing a set of items which have a category and that category being added (if it doesn't already exist) - Updated to Import/Export for Macros to order by Category then Name - Fixed issues with Import/Export not functioning properly in a few areas when selecting specific items to export; full export was okay. Also fixed other issues. I need to test all of this again more thoroughly since there have been many changes since it was added - Updated Polish and Chinese (CN) translations --------------------------------------------------------------------------------------------------- 0.2.7.9 - 2/19/2019 --------------------------------------------------------------------------------------------------- - Big changes, not triggering an auto update on this release - BREAKING CHANGE: sp.GetMacroScript now requires two parameters, category and name Example: sp.GetMacroScript("General", "My Macro Name"); - Massive changes to make Macros a more fully fleshed out feature - Moved Macros into the Settings screen - Added .Category to SavedMacros class - Added Macros section to Import/Export screen - NewApplicationDefaultCategoryName ("General") is the default category for macros - Added missing Window Focus Script to import/export when I added that script a while back - Added language entries: MacroFileFilterName SettingsToolbarMacros LoadingSettingsMacros AddMacro NewMacroName ImportMacro ExportMacro MacroCopyExecuteScript MacroCopyFullScript MacroOptionsGroupText MacroRecordBeforeStartTitle MacroRecordBeforeStartMessage MacroRecordLoseScriptTitle MacroRecordLoseScriptMessage MacroOptionsShowRecordStartMessageCheck MacroOptionsShowRecordClearWarningCheck MacroOptionsIncludeWindowDetailsCheck MacroOptionsSleepMultiplierLabel MacroOptionsMinSleepDelayLabel MacroOptionsMinMouseDeltaLabel Play Record Stop --------------------------------------------------------------------------------------------------- 0.2.7.8 - 2/18/2019 --------------------------------------------------------------------------------------------------- - More updates to the Macro Recorder window and related code: - REMOVED sp.ShowMacroWindow() function, added Macros button in Settings screen. Since the macros are stored to your settings, the macros window must be opened from the Settings window to ensure there are no conflicts with one window overwriting the settings you just saved in the other. - As such, you can now record macros while the Settings window is open. I think it was because the macro recorder window needed to be on its own thread or something. - Clicking Record or Play will minimize and restore the Settings and Macro Recorder windows - You must close the Macro Recorder window before you can close the Settings window, again to ensure everything is properly saved and in sync. I will revisit making this more fluid as I continue working on the macro area. If you click OK or Cancel in the Settings window with the Macro Recorder window open, it will bring the Macro Recorder window to the foreground - Added Apply button in Macro Recorder window for now to apply macro settings. This just clicks the Apply button in the Settings window so adding/updating/deleting macros can be temporarily applied to test. When you click OK in the settings screen, the changes are saved just like all other settings. If you click Cancel in the Settings screen, it will warn you about losing changes just like it does normally, this would include any changes made to saved macros - Ultimately, I see this separate window going away and it just being inside the Settings window completely, but this makes it easy to work on without interfering with the Settings window code - Moved Macro window minimize call to just after the Record macro begins, to capture the window details of the active program after the macro window is minimized - Cleared dirty flag after saving a macro, so it doesn't prompt about losing changes - There are still no translations yet available for the Macros button or screen, as I want to perform a lot more testing then move the Macro Recorder window into the Settings screen as a new section. Once that is done, I will add the language entries for translation - Other: - Updated sp.PlaySound to make sure the file exists. If not, it simply doesn't try to play the file - Updated some logic relating to the sp_config.DisableRelayOnGestureTimeout setting to ensure that stroke button down and hold until cancel delay, without starting to draw a gesture, doesn't consume the next mouse up event - Added missing code to update the tray icon when clicking Apply in the Settings screen - Updated zh-CN translations --------------------------------------------------------------------------------------------------- 0.2.7.7 - 2/17/2019 --------------------------------------------------------------------------------------------------- - More updates to sp.ShowMacroWindow() and related code - On Save, if there's a macro selected in the dropdown, it will pre-populate it - Added various dirty checks to warn about discarding changes in the Macro Recorder window - Added some extra logic around the recently added sp_config.DisableRelayOnGestureTimeout setting in hopes it resolves some instability issues --------------------------------------------------------------------------------------------------- 0.2.7.6 - 2/17/2019 --------------------------------------------------------------------------------------------------- - More updates to sp.ShowMacroWindow() and related code - Added message box after clicking record, to let you know how to stop recording a macro - Removed extra :s from App Definition comments in Macro Recorder script output - Fixed bug in clicking save and cancelling out of the save macro popup - Added list of existing Saved Macros to the save popup - Added some extra checks around playing the sound (if enabled) on no gesture or action match --------------------------------------------------------------------------------------------------- 0.2.7.5 - 2/17/2019 --------------------------------------------------------------------------------------------------- - More updates to sp.ShowMacroWindow() and related code - Change sp.ShowMacroWindow() to start window on its own thread - Updated marco window to use Scintilla Editor, this also required changing the main script editor code, moving common functions into a separate class using dependency injection. However, the Find / Replace functions are not currently available in the macro window - Added Play button to run the recorded macro in the macro recorder window - Added Save button in macro window, stored vaues in sp_config.SavedMacros - Added drop down list of saved macros which can be loaded and deleted - Added sp_config.SavedMacros, which is a list of saved macros with the properties: .Name .Description (not currently used) .Script - Added sp.GetMacroScript("name") to return the script of the saved macro, you would execute the saved macro like this: eval(sp.GetMacroScript("My Saved Macro Name")); - Added Copy Macro Exec button which puts the above eval script on the clipboard for you, so you can paste it into an action - Change to the way macro button down/up and mouse movement events were being tracked. It's possible to create a race condition if you're quickly pressing multiple mouse buttons at the same time, but I don't think that would be a realistic use case - Updated to remove initial sp.Sleep from script after "sp.ConsumePhysicalInput(true);" - Just a note that the Min. Sleep Delay is not applied to mouse movements, only other events - Added setting sp_config.DisableRelayOnGestureTimeout (default false) which can be set to true if you don't want S+.net to send the stroke button down event when you pause and let a gesture timeout after the Cancel Delay. This will prevent certain actions like right-click dragging files in explorer, waiting for the cancel timeout, then releasing the right button to reveal the context menu options like Move Here, Copy Here, or Extract if it were a .zip file. You would instead need to hold the ignore key down or call sp.DisableNext(); before performing this action. Script to change and save this setting, make sure you have the Settings window closed when executing this script: sp_config.DisableRelayOnGestureTimeout = true; sp_config.Save(); - I will eventually have a Macros button/section in the Settings window, and setup language entries This is all just for testing the basic functionality, without showing it easily in the UI where an inexperienced user would see it - Made Help button visible, opens to https://www.strokesplus.net/Help, though I haven't started putting help content together yet..hopefully this button being there will motivate me! Note: I'd intended to not do this yet, but I guess I forgot to hide the Help button sometime within the last few releases, so leaving it and adding this to the change log for historical purposes. --------------------------------------------------------------------------------------------------- 0.2.7.4 - 2/17/2019 --------------------------------------------------------------------------------------------------- - More updates to sp.ShowMacroWindow() - If S+.net doesn't have the mouse and/or keyboard hooks active, they will be enabled during macro recording. They will be restored to their previous state after recording is complete. - Any hot keys you have defined are cleared/unregistered during macro recording, they are restored after recording is complete. - Updated mouse macro recording to check for any other mouse button being down before setting the mouse down flag to false. - Added sp.ConsumePhysicalInput(true); to start of script and sp.ConsumePhysicalInput(false); to end of script to prevent mouse/keyboard input during macro playback - Added return in WinEventHook if in macro record mode, after getting app qualifiers --------------------------------------------------------------------------------------------------- 0.2.7.3 - 2/16/2019 --------------------------------------------------------------------------------------------------- - Updated text on sp.ShowMacroWindow() to be a little more clear, but still English only for now - Changed mouse click delay to an overall minimum sleep delay - Added a Sleep Multiplier, which increases or decreases the values passed into sp.Sleep. This is defaulted to 1.00 so a 100ms delay captured during recording would be 100ms in the script. Setting it to 0.5 would make 100ms be 50ms, 1.5 would make 100ms be 150ms. - Added sp.MouseMove before mouse wheel events during macro recording - Due to certain situations, I really have to track mouse movement at all times, like if you click the middle button in Chrome, you can move the mouse to scroll around which the button is no longer down. So instead of trying to make exceptions or complicated logic, macros will simply record verbatim, but I did add a minimum movement threshold, to reduce the calls if needed - Added Minimum Movement Pixels which helps to ensure mouse wheel events add mouse movement entries. However, while a mouse button is being held down, every movement will be captured. If you need fine precision all of the time, set to Minimum Movement Pixels to 1; just be prepared for very large macro scripts! --------------------------------------------------------------------------------------------------- 0.2.7.2 - 2/16/2019 --------------------------------------------------------------------------------------------------- - Updated Chinese (CN) langauge translations - Added sp.ShowMacroWindow() which shows a basic test form to record mouse and keyboard events to a script. This is for beta testing this functionality, so there are no translations for this. The lblMouseClickMoveDelay box is to set the sleep time before clicking after moving the mouse. chkCaptureWindowDetails just indicates whether the macro captures the details of each time a new window gains focus. It's only a commented line since there's no easy way to automate that, but at least this will give you the specifics to use if you want to activate the window. - Press Control+Pause/Break to stop the macro recording - Please test out some macro scripts and let me know if you find anything which isn't being captured or replayed correctly. --------------------------------------------------------------------------------------------------- 0.2.7.1 - 2/11/2019 --------------------------------------------------------------------------------------------------- - Added check for safe mode in script engine initialize function - Fixed issue in DisplayTextInfo.ForeColor where it would never use the value passed in - Updated Disable/Enable to unregister and re-register hotkeys when S+.net changes states - Added sp.DeleteAllTimers() which stops and deletes all timers that were started via sp.CreateTimer - Note that any timer scripts that have been created continue to run on their defined schedule, regardless of whether or not S+.net is enabled. This is intentional as I have, for example, a timer that continually runs to move the mouse every so often. I also have S+.net disable in certain programs, but I still want the timer to continue running when I switch between programs which re-enable S+.net. Timers run until deleted via script, either explicitly or using the new sp.DeleteAllTimers() function, or when closing/reloading S+.net. - Updated InputSimulator link in About section to point to current Github URL --------------------------------------------------------------------------------------------------- 0.2.7.0 - 1/28/2019 --------------------------------------------------------------------------------------------------- - Added missing check in keyboard hook for GlobalUserCancel, which is set via sp.EnableCapture() and sp.DisableCapture() - Added sp_config.PlugInSearchLocations to support future and current use defining which folder(s) to look for Plug-In DLLs. Example usage below; this is simple C# List collection. Note: S+.net always looks in the default Plug-Ins folder from where S+.net is currently running. Add a new location: sp_config.PlugInSearchLocations.Add("C:\\TestPlugIn\\"); sp_config.Save(); sp.Reload(); Remove a location (string must match exactly): sp_config.PlugInSearchLocations.Remove("C:\\TestPlugIn\\"); sp_config.Save(); sp.Reload(); Clear all locations: sp_config.PlugInSearchLocations.Clear(); sp_config.Save(); sp.Reload(); Loop through each existing location stored: for(i = 0; i < sp_config.PlugInSearchLocations.Count; i++) { sp.MessageBox(sp_config.PlugInSearchLocations[i], "Path"); } Also, after you make changes and save, either call sp.Reload(); or click Reload from the tray menu. To avoid crossing code paths, execute the above while the Settings window is closed. - Updated Plug-In loading code to only show a Plug-In DLL loading error once per start or reload, to avoid getting the popup error for each script engine in the pool. --------------------------------------------------------------------------------------------------- 0.2.6.9 - 1/27/2019 --------------------------------------------------------------------------------------------------- - Risky release, not triggering auto update, see (RISK) entry below.. - Fixed issue with manual disable, restarting S+, opening settings and clicking OK. This was putting StrokesPlus.net into an invalid state of the hook being enabled, which it shouldn't be, but not showing the tray icon as active nor drawing the gesture line, but actions would execute. - Updated login logic to handle a connection error more gracefully, only showing the notification, not also clearing the account token and showing the login window - Added sp.SendModifiedVKeys(Modifiers, Keys) to allow an easier method of sending key stroke combinations, especially for non-English keyboard layouts, as sp.SendKeys usually results in some characters being translated. You can pass either parameter as a single VKey or an array of VKeys as shown below: sp.SendModifiedVKeys(VKey, VKey) sp.SendModifiedVKeys(VKey[], VKey[]) sp.SendModifiedVKeys(VKey[], VKey) sp.SendModifiedVKeys(VKey, VKey[]) Some examples of key combinations (remember, vk.MENU is the ALT key): //CTRL+ALT Down, A, C, CTRL+ALT Up sp.SendModifiedVKeys([vk.CONTROL, vk.MENU], [vk.VK_A, vk.VK_C]); //CTRL+A sp.SendModifiedVKeys([vk.CONTROL], [vk.VK_A]); //CTRL+SHIFT+S sp.SendModifiedVKeys([vk.CONTROL, vk.SHIFT], vk.VK_S); //CTRL Down, E, V, CTRL Up sp.SendModifiedVKeys([vk.CONTROL], [vk.VK_E, vk.VK_V]); //CTRL+S sp.SendModifiedVKeys(vk.CONTROL, vk.VK_S); //CTRL+ALT+A sp.SendModifiedVKeys([vk.CONTROL, vk.MENU], vk.VK_A); - (RISK) Added sp_config.MaxScriptEnginePoolSize (int, default 2). While this seems like a small change, I actually had to restructure quite a bit of code in the script engine. I've tested quite a few scenarios and have been running for a couple days without issue, but I may not have found something yet. If sp_config.UseScriptEnginePool is true (default), this new setting will define how many script engines are created. Each script looks for an available engine and previously there were only 2, so if you had 2 long running or blocked (like an InputBox was showing) scripts, you might run into a message where StrokesPlus.net tells you no engines are available, after sp_config.ScriptEngineLockAttempts has been exceeded. This new option allows you to have more available engines. However, there is a cost with each engine added, in terms of resources, so I would only recommend increasing this value if you specifically need it. For reference, if you set sp_config.UseScriptEnginePool to false, it will create a new engine for each script (action/hot key, etc). This will allow as many concurrent scripts as your system resources will allow. However, this isn't generally recommended as it is significantly slower, as each engine has to be spun up, have all of the host objects added, load any plug ins, etc. When you update this setting, you'll need to save your config and reload. This script will hande that in one shot: sp_config.MaxScriptEnginePoolSize = 3; sp_config.Save(); sp.Reload(); --------------------------------------------------------------------------------------------------- 0.2.6.8 - 1/24/2019 --------------------------------------------------------------------------------------------------- - Fixed issue in 0.2.6.7 with Module Name returning the Module Path; it was a copy/paste fail --------------------------------------------------------------------------------------------------- 0.2.6.7 - 1/24/2019 --------------------------------------------------------------------------------------------------- - Added checks against file path name in GetProcessPath to prevent unhandled error leading to StrokesPlus.net crashing. There seems to be something going on with the latest Windows updates that is leading to an empty path being returned. I will continue to research this, but this should prevent S+ from throwing an exception and exiting. - Updated StopAllExecution script engine function to reset E1Exec and E2Exec to false, to ensure StrokesPlus.net doesn't think either script engine is still running if a Reload is requested --------------------------------------------------------------------------------------------------- 0.2.6.6 - 1/22/2019 --------------------------------------------------------------------------------------------------- - Updated Polish and Chinese (TW/CN) translations - Added error handling when trying to get file path/name of executable for FindWindow - Added fallback method of getting file path/name of executable for app matching/Find Window - Added .LegacyModuleName (string) propery to SystemWindow class which uses direct WinAPI calls to get the path and filename of the window's executable. This is to address possible issues when trying to get the file name for a protected application (like elevated or using anti-cheat). This method returns a device based path like \Device\HardiskVolume1\{etc} instead of C:\Games\{etc}, so keep that in mind. You can get just the exe name using the Path class like this: var exename = clr.System.IO.Path.GetFileName(action.Window.LegacyModuleName); --------------------------------------------------------------------------------------------------- 0.2.6.5 - 1/20/2019 --------------------------------------------------------------------------------------------------- - Experimental release, not triggering auto update - Added ManualDisable property to settings/sp_config to store if you manually disabled StrokesPlus.net This is to ensure that if you manually disabled S+.net, exited, opened S+.net again and have the "Enable on No Ignore App Match" option checked, S+.net would still remain disabled on the next run. - Added logic to sign into forum account, which will be used for (optional) online activities, such as script/plug-in repository, synchronizing settings across multiple computers, etc. This uses the Windows DPAPI to store your account info encrypted and bound to your user profile. Meaning, you can't simply copy the file to another computer (excluding domain roaming profiles). It would fail to decrypt the file and you'd have to login again. However, to try to keep this flexible for portable users, the file storing the credentials is named based on computer name and Windows user name, so you could have multiple files for different computers, though you will have to login on each different computer (or user profile) to store the encrypted credentials. Note that running StrokesPlus.net as a different user on the same computer (for example, run as administrator) would result in having to login to StrokesPlus.net again. For most people, this won't happen, but I like the way this works in terms of security; I would not want someone to be able to get the credential file and use it to access your account. - Also, note that I currently am not going to extreme of protecting the data in memory itself just yet. If someone has physically compromised your machine, I think you have bigger problems than them spending a lot of time scanning RAM to get your StrokesPlus.net Forum credentials. But I do have a note in my to do list to revisit that later. - I would like to have some folks do various testing as this is something that will be very difficult to test in various environments and configurations. The actual features this will enable won't be added for a while, but I wanted to put this framework together and have it tested well in advance. Thanks! - Note that when you login successfully, you won't see anything. You can tell if you're logged in by right-clicking the tray icon. If you see "Logout" that means you're logged in. - Added sp_config.DisableAccountValidationConnectionError (bool) to disable balloon notification if StrokesPlus.net is unable to connect to validate your account login. This could be your internet is not connected or that my web server is down. - Added language entries: - LoadAccountTokenErrorTitle - LoadAccountTokenErrorMessage - LoadAccountTokenDecryptErrorTitle - LoadAccountTokenDecryptErrorMessage - ValidateAccountConnectErrorTitle - ValidateAccountConnectErrorMessage - SaveAccountTokenFileErrorTitle - SaveAccountTokenFileErrorMessage - frmAccountLoginFailed - frmAccountLoginPasswordRequired - frmAccountLoginUserNameRequired - frmAccountLoginTitle - frmAccountLoginHeadingText - frmAccountLoginUserNameLabel - frmAccountLoginPasswordLabel - Login - Logout - TrayMenuLogin - TrayMenuLogout --------------------------------------------------------------------------------------------------- 0.2.6.4 - 1/13/2019 --------------------------------------------------------------------------------------------------- - Added new hidden setting sp_config.EnableV8ScriptDebugging (true/false [default]). If true, JavaScript debugging will be enabled, as described in version 0.2.6.3. I figured I'd add this just in case having the debugging always enabled would have any impact on performance or resource utilization. Simply execute sp_config.EnableV8ScriptDebugging = true; one time and the setting is saved, call again with false to disable. The following script will update the setting and perform the steps necessary for it to take effect: sp_config.EnableV8ScriptDebugging = true; sp_config.Save(); sp.ReloadScriptEnginePool(); --------------------------------------------------------------------------------------------------- 0.2.6.3 - 1/13/2019 --------------------------------------------------------------------------------------------------- - Experimental release, so I'm not triggering an automatic update; download directly to try it out. - Enabled debugging of scripts using JavaScripts debuggers like Visual Studio Code, see here on how to configure VS Code: https://microsoft.github.io/ClearScript/Details/Build.html You can also connect via Chrome by navigating to: chrome://inspect/#devices You should see a Remote Target listing StrokesPlus.net.exe, click the inspect link. Note that since each script is loaded and executed dynamically, you won't see much or anything. In the script you want to debug, add this line where you want to invoke debugging: debugger; Once that line is hit, the debugger will show you the script and let you debug. --------------------------------------------------------------------------------------------------- 0.2.6.2 - 1/12/2019 --------------------------------------------------------------------------------------------------- - Fixed null reference crash when trying to open Settings after previously clicking OK while in the Global Application > Settings tab and not having changed the tabs (Before/After) once to set the saved last sub-subtab. - Updated all tabs so upon loading the Settings screen, it checks to ensure the tab exists before attempting to set the selected tab from saved settings, just to be safe --------------------------------------------------------------------------------------------------- 0.2.6.1 - 1/10/2019 --------------------------------------------------------------------------------------------------- - Changed .Minimize() to send WM_SYSCOMMAND and SC_MINIMIZE message instead of using ShowWindow API call. This is to address issues with Delphi (and similar) programs which use a host window as the main message pump instead of the application's main window. --------------------------------------------------------------------------------------------------- 0.2.6.0 - 1/4/2019 --------------------------------------------------------------------------------------------------- - Updated change from 0.2.5.8 auto complete to not add parameters unless holding the Shift key. It wasn't checking the method of the auto completion, so if you were typing out a function and and then held Shift to enter the opening paren "(", it would still add the extra info...completely defeating the purpose of why I made the change! Now I'm making sure the auto complete method was not due to a FillUp character --------------------------------------------------------------------------------------------------- 0.2.5.9 - 1/1/2019 --------------------------------------------------------------------------------------------------- - Corrected logic in rocker gesture behavior to ignore secondary stroke button. Rocker gestures are only intended for the right and left mouse buttons. But it wasn't checking to see if the stroke button pressed was a secondary (where not right or left) and entered the logic to fire the gesture. This resulted in unexpected bahvior and possible other issues. - Fixed unexpected behavior with pending settings (when you click Apply). When you clicked Apply the first time, the temporary settings were being assigned by reference, meaning any additional changes were happening in real-time without having to click Apply again. Not like it was a big deal, but was unintended and affected certain code paths where it assumed the settings were by value. - Updated Display DPI Mismatch message to only show once. You can manually reset that by executing sp_config.DisableDisplayMismatchMessage = false; After showing the next time, it will again be disabled. --------------------------------------------------------------------------------------------------- 0.2.5.8 - 12/29/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with hotkeys not always being properly released when changed in Settings windows - Fixed issue with hotkey and floater scripts not automatically being saved to memory when changing to another item in the list - Changed the auto complete function in the editor so it will only insert the extra info like parameters and return type if you press Shift and Enter when selecting the item - Changed auto complete to only appear when pressing "." You can press Ctrl+Space to invoke the auto complete list manually - Hopefully fixed new gesture form layout, form's font was set smaller than controls, so scaling was not behaving as expected. However, some other forms have a smaller size and haven't been reported, but could be those forms are not visibly impacted - Added "minimized" as an accepted value for the "style" parameter of sp.RunProgram - Ampersands (&) will now be displayed in the hint and display text popup - Fixed regression issue with rocker gestures, where left down and multiple right clicks was not functioning as intended. Issue started with 0.2.4.6 as a result of correcting a random bug, so the bug might show itself again (S+ getting stuck in rocker/stroke button down state). I've tried to see if the race condition reappeared, but can't get it to happen...so we'll just have to see --------------------------------------------------------------------------------------------------- 0.2.5.7 - 8/14/2018 --------------------------------------------------------------------------------------------------- - Added IgnoreKeyTypes to script engine and editor - Updated French, Polish, and Chinese languages --------------------------------------------------------------------------------------------------- 0.2.5.6 - 8/12/2018 --------------------------------------------------------------------------------------------------- - Added Win Events tab in Global for new option/script to execute when the foreground window changes - No parameters/objects are passed into this script, you will need to do the work yourself, for example getting the foreground window via sp.ForegroundWindow() - Always fires unless (idObject != 0 || idChild != 0) [passed into the WinEvent proc] OR when S+.net is the window gaining focus. S+.net sets the WinEvent hook to only process out of context events, so the script will not fire when the S+.net process is the window gaining focus - Executes after all existing S+.net logic has processed in the WinEvent proc - Do NOT use any UI functions in your script! For example, sp.MessageBox(), as this will constantly cause the focus to change and you'll be stuck in a loop. If you do, use the safemode command line parameter or hold CONTROL while starting S+.net to disable the WinEvent hook. Yes, I offer this wisdom because that's exactly what I did when testing the new function :) However, this did cause me to also disable the WinEvent hook during safe mode, so all in all it was a good thing. My advice is to test the script in a temp gesture based action, once the script is working, then move it to the new script. Something wrong in the script which causes S+.net to show a script error message box will result in an endless loop since each time you click OK on the error, the foreground window changes, causing the script to run again. - Added settings property (boolean) sp_config.FireOnWindowFocus for above feature, but you can just use the checkbox in the Settings window :) - Changed display change event handlers, utilizing DisplaySettingsChanging and DisplaySettingsChanged - Program.settings.DisplayChangedTimerInterval no longer used - Added .CommandLine (string property) to SystemWindow objects [e.g. action.Window.CommandLine], returns the command line and parameters of the window's program. For example, notepad opened from double-clicking C:\test.txt would return the following, I did not add the quotes: "C:\WINDOWS\system32\NOTEPAD.EXE" C:\test.txt If the process no longer exists or S+.net has been denied access, it will return an empty string. - Added sp.KeyboardCaptureEnabled (boolean property). If set to false, the keyboard hook immediately calls the next hook in the chain, it does not interfere or react to any keyboard events at all until set to true (hotkeys excluded, as those are captured by Windows and a message is sent to S+.net). This is not a saved setting, if you close and re-open S+.net the keyboard hook will be active. - Added sp.MouseCaptureEnabled (boolean property). If set to false, the mouse hook will immediately call the next hook in the chain, it will not interfere or react to any mouse event at all until set to true. This is not a saved setting, if you close and re-open S+.net the mouse hook will be active. - Added settings property (int) sp_config.ScriptEngineLockAttempts (default 500, minimum 5) which tells S+.net how many times to try getting an available script engine (2ms delay between attempts). This is to prevent S+.net from spinning in an indefinite loop when the script engines are processing. For example, a message box is being displayed in each engine while another script tries to execute, S+.net would hang waiting for a script engine to become available. - Added settings property (boolean) sp_config.DisableScriptEngineLockAttemptsExceededMessage (default false) This is used to control whether or not an error message box is displayed when the attempts from the above setting have been exceeded, if set to true the script will be abandoned. - Added language entries for: - tabGlobalWindowEventsTabName ("Window Events") - WindowFocusScriptTab ("Foreground Window Change") - tabPreferencesFireOnWindowFocus ("Enable Foreground Window Change Script") --------------------------------------------------------------------------------------------------- 0.2.5.5 - 4/2/2018 --------------------------------------------------------------------------------------------------- - Added German translation --------------------------------------------------------------------------------------------------- 0.2.5.4 - 3/22/2018 --------------------------------------------------------------------------------------------------- - Added try/catch in hint timer function around GetGestureName to hopefully address race condition - Added delay in the move to screen functions to allow time for the window to settle before maximizing again - Updated Chinese (TW/CN) languages --------------------------------------------------------------------------------------------------- 0.2.5.3 - 2/28/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with adding new text expansion followed by renaming it without previously switching nodes to save the entry, was resulting in not saving the details properly - Added .GetImage to Gesture PointPattern class. Function signature (returns System.Drawing.Image): GetImage(int size, int padding, int lineWidth, object lineArrowWidth, Color lineColor, Color bgColor) Example to copy first pattern's image from "P" gesture to clipboard: clip.SetImage(sp_config.Gestures.Where(g => g.Name == "P").First().PointPatterns.First().GetImage(200, 10, 5, 3.8, Color.Blue, Color.White)); - Updated Chinese (TW/CN) languages --------------------------------------------------------------------------------------------------- 0.2.5.2 - 2/27/2018 --------------------------------------------------------------------------------------------------- - Fixed About section layout issue again - Fixed issue with Gestures list view group name text not being initialized properly using language file translation - Fixed issue with typo overwriting the http base engine object - Added System.Speech to base script engine as "speech" - Changed command line parameter processing to actually support more than one since safemode was added in 0.2.5.1 - Updated Chinese (CN/TW) languages --------------------------------------------------------------------------------------------------- 0.2.5.1 - 2/26/2018 --------------------------------------------------------------------------------------------------- - Increased list font size to improve readability for Chinese characters and consistency - Corrected layout issue in About section - Added regular expression validation check for app/ignored definition - Fixed issue with adding text expansion while Space trigger option enabled - Added ability to pass "safemode" as a command line argument. This can be used to correct issues with configuration problems that result in StrokesPlus.net crashing upon load, which keeps you from being able to fix the problem. - Holding Control key while StrokesPlus.net is starting up will also enable Safe Mode. - During Safe Mode, StrokesPlus.net is not active. This is a purely diagnostic mode intended to allow you to correct an issue in the Settings window which is preventing you from loading the program normally. After you've corrected the issue, exit and restart StrokesPlus.net. - Safe Mode prevents the mouse, keyboard, win event hooks from being enabled, hot keys are also not registered, nor are any load/unload scripts executed. - Added enable/disable S+ tracing option (only for TRACE build) - Updated Polish, French, and Chinese (TW/CN) languages - Added language entries for (already provided for languages above): CustomSettingsFileNotFoundMessage CustomSettingsFileNotFoundTitle AppDefinitionInvalidRegexMessage AppDefinitionInvalidRegexTitle TrayCaptionSafeMode SynchronizingSettings SynchronizeAllSettings --------------------------------------------------------------------------------------------------- 0.2.5.0 - 2/18/2018 --------------------------------------------------------------------------------------------------- - Added Activate() function to SystemWindow, which shows the window, restoring if minimized, and brings the window to the foreground --------------------------------------------------------------------------------------------------- 0.2.4.9 - 2/17/2018 --------------------------------------------------------------------------------------------------- - Fixed crash when pressing Ctrl/Alt/Shift while floaters displayed and Control, Alt, and/or Shift floater(s) have been closed - Added handling of Lock/Unlock Windows to disable/enable S+ and reset variables - Added code to reset ignore flag if foreground window has changed and the ignore key is no longer pressed. This is to address S+ becoming unresponsive to gestures after pressing Ctrl+Alt+Del when Control or Alt is an ignore key - Polish language updated - Chinese languages (Traditional-Taiwan/Simplified-PRC) updated --------------------------------------------------------------------------------------------------- 0.2.4.8 - 2/16/2018 --------------------------------------------------------------------------------------------------- - Fixed script engine init to only add system cursors once upon loading the application; was adding to the list each time settings were updated or StrokesPlus.net was reloaded. No immediate issue, but was small a memory leak. - Changed plug-in DLL loading into script engine from instance to type. Instance was far too limiting, but this is a breaking change in that code will need to be changed to instantiate an object from the type. This allows you to create multiple instances of the type instead of being limited to only the one created at runtime, as well as the ability to use constructors with parameters. For example, the plug-in test action was: Test.MsgBox("Test", "This is from the TestPlugIn.dll plug-in."); But now needs to be: var t = new Test(); t.MsgBox("Test", "This is from the TestPlugIn.dll plug-in."); - Changed plug-in DLL loading to also include enums as well as classes, still must be public - Updated ScintillaNET keyword color list to include types loaded from plug-ins. "Test" from the script above will be the same color as DateTime or InputBoxInfo in the editor - Changed full import to clear Settings window state values (where you were last in Settings window) --------------------------------------------------------------------------------------------------- 0.2.4.7 - 2/15/2018 --------------------------------------------------------------------------------------------------- - Fixed several issues introduced with version 0.2.4.3 in regards to ensuring the correct list/tree item is selected and retains selection under different circumstances --------------------------------------------------------------------------------------------------- 0.2.4.6 - 2/14/2018 --------------------------------------------------------------------------------------------------- - Fixed typo in English langauge - Pretty sure I fixed another issue with rocker gestures causing S+.net to be stuck in rocker mode after buttons released...but it's a difficult one to nail down, so only time will tell - Changed tracing to use log file, which is written to %APPDATA%\StrokesPlus.net\Log Note that this is ONLY used if you're running StrokesPlus.net compiled with TRACE enabled, which is not done normally. The installer and portable versions do not have TRACE defined, so this would only be for situations where I need to publish a tracing version for someone to use for troubleshooting a specific issue --------------------------------------------------------------------------------------------------- 0.2.4.5 - 2/13/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with rocker gesture still capturing the mouse movement and drawing a gesture --------------------------------------------------------------------------------------------------- 0.2.4.4 - 2/13/2018 --------------------------------------------------------------------------------------------------- - Added sp.GetCurrentMouseCursor() [String] - Gets the name of the current mouse cursor. As with all cursor functions, there are no guarantees about the result if the user or an application is not using the standard cursor set. The default return value is "Unknown" when a cursor handle doesn't match one of the known cursor types retrievable by the .NET framework's Windows.Forms class described here: https://msdn.microsoft.com/en-us/library/system.windows.forms.cursors.aspx or after trying via the Windows OEM cursor set described here: https://msdn.microsoft.com/en-us/library/windows/desktop/ms648395.aspx Note that the return string will always be a .NET cursor name, "Hand" not "OCR_HAND" for example. Also, OCR_NORMAL is returned as "Arrow", the corresponding .NET cursor name; the rest of the names in the OEM cursor set have obvious correlations to their respective .NET equivalent. To state it again for clarity: This will only work for standard cursors in the standard cursor set. If you have set Windows to use a custom cursor set, or if the application you're testing the cursor in isn't using a standard mouse cursor, you will get "Unkown" back from this function For example, the mouse cursor in Notepad++ when you're in the margin is a reversed arrow, calling sp.GetCurrentMouseCursor() returns "Unknown", while it will return "IBeam" in the edit area because that is a standard cursor (again, assuming you're using the standard cursor set) - Added String to list of script keywords - Added check in text expansion init to ensure Settings window is loaded (internal thing) --------------------------------------------------------------------------------------------------- 0.2.4.3 - 2/11/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with gesture duplicate name check logic - Updated Settings window to remember where you were when you last closed it via clicking OK. It only remembers when you click OK because clicking Cancel completely restores all previous settings, which includes the last area you were in - Updated Chinese languages --------------------------------------------------------------------------------------------------- 0.2.4.2 - 2/10/2018 --------------------------------------------------------------------------------------------------- - Added InputBoxInfo.SelectedValue as an option to set the default selected item when the window is shown - Updated Chinese languages using new method --------------------------------------------------------------------------------------------------- 0.2.4.1 - 2/7/2018 --------------------------------------------------------------------------------------------------- - Fixed typos in English language file - Added CategoryName to action object - Made some changes to the auto disable function of S+.net to hopefully resolve a very random issue where the draw window is getting pinned on top...or something, no idea what/why/how exactly yet, since it's random at this point. Will continue analysis. --------------------------------------------------------------------------------------------------- 0.2.4.0 - 2/6/2018 --------------------------------------------------------------------------------------------------- - Added ClipToWorkingArea [bool] property to DisplayTextInfo. By default, DisplayText will clip the popup so it fits inside the current screen's working area. Setting this to false will ignore that code and render exactly as specified --------------------------------------------------------------------------------------------------- 0.2.3.9 - 2/6/2018 --------------------------------------------------------------------------------------------------- - Added sp.DisplayTextUpdate(DisplayTextInfo info), this will allow you to update the text and location of the currently shown DisplayText window. An example of this would be where you have a script that follow the mouse, showing you the current X,Y position and the RGB color below the mouse cursor. Every time you call sp.DisplayTextUpdate, the timeout originally set in the call to sp.DisplayText is reset and the timeout starts over - Updated About to reflect https protocol for website - Updated Applications section so the App Definition tab is activated when a new app is created - Changed the description of the Global Actions > Actions tab name to "Action List" in English language so it's consistent with the Applications section. No need to update existing translations unless you want to, it was just something that bothered me :P - Changed auto complete parameter insert to wrap System.String parameter types in quotes - Changed auto complete to ignore case during showing the list. Note that the ultimate script *is* case sensitive, but this is a convenience feature in case you accidentally type it in the wrong case you will still see the list - Added "(" as an auto complete fillup character to Scintilla --------------------------------------------------------------------------------------------------- 0.2.3.8 - 2/5/2018 --------------------------------------------------------------------------------------------------- - Updated Chinese language translations and corrected the errant entry in non-English resource files --------------------------------------------------------------------------------------------------- 0.2.3.7 - 2/4/2018 --------------------------------------------------------------------------------------------------- - Removed unused RTF converter libraries - Added IsUnicode property to SystemWindow - Changed update check to use HTTPS now that I bought a cert for the website --------------------------------------------------------------------------------------------------- 0.2.3.6 - 2/4/2018 --------------------------------------------------------------------------------------------------- - Changed function signature to include the boolean useAnsi. If the edit control only supports ANSI, you'll need to set it to true, otherwise false will default to Auto which will generally be Unicode. For example, on my system I have to pass useAnsi as true for Notepad++, but false for Windows Notepad. SystemWindow.SendMessageSetTextObj(object message, object wParam, object lParam, object useAnsi) --------------------------------------------------------------------------------------------------- 0.2.3.5 - 2/4/2018 --------------------------------------------------------------------------------------------------- - Fixed a few places in the Settings window controls where the code was referencing the active settings object instead of the pending settings - Updated webBrowser control in Text Expansions to clear when changing between items - Updated webBrowser control in Text Expansions to prevent navigation (clicking a link) - Updated Text Expansion code to check for Space settings, if unchecked and space(s) exists in token, remove space(s). This only happens when you select/save the item as a validation process, it doesn't go through all Text Expansions to find any which have spaces. However, any Text Expansions which have a token containing a space will have their name color changed to red to indicate there is a problem. Again, note that clicking the item will result in validation, removing the space and correcting the conflict with the setting --------------------------------------------------------------------------------------------------- 0.2.3.4 - 2/4/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with default config failing due to floaters list being null - Added SendMessageObj(object message, object wParam, object lParam) to SystemWindow (returns IntPtr) - Added SendMessageGetTextObj(object message, object wParam, object length) [string] to SystemWindow which internally passes lParam as a StringBuilder with the specified length, returning the string if successful (otherwise empty string). For example, this would be used in WM_GETTEXT - Added SendMessageSetTextObj(object message, object wParam, object lParam) [IntPtr] to SystemWindow which treats lParam as a string for use with StringBuilder before sending message. For example, this would be used with WM_SETTEXT - Added SupportsSelection() [bool] to SystemWindow, indicates if control has DLGC_HASSETSEL flag. This would be true for native Edit and RichText controls, but returns false for Word, Outlook, Visual Studio, etc. - Added sp.LastActiveWindow() [SystemWindow], last window to gain foreground. This is for some testing I was working on, but figured I'd leave it. In theory, it should be the same value as sp.ForegroundWindow() anyway - Added sp.LastFocusControl() [SystemWindow], last control to gain focus. Could be the handle to a textbox, tab, really anything --------------------------------------------------------------------------------------------------- 0.2.3.3 - 2/3/2018 --------------------------------------------------------------------------------------------------- - Added ability to have spaces in Text Expansion tokens if Space is not a trigger selected in Options --------------------------------------------------------------------------------------------------- 0.2.3.2 - 2/3/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with Text Expansion not becoming active until after Reloading/Restarting S+.net after adding an active Text Expansion - Updated Polish language translation - Added new language entry for: ClearHistory (in Find and Replace window) --------------------------------------------------------------------------------------------------- 0.2.3.1 - 2/3/2018 --------------------------------------------------------------------------------------------------- - (continued) HIGH RISK RELEASE! Not triggering auto update notification. It should be okay, but I haven't tested it a lot. The primary area of risk would be the Import/Export tab, as I made many changes in there and it's a difficult area to thoroughly test. So BACKUP your settings BEFORE using this release. - Added HTML via Clipboard to Text Expansions - Added language entry for: TextExpansionTypeHTMLViaClipboard TextExpansionTypeHTMLDescription TextExpansionNoHTMLTitle TextExpansionNoHTMLMessage --------------------------------------------------------------------------------------------------- 0.2.3.0 - 2/3/2018 --------------------------------------------------------------------------------------------------- - HIGH RISK RELEASE! Not triggering auto update notification. It should be okay, but I haven't tested it a lot. The primary area of risk would be the Import/Export tab, as I made many changes in there and it's a difficult area to thoroughly test. So BACKUP your settings BEFORE using this release. - Added Text Expansion capability. This is a simple method and not meant to be as robust as some of the programs out there which are dedicated to this purpose. But, it seems to work pretty well and should be good enough for the basic needs of most people - There is a Text Expansion tab for Global Actions and one for each Application. They work just like actions, where it will try the application first, if there's no match there, it will try Global Actions (unless the App Definition has No Global Actions checked) - So for example, I have defined SQL Server Management Studio as an application. In the Text Expansion tab for SSMS, I have several entries for common shortcuts I use all the time, like "sel" which expands to "select * from ", "lef" which expands to "left join", etc. I used to use SSMSBoost for this, but they went full commercial model and didn't leave individuals with a reasonable pricing structure. This feature at least replaces that little piece of functionality :) - Triggers are: SPACE, TAB, or ENTER (see Options > Text Expansion, one must be checked). The trigger keystroke is consumed when there is a token match - BACKSPACE will decrement (last letter) the current token, pretty much everything else resets it to empty. I did this because 99% of the time this is fine, and honestly I've used programs that were a little too diligent in examining the previous word, causing me to expand text that I did not extect/want and/or learning the ways to trick it when I knew I was about to trigger an expansion that I didn't want. - Most other non-character keys, except CAPS Lock, Num Lock, Alt, Control, Shift will always reset the token in memory. Examples: - Token is "test" - If I type "test" followed by SPACE/ENTER/TAB, "test" will be backspaced and the expansion action will occur - If I type "test", then press BACKSPACE, then type "t" again and press SPACE/ENTER/TAB, it will work the same as above - If I type "test" and press the Up arrow, followed by SPACE/ENTER/TAB, nothing will happen - If I paste "test" and press SPACE/ENTER/TAB, nothing will happen - Anytime the foreground window changes, the token is reset - Essentially, it's meant to only work when you're simply typing in the direct text you have defined for the trigger by direct and continous input, otherwise it tries to stay out of your way - For this first iteration, I've aimed to try and keep this as compatible as possible, meaning it doesn't do any fancy API calls to detect the caret position in a text box/window, send the EM_SETTEXTEX message, etc. It simply logs the characters you key in, clearing them out when various things happen to reset the token tracking, or backspaces the token entered out and performs the expansion method selected - I will investigate other methods, such as the more fancy one mentioned above, but this is a good foundation to start with. I'm hoping to refine this to be able to detect if the target control supports direct API calls, and if so use them, otherwise fall back to the brute force approach - It does do a little trick to help avoid issues with things like Chrome autocompleting the URL text. When you trigger the expansion, it sends the SPACE, then LEFT arrow, then DELETE, and finally BACKSPACES the number of characters in the token (followed by actually doing the real work you selected) - I have had some rare times where the token was backspaced, but no text was pasted. I will continue to troubleshoot and refine this functionality, but I'm thinking it has to do with the clipboard being locked or something and my code just gives up so as to not potentially cause issues - Text mode doesn't seem to work the best with carriage returns and line feeds, it ends up causing 2 new lines depending on the application. Will continue to research. - Text via Clipboard is fastest method, other than potentially using Script, depending on what you're trying to accomplish - Rich Text via Clipboard - The editor only accepts RTF from the clipboard (Paste button), so you will need to use another editor like Word, WordPad, Outlook to craft your RTF. I very much did this on purpose since RTF and the translated HTML format is a gigantic pain to deal with. If the application put an HTML format onto the clipboard, it will also be stored exactly as it is and added to the clipboard formats before sending Paste to the destination. If the destination program looks for HTML Format on the clipboard, it will find it, but it is up to the destination program on how it chooses the clipboard format, S+.net has not control over that. I'd rather store the direct data from the application's clipboard values into S+.net so you can be sure it's pasted properly when you use it. Plus, it frees me from the responsibility of keeping up with nuances in this conversion and lets the big application vendors handle any changes, etc. So S+.net should just always work right without me having to constantly fix things. - The SendKeys method is just like the sp.SendKeys function, same Microsoft syntax - If you use the Script method, it will still backspace the token before executing the script. The script can do anything you want, it doesn;t have to send any text at all. However, the script does NOT receive any kind of object for the event (like action. click., etc), so you will need to use direct methods to qualify windows/etc if you want to get crafty. - I fully expect there to be some issues with international languages/keyboard layouts, from assigning the token and having S+ properly detect it to sending the text properly. We'll work through those as we find them, hopefully it mostly works as it is now and isn't a complete shit show for other languages, lol - I also expect to run into situations where you're able to define a token using special characters, but they aren't processed/parsed properly and no expansion occurs - Microsoft Word doesn't handle receiving \r\n via SendInput, it gives you a [?] for the \n. If you use the Text via Clipboard or SendKeys method, this is not an issue. - sp_config.TextExpansionTokenLengthLimit determines how long tokens can be, for controlling saving the expansions, but also after how many characters S+ resets when no trigger key has been pressed. The default is 10, minimum is 5. - sp_config.DisableTextExpansionRestoreClipboard is false by default, set to true if you're having issues/errors. S+ tries to restore the clipboard's contents back to what it was before using the clipboard to paste the text expansion. But it doesn't always work and I've seen a lot of people posting that they have inconsistent behavior as well. I will try to research that further to see if I can come up with a reliable method - sp_config.TextExpansionClipboardRestoreDelay default is 500ms. S+ needs time to wait for clipboard to be available before it tries to restore the clipboard data. You can change this value as you wish to see what works for you (minimum is 50ms) S+ will try to restore 4 times after the TextExpansionClipboardRestoreDelay has passed, with an interval between each attempt of TextExpansionClipboardRestoreDelay / 2. If there is currently a lock (made by S+) on the clipboard, it will move on without performing this task - To err on the side of caution, there are a few try/catches throughout this process, which isn't ideal, but working with the clipboard is volatile in nature - Updated Import/Export to support Text Expansion and better organizes/labels nodes as well as performs category/item conflict detection instead of item name only - Changed disabled icon in Actions to match Text Expansion, which is a circle with a line through it. This will help differentiate actions with no gesture from disabled ones - Added TextExpansion and TextExpansionType to script engine - Added language entries for text expansion: Clear TextExpansion AddTextExpansion NewTextExpansionName TextExpansionDescription TextExpansionTokenLabel TextExpansionTypeLabel TextExpansionTypeText TextExpansionTypeTextViaClipboard TextExpansionTypeRichTextViaClipboard TextExpansionTypeTextViaReplace (not active at this time, but want it in there for different methods) TextExpansionTypeSendKeys TextExpansionTypeScript TextExpansionTypeTextDescription TextExpansionTypeTextClipDescription TextExpansionTypeRTFClipDescription TextExpansionTypeSendKeysDescription TextExpansionTypeScriptDescription TextExpansionFileFilterName TextExpansionNoRTFMessage TextExpansionNoRTFTitle tabPreferencesTextExpansionClipboardRestoreDelay tabPreferencesTextExpansionTokenLengthLimit tabPreferencesDisableTextExpansionRestoreClipboard tabPreferencesTextExpansionTriggersGroup tabPreferencesTextExpansionTriggerUseTab tabPreferencesTextExpansionTriggerUseSpace tabPreferencesTextExpansionTriggerUseEnter tabPreferencesTextExpansionClipboardLockTimeout tabPreferencesTextExpansionClipboardPasteDelay tabPreferencesTextExpansionTokenClearDelay --------------------------------------------------------------------------------------------------- 0.2.2.4 - 2/1/2018 --------------------------------------------------------------------------------------------------- - Corrected issue preventing same action name in different category - Removed display change message ("Calibrating drawing surface..."), can be enabled via the script: sp.EnableDisplayChangeMessage = true; I originally added that so you would know that S+ was temporarily disabled during display changes, but it seems like it could be more annoying than helpful. The tray icon still turns gray to let you know S+.net is not active --------------------------------------------------------------------------------------------------- 0.2.2.3 - 1/31/2018 --------------------------------------------------------------------------------------------------- - Added command line option to specify a location of your settings file (full path and file name) Example: StrokesPlus.net.exe settingsfile="C:\SomeFolder\StrokesPlus.net.bin" --------------------------------------------------------------------------------------------------- 0.2.2.2 - 1/31/2018 --------------------------------------------------------------------------------------------------- - Removed call to IsScriptValid in timer callback as that causes the script to execute, resulting in duplicate execution - Fixed issue with S+.net hanging when trying to show a DisplayText popup when one is still shown --------------------------------------------------------------------------------------------------- 0.2.2.1 - 1/31/2018 --------------------------------------------------------------------------------------------------- - Fixed another spot where naming/renaming wasn't working right --------------------------------------------------------------------------------------------------- 0.2.2.0 - 1/31/2018 --------------------------------------------------------------------------------------------------- - Updated import logic to test against existing gesture pattern matches to prevent creating two gestures with different names but similar patterns. The default logic will choose the existing match before the imported gesture, either changing the action to use the existing matched gesture or adding a new gesture if no name and pattern match exists. The matching method used manually sets the match probability to 90% to reduce false positive matches - Fixed issue with SendKeys not signaling that keyboard hook should allow its keystrokes to pass --------------------------------------------------------------------------------------------------- 0.2.1.9 - 1/30/2018 --------------------------------------------------------------------------------------------------- - Added Where extension for Enumerable lists for using LINQ, note that this is a simple bool predicate and doesn't extend other things like .Contains on a string, etc. - Example, get Paste script from Global Action (as long as it's active): var script = sp_config.GlobalApplication.Actions.Where(c => c.Active && c.Description == "Paste").First().Script; sp.MessageBox(script, "Script from Paste Global Action"); - Added OrderBy extension for Enumerable lists. The syntax does not match LINQ, you pass in a string with the property name and optionally a space followed by "desc" to sort descending - Example, get script from the first active Global Action sorted by name (Description): var script = sp_config.GlobalApplication.Actions.Where(c => c.Active).OrderBy("Description").First().Script; sp.MessageBox(script, "Script from First Active Global Action"); - Example, get script from the last active Global Action sorted descending by name (Description): var script = sp_config.GlobalApplication.Actions.Where(c => c.Active).OrderBy("Description desc").First().Script; sp.MessageBox(script, "Script from Last Active Global Action"); - OrderBy only accepts a single criteria, so you'd have to chain .OrderBy calls for multiple sorts - I'll look to continue adding these types of extensions now that the fine folks with the ClearScript project helped point me in the right direction. --------------------------------------------------------------------------------------------------- 0.2.1.8 - 1/30/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with floater not closing when Shown is unchecked (and Apply or OK is clicked) in Settings while floater already loaded - Tinkering with autocomplete, "Window." and "Control." show base list of SystemWindow methods and properties; though you may have to backspace and press the "." again if trying to invoke the list after having pressed the "." after a previous autocomplete list was shown - Removed code in autocomplete that replaced "System." with nothing, seems more confusing when there is a method with parameters of primitive and complex types --------------------------------------------------------------------------------------------------- 0.2.1.7 - 1/29/2018 --------------------------------------------------------------------------------------------------- - Minor UI tweak to Capture Modifiers label margin - Small change to DisplayText where it checks to see if it's already displayed and closes - Fixed issue with Floaters list not showing inactive icon --------------------------------------------------------------------------------------------------- 0.2.1.6 - 1/28/2018 --------------------------------------------------------------------------------------------------- - Added a simple function which upon selecting an autocomplete item from the list (when it starts with "sp.") will complete the parameter list and add a comment of the return type. This isn't the greatest solution, but it's decent for a quicker way to see the parameter list. For example, if you type "sp.Cre" and press Enter, it will result in this: sp.CreateTimer(String_name, Int32_startdelay, Int32_interval, String_script); // [System.Threading.Timer] - This gets the last method that matches, so sp.MouseClick results in the function which accepts MouseButtons instead of the string type. I did this because when I add an overload, I will add the preferred one after the first. --------------------------------------------------------------------------------------------------- 0.2.1.5 - 1/28/2018 --------------------------------------------------------------------------------------------------- - Fixed yet ANOTHER issue with naming things in lists... --------------------------------------------------------------------------------------------------- 0.2.1.4 - 1/28/2018 --------------------------------------------------------------------------------------------------- - Fixed bug with category naming and duplicate checking - Fixed select gesture window listview scroll/docked size --------------------------------------------------------------------------------------------------- 0.2.1.3 - 1/27/2018 --------------------------------------------------------------------------------------------------- - Added ability to drag and drop actions to different category - Fixed regression issue with New Action/Category not being in edit mode after being inserted - Fixed issue with docked Control/Alt/Shift floaters collapsing onto the primary floater on touch hold and move of primary floater - Fixed issue with adding new action name collision not checking only within category --------------------------------------------------------------------------------------------------- 0.2.1.2 - 1/27/2018 --------------------------------------------------------------------------------------------------- - Fixed various lists to check for existing item with same name and cancel edit on rename --------------------------------------------------------------------------------------------------- 0.2.1.1 - 1/26/2018 --------------------------------------------------------------------------------------------------- - Moved ScintillaNET project into solution so I could comment out a line preventing drag and drop text within the script editor - Changed update check to a dynamic page on the server instead of a txt file. Also now passing the current version and MAC address along with the request. Full disclosure: This is just so I can have some idea of how many people use StrokesPlus.net, and how long passes between update checks (their version vs the latest). I do nothing else with this information, plus it's not like I can do anything with a MAC address anyway (my web server gets your IP address automatically just by checking for updates). If you're concerned about this, you are free to disable update checks in Options and manually download new releases. The only time S+.net communicates is on load/reload, and only if you have update checks enabled. One of the biggest questions I had with S+ was how many people actually used it. I could look at web analytics and forum views, but those aren't really the most reliable. Of course, this method can be circumvented or disabled altogether, but it will at least give me a decent representative sample of actual users since a majority of users will just install and leave update checks enabled; but you can disable if you wish. --------------------------------------------------------------------------------------------------- 0.2.1.0 - 1/26/2018 --------------------------------------------------------------------------------------------------- - Cleaned up a few areas in settings to handle when there are no items or the last item is deleted - Updated hot key text box to be blank instead of "0" for an undefined hot key combination - Updated hot key text box to use Keys display style instead of VirtualKeyCode for consistency --------------------------------------------------------------------------------------------------- 0.2.0.26 - 1/25/2018 --------------------------------------------------------------------------------------------------- - Updated sp.MouseClick to include the following flags MOUSEEVENTF.MOVE | MOUSEEVENTF.ABSOLUTE | MOUSEEVENTF.VIRTUALDESK --------------------------------------------------------------------------------------------------- 0.2.0.25 - 1/25/2018 --------------------------------------------------------------------------------------------------- - Fixed bug in editor change when no action - Wrapped ActionList tree load in a Begin/End update for better rendering performance, and show a loading cursor while it's refreshing all gesture thumbnails and actions. At some point I need to update the code to not fully reload the tree every time something is added/removed/etc, but that's for another day... - Reorganized the loading sequence in the settings window. No visible changes except loading screen message order --------------------------------------------------------------------------------------------------- 0.2.0.24 - 1/25/2018 --------------------------------------------------------------------------------------------------- - Not triggering an automatic update due to potential risks in this release - Please make sure to back up (Import/Export > Export Settings > Select All > Export...) before you start using this version - Removed all Scintilla editors except one that is shared across all script tabs. This greatly reduces the amount of resources used and improves the loading time of the Settings screen - This is a pretty risky change which should be very carefully monitored for issues, since now the settings window has to constantly save and change the parent of the editor along with loading the appropriate script for the new area of the screen you're in. - The things to look for would be: - Either your script changes aren't save or remembered as you move around in the settings window - Your scripts are saved to the wrong action/event - Your scripts are lost on clicking OK and coming back in - The script editor isn't properly displayed when it should be, for example Before/After dropdown selection should show the editor, mouse event tab item checked should show, unchecked should hide - The Find/Replace (CTRL+F, CTRL+H) window isn't showing up, or remains visible when you move to a different script - The Find All Results panel remains visible or doesn't clear when you move to a different script - This does mean that the find results are not persisted as you change scripts, but I don't feel that's a big concern for this type of app. However, the text and selections within the Find/Replace window do persist since there's only one instance of it - This single editor window is used anywhere you're able to add/edit scripts: - Global Actions - Global Actions Before/After Scripts (Setting tab) - Global Actions Mouse Events - Global Actions Load/Unload Scripts - Application Actions - Application Before/After Scripts - Floaters - Hotkeys - If you run into any issues, simply rollback to the previous version and Import your settings: Setup: http://www.strokesplus.net/files/StrokesPlus.net_Setup_0.2.0.23.exe Portable: http://www.strokesplus.net/files/StrokesPlus.net_Portable_0.2.0.23.zip - Of course, please let me know what problems you ran into, and the steps to reproduce so I can investigate and correct - Updated code to prevent hard-coded floater Up/Down/Left/Right gesture definitions from being added multiple times - Changed update settings to lock timer execution until after script engine reintializes, to prevent timer ticks from executing during that time - Updated installer to have a progress/wait screen while waiting for StrokesPlus.net to close --------------------------------------------------------------------------------------------------- 0.2.0.23 - 1/24/2018 --------------------------------------------------------------------------------------------------- - Added internal setting to remember state of secondary floaters; whether or not secondary floaters are showing - Added sp.TouchFloaterToggleOthers() to toggle visibility of secondary floaters; same as double-clicking main S+ floater - Fixed brief loading flicker of circle shape before changing to rectangle when in Key Mode --------------------------------------------------------------------------------------------------- 0.2.0.22 - 1/24/2018 --------------------------------------------------------------------------------------------------- - Added Release script for floaters (only for press/release, not on release when dragging up/left/right/down) - Floater Press script will repeatedly fire each tick of Press Repeat Delay - Floater Release script will fire on release of press event only - Fixed a few floater bugs - Added sp.SendVKeyDown(WindowsInput.Native.VirtualKeyCode vk), ex: sp.SendVKeyDown(vk.VK_D); - Added sp.SendVKeyUp(WindowsInput.Native.VirtualKeyCode vk), ex: sp.SendVKeyUp(vk.VK_D); - Added language entry for CustomFloaterRelease. TW/CN verified, did my best to translate Polish/French based on existing entries and Google translate :) --------------------------------------------------------------------------------------------------- 0.2.0.21 - 1/23/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with adding new floater when existing "New Floater" named one already exists - Fixed issue with reloading while floaters shown - Fixed issue with floater settings sometimes not saved --------------------------------------------------------------------------------------------------- 0.2.0.20 - 1/23/2018 --------------------------------------------------------------------------------------------------- - A lot of core code changes, so this might have issues I haven't found, not trigger update notification for this release - Refactored Before/Script/After into a single script execution instead of 3 separate calls - Added SystemWindow.EnsureVisible (e.g. action.Window.EnsureVisible()) to move the window to be fully displayed within the screen it mostly occupies or the closest screen - Added check during settings screen load to ensure saved position is somewhere within virtual desktop - Added check to ensure floaters are fully visible within a screen - Added default selection for Floaters' Size dropdown to prevent error - Moved Floater_Shown event code into _Load to prevent initial placement flicker and move - Updated zh-CN, zh-TW, pl-PL languages - Changed installer to automatically unload S+.net if it's running. It uses a better method of sending the Exit command to ensure the application shuts down properly. The Restart Manager option didn't work because Windows doesn't send WM_QUERYENDSESSION/ENDSESSION to S+ since it's essentially a hidden program, this led to S+ being force killed - Changed default floater repeat distance to 20px - Added sp.ExecutePreviousScript(int index) which allows you to execute a previous action/hotkey/click/ wheeltick/etc. Essentially anything, at all, that executes gets stored in history except calls to sp.ExecutePreviousScript itself or sp.ExecuteStoredScript. This includes the Load script as well, so if you click OK in the settings window and have a load script defined, it will get stored in history. Have a floater that repeats things on press or drag? Every single fire is a history item. Scroll the mouse wheel 5 times (and you have a mouse wheel tick script defined)? Your history list is now 5 wheel tick scroll events. This is why I added the functions to store history scripts and execute them at any time. So you could perform an action in Photoshop, then perform an action to store it, and use another action to replay the script over and over. I will probably improve this later based on demand/usage, but this was the easy path, and since the only person who will probably be using it is just in one program while using this, it will probably never be an issue :P But I have to document the details, for you all and myself later! Only the 5 most history entries are saved, most recent at index 0 (zero): sp.ExecutePreviousScript(0); //Previous script sp.ExecutePreviousScript(1); //Script before the previous script (etc.) sp.ExecutePreviousScript(4); //Last script saved in history IMPORTANT: To prevent any kind of recursion or locking, as well as to ensure both engines aren't being used at the same time for this call, the engine looks for the existence of "sp.Execute" in the script, if it exists, it will ONLY execute that function (and only first match of it). Even if it is commented out (I ran into that the hard way during testing, lol). NO other code in the script will be executed at all. So only use this function by itself. It's a complicated logical scenario and this is the only safe way I can think of to handle this without having to recode a ton of things or make the code unnecessarily complicated for this one purpose IMPORTANT #2: Everything about the prevous execution is stored and replayed, not just the script itself, but the action, click, and/or wheel variables and their values. This is the only realistic way to ensure that the script will not fail by trying to access a property which now doesn't apply in the context of the call to sp.ExecutePreviousScript. For example, if you execute an action with action.Window.Maximize() while in Chrome, the history will store the entire object data. Meaning, if you changed to Notepad and called sp.ExecutePreviousScript(0), it would attempt to maximize Chrome, since that's what was stored in action.Window at the time the script was executed. To avoid this, your scripts would need to explicitly reference the items/window with which you want to interact. For example if the maximize script was instead sp.ForegroundWindow.Maximize(), when you called it again via sp.ExecutePreviousScript, it would always maximize the foreground window. History scripts are saved AFTER the script is finished executing - Added HistoryScript type to script engine class HistoryScript { ActionVars action; //null or the value (see: http://www.strokesplus.net/ScriptClassesEnums.txt) WheelTick wheel; //null or the value (see: http://www.strokesplus.net/ScriptClassesEnums.txt) Click click; //null or the value (see: http://www.strokesplus.net/ScriptClassesEnums.txt) string script; //The actual script } - Added sp.GetHistoryScript(int index) which returns a HistoryScript object which generally would be passed into sp.StoreHistoryScript to storing the script for use with sp.ExecuteStoredScript(name) - Added sp.StoreHistoryScript(string name, HistoryScript value) - Added sp.DeleteStoredHistoryScript(string name) - Added sp.GetStoredHistoryScript(string name) returns HistoryScript object - All stored history scripts are cleared when you reload S+ - Added sp.ExecuteStoredScript(string name) - This operates under the same kind rules as sp.ExecutePreviousScript where it is not store in history, and only that piece of code will be executed, and only the first match So you would use this like a memory function on a calculator: (Action 1) Store Last Script: sp.StoreHistoryScript("ScriptIWantToRepeat", sp.GetHistoryScript(0)); (Action 2) Play Stored Script: sp.ExecuteStoredScript("ScriptIWantToRepeat") Obviously you can get more elaborate than that... - I'd also like to point out that you can also store a script via sp.StoreString("name", "script here") and call: eval(sp.GetStoredString("name")); to run the script. Note that in the context of that eval execution, things like action, wheel, and click aren't in scope (at least I don't think so...), so you'd need to reference things directly (e.g. sp.ForegroundWindow.Maximize(); instead of action.Window.Maximize(); ). You can do some crafty things with javascript functions to be able to eval in context, if you really want to. --------------------------------------------------------------------------------------------------- 0.2.0.19 - 1/22/2018 --------------------------------------------------------------------------------------------------- - Still not trigger update notification, as this all needs a lot of further testing - Fixed issue with gesture naming - Fixed issue with window not being activated on gesture fire when option enabled - Tons of touch related stuff yet again - Added Touch tab to Options - Added Floaters section in settings for creating custom floaters - Added CustomFloaterSetting type to script engine - Added sp.TouchFloatersReset() - CustomFloaters can only be moved via the Move menu item, since they can repeat on press/click and hold - Added Language entries: LoadingSettingsFloaters SettingsToolbarCustomFloaters tabPreferencesTabTouch TrayMenuToggleFloater TrayMenuResetFloaters TouchFloaterMenuChangeSize TouchFloaterMenuChangeSize32 TouchFloaterMenuChangeSize48 TouchFloaterMenuChangeSize64 TouchFloaterMenuChangeSize96 TouchFloaterMenuChangeSize164 TouchFloaterMenuChangeSize328 TouchFloaterMenuMove TouchFloaterMenuKeyMode TouchFloaterMenuDocked TouchFloaterMenuLoadCustomFloater TouchFloaterMenuChangeFloater TouchFloaterMenuResetFloaters TouchFloaterMenuResetFloater TouchFloaterMenuCloseFloater TouchFloaterMenuCloseMenu CustomFloaterAdd CustomFloaterNewName CustomFloaterToggleShown CustomFloaterSize CustomFloaterPress CustomFloaterUp CustomFloaterDown CustomFloaterLeft CustomFloaterRight CustomFloaterRepeatDelay CustomFloaterRepeatDistance CustomFloaterShown CustomFloaterFileFilterName tabPreferencesTouchFloaterFadeMs tabPreferencesTouchFloaterMaxAlpha tabPreferencesTouchFloaterMinAlpha tabPreferencesTouchFloaterTapInterval tabPreferencesTouchFloaterTapsForMenu tabPreferencesTouchFloaterAutoShowHideInTabletMode tabPreferencesTouchFloaterDisableMouseCaptureFloaterActive tabPreferencesTouchDisableAltFloater tabPreferencesTouchDisableControlFloater tabPreferencesTouchDisableShiftFloater tabPreferencesTabTouch --------------------------------------------------------------------------------------------------- 0.2.0.18 - 1/20/2018 --------------------------------------------------------------------------------------------------- - Again, not triggering the new update notification for this release due to substantial changes and need for further testing - Added Move menu item for non-docked floaters (disable Docked to show Move menu item) - Added code to recognize state of which floater started the gesture - Various touch bug fixes - Fixed issue with floater reset not changing image from KeyMode back to circle --------------------------------------------------------------------------------------------------- 0.2.0.17 - 1/20/2018 --------------------------------------------------------------------------------------------------- - Again, not triggering the new update notification for this release due to substantial changes - Touch related strings have not been converted to use language settings yet - Updated touch floater alpha and fade delay settings to be read in realtime - Fixed a couple conditions which resulted in the hint popoup not being shown - Lots of touch related stuff, too much to really list - Added support for WM_TOUCH (Windows 7), though I do not have a Win 7 touch enabled device, so I have no idea if it will work at all - Changes to previous ways of interacting with touch floaters - Double-click to lock non-primary floaters - Double-click main floater to show/hide other floaters - Triple-click to show menu (all floaters), this can be changed via sp_config.TouchFloaterTapsForMenu (must be at least 3) - Control/Alt/Shift floaters can be set to key mode, where they aren't used to draw from, but to act as virtual keys to simulate pressing or holding Alt/Control/Shift. Double-click Control/Alt/Shift to lock, so it will be as if you're holding down the key until single click to unlock - Floaters in Key Mode cannot be moved, you have to turn off Key Mode, then long-press hold and drag to move, then triple-click / right-click to bring up menu and set back to Key Mode - Docked floaters will move in relation to the primary floater - Resetting floater(s) will clear saved position, set them back to Docked, move them back to their default location next to the main floater, and turn Key Mode off - Individual floaters can be closed, though this state will not be remembered next time the main floater is shown - Closing the main floater will close all floaters - Each floater can bet set to (and remembers) its own size, however, if the non-main floaters are not currently being displayed, their size will change to match the size of the main floater --------------------------------------------------------------------------------------------------- 0.2.0.16 - 1/18/2018 --------------------------------------------------------------------------------------------------- - Moved touch floater visible control into disabled icon check to centralize across all events which disable S+ - Added logic to properly handle hiding and showing touch floater based on if S+ is enabled/disabled - Corrected some conflicts with touch and mouse events within touch floater --------------------------------------------------------------------------------------------------- 0.2.0.15 - 1/18/2018 --------------------------------------------------------------------------------------------------- - IMPORTANT: This release required several changes to code within the normal StrokesPlus.net mouse functions, so it's possible this release may introduce bugs in the normal operation that I have not yet found. Use at your own risk! - Because of this, I'm not triggering an automatic update notification for this release - Added a test feature of the touch screen floating hot spot - Call sp.TouchFloaterToggle() to show/hide (hidden by default and when S+ starts for now) - Will be positioned approximately in the center of the screen, with an alpha of 30 - Press and hold for Cancel Delay duration to move the floater - If floater is large enough, it can be instantly dragged with two fingers on floater, I tried my best, but I cannot get touch contacts if they occur outside of the floater even if the first contact is within the floater...even though the docs state I should..will continue research - Start a gesture by touching the floater and drawing (Cancel Delay respected) - Using mouse, press and hold left button for Cancel Delay duration to move the floater, left double-click to cycle through sizes - Using mouse, right-click brings up menu to cycle sizes and exit (close) the floater - Holding Ignore Key will hide the floater until released - Using Wacom Intuos tablet, draw same as finger or mouse, but no way to move floater for me since long press triggers a right-click down event on press and hold - You cannot use the normal mouse stroke buttons to start a gesture on the floater itself, it acts like an ignored window. If your strokes button is the Left button, then you will not be able to interact with the floater using the mouse other than the right-click menu - Keep in mind that all of this functionality/options/restrictions are a work in progress and have not been finalized at this time - Added sp.TouchFloaterHide(), sp.TouchFloaterShow(), sp.TouchFloaterIsShown() [bool], and sp.TouchFloaterToggle() [switches between shown/hidden, based on current state] - Added sp_config.DisableMouseCaptureWhenFloaterActive, if true then mouse capture will not be active if the floater is visible; if false you can use the floater or the mouse like normal for gesture recogition (though touch and mouse gestures cannot occur simultaneously, nor can you start a gesture via the normal stroke buttons on the floater itself) - Added sp_config.TouchFloaterFadeMilliseconds, controls how long the fade transition takes when the floater is becoming active or inactive (must be > 0, default is 150) - Added sp_config.TouchFloaterMinAlpha, controls how transparent the floater is when not active (1 - 255: 1 = pretty much invisible, 255 = solid/opaque, default is 30) - Added sp_config.TouchFloaterMaxAlpha, controls how opaque the floater is when active (1 - 255: 1 = pretty much invisible, 255 = solid/opaque, default is 255) - The 3 settings above *should* be persisted when you open StrokesPlus.net, though the floater will need to be manually shown again while this is still being tested. You can put the code in your Load script (sp.TouchFloaterToggle();) if you want it to always show for now. There will be updates to the Options tab once this has been tested and updated with further functionality, now the purpose is just to see how the basic functionality works --------------------------------------------------------------------------------------------------- 0.2.0.14 - 1/16/2018 --------------------------------------------------------------------------------------------------- - Updated zh-TW and zh-CN language translations --------------------------------------------------------------------------------------------------- 0.2.0.13 - 1/16/2018 --------------------------------------------------------------------------------------------------- - Added functions to remove previously stored value from memory, set via sp.Store*: sp.DeleteStoredBool(name) sp.DeleteStoredHandle(name) sp.DeleteStoredNumber(name) sp.DeleteStoredPoint(name) sp.DeleteStoredRectangle(name) sp.DeleteStoredString(name) - Fixed logic issue with SystemWindow.MoveToPreviousScreen() and SystemWindow.MoveToNextScreen() - Updated SystemWindow.MoveToPreviousScreen() MoveToNextScreen(), and MoveToScreen() to return the target screen (as .NET type System.Windows.Forms.Screen) to which the window was sent - Updated SystemWindow.MoveToPreviousScreen(), MoveToNextScreen(), and MoveToScreen() to restore the window first if maximized, then maximize after moving it. It had only changed the restored location if the window was maximized, but didn't cause the window to move to the other screen --------------------------------------------------------------------------------------------------- 0.2.0.12 - 1/15/2018 --------------------------------------------------------------------------------------------------- - Added a few timer functions: sp.CreateTimer(string name, int startdelay, int interval, string script) (returns System.Threading.Timer) sp.GetTimer(string name) (returns System.Threading.Timer) sp.GetTimerScript(string name) sp.DeleteTimer(string name) These can be used to have a script execute initially after the startdelay value (in milliseconds), then regularly based on "interval" parameter (in milliseconds) until you stop or change the timer. These timers will use the same script engines as actions, but will only use them during execution, instead of having an engine locked as would be the case if you had a long running action or one that was in a loop while waiting for something to happen. Using a timer allows you to have situational one-time events where you call sp.DeleteTimer("name") within the timer's script itself once the condition has been met; or have a timer that simply executes a script over and over until stopped. Unless you're using a very short script, it would probably be better to define a function in the On Load Script tab under Global Actions > Load/Unload Scripts and call it in the script parameter. e.g. sp.CreateTimer("test", 1000, 5000, "testFunction();"); Note that much like the values saved via the sp.Store* functions, all timers are stopped and deleted when you reload S+.net, from tray menu or via sp.Reload() --------------------------------------------------------------------------------------------------- 0.2.0.11 - 1/15/2018 --------------------------------------------------------------------------------------------------- - Compiled with the optimize flag, hopefully there are no negative effects. I did that in S+ and it would crash, so when I started S+.net I left it unchecked...but everything I've read says to basically leave it checked, so we'll see! I do see that some function chains have now been inlined, which is what I was aiming for in the additions below anyway, which is good. Less function switching during drawing, gesture recoginition, and general matching is good! - Added [MethodImpl(MethodImplOptions.AggressiveInlining)] to the gesture recognition functions, I must have missed those early on. It may not make an actual difference, but there doesn't appear to be any reduction in performance or issues in my testing so far. - Releasing this without any other changes to ensure if there are issues, they're absolutely related to these modifications only --------------------------------------------------------------------------------------------------- 0.2.0.10 - 1/15/2018 --------------------------------------------------------------------------------------------------- - Added code to accept WM_QUERYENDSESSION & WM_ENDSESSION messages from Windows, will save current settings and unload StrokesPlus.net, respectively - Using the above, updated program to gracefully handle exiting when installing an updated version, even if the StrokesPlus.net Settings window is currently open. It should be noted that any pending changes you've made while in the Settings window will be saved when S+.net shuts down, as if you clicked Apply or OK. This is the safest route to ensure people don't lose any unsaved changes, so if you're testing dramatic changes within the Settings window that you don't want saved, simply wait until after you've committed your settings (closed the Settings window) before installing a StrokesPlus.net update --------------------------------------------------------------------------------------------------- 0.2.0.9 - 1/15/2018 --------------------------------------------------------------------------------------------------- - Added sp.DesktopWindowListView() which returns a SystemWindow of the actual ListView for the desktop sp.DesktopWindow is not what you'd expect, as it gets the window that covers the entire desktop, not the "Desktop" where you see your icons; that is the ListView returned by this new function. Technically, it's due to changes made in Win 7 and with composition disabled, it would be the actual desktop...it's a hot mess, I tell ya! - Fixed a couple typos in the default configuration settings file (probably are others...) --------------------------------------------------------------------------------------------------- 0.2.0.8 - 1/14/2018 --------------------------------------------------------------------------------------------------- - Updated default actions/apps for new installs Download the full export file if you'd like to see what's in there, but make sure to backup/export your existing settings first! http://www.strokesplus.net/files/Default.spexport --------------------------------------------------------------------------------------------------- 0.2.0.7 - 1/14/2018 --------------------------------------------------------------------------------------------------- - Added option during uninstall to delete settings file permanently - Added sp.WindowFromHandle(IntPtr hWnd) - Added check to ensure window exists at start point --------------------------------------------------------------------------------------------------- 0.2.0.6 - 1/14/2018 --------------------------------------------------------------------------------------------------- - Added some missing locks around Hint gesture points collection modifications to hopefully prevent an intermittent crash - Added check to ensure MatchedApplication is not null in ActionMatched function - Corrected issue with installer not downloading the .NET and/or VC++ runtimes during install --------------------------------------------------------------------------------------------------- 0.2.0.5 - 1/14/2018 --------------------------------------------------------------------------------------------------- - Fixed crash when changing display settings (or anything where Windows sends out the display changed message). This issue was introduced in 0.2.0.1 when I forgot to remove a line of code after the touch integration testing I was working on --------------------------------------------------------------------------------------------------- 0.2.0.4 - 1/13/2018 --------------------------------------------------------------------------------------------------- - Shrink memory working set after Settings window is closed - Added supportedOS tags in app.manifest for Win 7 and Win 8 (8.1 and 10 were already there) - Created group frames for Gesture, Modifiers, and Region in Action Editor - Several flow panel and auto layout UI tweaks for Action Editor control - Changed way settings main panel area loads; all loaded and toggle visible flag instead to improve responsiveness after layout changes --------------------------------------------------------------------------------------------------- 0.2.0.3 - 1/13/2018 --------------------------------------------------------------------------------------------------- - Fixed nasty memory leak - Updated Portable build configuration removing "Prefer 32-bit" option --------------------------------------------------------------------------------------------------- 0.2.0.2 - 1/12/2018 --------------------------------------------------------------------------------------------------- - Added overload for sp.MouseClick where btn parameter accepts MouseButtons enum (e.g. MouseButtons.Right) instead of a string ("Right"). Previous version should still work. - Fixed issue in keyboard hook which would cause the modifer After capture variable to be true during key repeat (long holds) when the modifier was already captured as a Before event. This caused an action where Capture Modifiers: Before would only work if you pressed the modifier and quickly clicked the stroke button. If you held the Shift key, for example, long enough that Windows started repeating the Shift key down messages, it would set the Shift key as down both as Before and After, which would result in your Before action not being recognized --------------------------------------------------------------------------------------------------- 0.2.0.1 - 1/12/2018 --------------------------------------------------------------------------------------------------- - Updated TW and CN languages - Corrected layout issues in Global > Load/Unload script tabs - Added some code relating to touch integration, but nothing functional or enabled --------------------------------------------------------------------------------------------------- 0.2.0.0 - 1/11/2018 --------------------------------------------------------------------------------------------------- - Updating version build to 0.2.0.0 since it's fairly stable and functional at this point. I'm going to slow things down for a bit and let it run in the wild while I work on other things; some StrokesPlus.net stuff and some not. But language additions/updates and bugs will be addressed immediately along with any script engine needs which cannot be handled via .NET script code. I'll still be in Discord daily, so feel free to hop in if you need help or have suggestions! - Fixed issue with some keystrokes not reaching the script editor, so I've removed the CTRL+Tab option to move focus away from editor. I've replaced it with CTRL+T which moves focus to Apply button - Updated script editor logic to fully qualify key combinations - Fixed issue with S+ getting stuck in ignore mode when ignore key is Control and you press CTRL+S in the script editor (to Apply the script/settings) - Updated French language - Fixed typo in English language file (lol) --------------------------------------------------------------------------------------------------- 0.1.0.38 - 1/11/2018 --------------------------------------------------------------------------------------------------- - Added following types to script engine: IntPtr nint (.NET int to avoid javascript name collision) Int32 Int64 UIntPtr uint UInt32 UInt64 nlong (.NET long to avoid javascript name collision) ulong nfloat (.NET float to avoid javascript name collision) --------------------------------------------------------------------------------------------------- 0.1.0.37 - 1/11/2018 --------------------------------------------------------------------------------------------------- - Added Simplified Chinese (zh-CN) langauge - Added language entries for: Modifiers (already translated) --------------------------------------------------------------------------------------------------- 0.1.0.36 - 1/10/2018 --------------------------------------------------------------------------------------------------- - Changed sp.GetRegions(Rectangle rect, int columns, int rows) to return array instead of list - Small tweak to MouseRestrict logic to eliminate mouse jitter along edge of rect - Changed build process to support publishing a portable version as well --------------------------------------------------------------------------------------------------- 0.1.0.35 - 1/10/2018 --------------------------------------------------------------------------------------------------- - Corrected some improperly ported code in mouse hook for passing/detecting dwExtraInfo when S+ is originator of event - Added sp.MouseRestrictToRectangle(Rectangle) which traps the mouse inside the specified rectangle (rectangle must exist somewhere on the screen(s) and be at least 50px wide and 50px high) - Added sp.MouseRestrictClear() to clear the current mouse movement restriction - Added sp.MouseRestrictActive() to detect if mouse restriction is active (from a previous call to MouseRestrictToRectangle) - Updated Polish language translations - Updated Find/Replace window layout to better accommodate translations --------------------------------------------------------------------------------------------------- 0.1.0.34 - 1/10/2018 --------------------------------------------------------------------------------------------------- - Added CTRL+S to click Apply when in script editor --------------------------------------------------------------------------------------------------- 0.1.0.33 - 1/9/2018 --------------------------------------------------------------------------------------------------- - Moved Find/Replace project into solution to support languages - Updated About screen to use flow layout panels - Added ShowAtMouseCursor to InputBoxInfo to show window at mouse location - Added code to recognize Ctrl+Tab in ScintillaNET editor to change focus out of the editor - Added a WHOLE lot of language entries which start with: FindReplace(*) --------------------------------------------------------------------------------------------------- 0.1.0.32 - 1/9/2018 --------------------------------------------------------------------------------------------------- - Created own context menu (right-click) for the script editor, to allow language support - Added language entries for: Cut Undo Redo SelectAll (no need to translate, I used the text in ImportExportSelectAllLabel) --------------------------------------------------------------------------------------------------- 0.1.0.31 - 1/9/2018 --------------------------------------------------------------------------------------------------- - Removed String as a root object in the script engine since it was overriding the JavaScript String --------------------------------------------------------------------------------------------------- 0.1.0.30 - 1/8/2018 --------------------------------------------------------------------------------------------------- - Added hidden option for GlobalActionRegionsUseAppRect to evaluate how well it works - This is only able to be set via script: sp_config.GlobalActionRegionsUseAppRect = true; - Initial tests already show inconsistent behavior, but leaving for others to test/use --------------------------------------------------------------------------------------------------- 0.1.0.29 - 1/8/2018 --------------------------------------------------------------------------------------------------- - Changed Gesture link to use name of gesture, or "(none)" if no gesture selected - Updated French language for secondary stroke button to be shorter - Moved icons out of Resources.resx as some translations were missing them when coming back back to me - Corrected issue with actions using regions to incorrectly identify as conflicted - Added RectangleF type to script engine - Added RectangleF property to SystemWindow - Added RECT property to SystemWindow (returns WinAPI RECT) - Changed Rectangle property of SystemWindow to return .net Rectangle type instead of WinAPI RECT - Added RectRegion type to script engine - Added sp.GetRegions(Rectangle rect, int columns, int rows) function to script engine - Added sp.GetRegionFromPoint(Rectangle rectangle, Point point, int columns, int rows) function to script engine - Added language entry for: ActionDefaultGestureLinkText (no need to translate for French/Polish/Chinese-TW, I used value from TrayMenuUseNone) --------------------------------------------------------------------------------------------------- 0.1.0.28 - 1/8/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with action matching logic for Before and After modifier capture checks - Updated InputBox to use OK and Cancel from laguage resource file - Added Sort property to InputBoxInfo to enable alphabetical sorting in list - Corrected a few layout issues - Updated Traditional Chinese - Taiwan translations - Updated the Change Culture action included in the language Resources.zip --------------------------------------------------------------------------------------------------- 0.1.0.27 - 1/7/2018 --------------------------------------------------------------------------------------------------- - Updated layout to fit French translations - Increased width of loading window - Added Traditional Chinese - Taiwan language --------------------------------------------------------------------------------------------------- 0.1.0.26 - 1/7/2018 --------------------------------------------------------------------------------------------------- - Fixed issue with gesture training/name window being in front of the drop down control - Added sp.GetCurrentCulture (ex return: "en-US"), sp.ChangeCulture (ex: sp.ChangeCulture("pl-PL") //change to Polish) - Added option for the hint popup to show where the cursor is located (follows cursor) - Reduced sleep to 2 ms during ScriptEngine.GetAvailableEngine() when all engines in use - Reduced hint timer to 5 ms ticks for smoother display when following cursor - Corrected additional area for hint global app name to use translation resource - Updated sp.GetStored* functions to always return a value (0, IntPtr.Zero, Point(0,0), "", false) if not found - Added locking within Store*/GetStored* functions to avoid collection changes during high volume activity - Added sp.StoreBool and sp.GetStoredBool - Added French translation - Added language entry for: tabPreferencesHintLocationCursor --------------------------------------------------------------------------------------------------- 0.1.0.25 - 1/6/2018 --------------------------------------------------------------------------------------------------- - Changed Downloading window to a balloon/toast window - Put update download process on its own thread so you can use S+.net while it's downloading --------------------------------------------------------------------------------------------------- 0.1.0.24 - 1/6/2018 --------------------------------------------------------------------------------------------------- - Added option to disable update check - Added language entry for: tabPreferencesDisableUpdateCheck --------------------------------------------------------------------------------------------------- 0.1.0.23 - 1/6/2018 --------------------------------------------------------------------------------------------------- - Set left panel minimum width in Applications to ensure toolbar all icons visible - Added option to installer to select if StrokesPlus.net should start with Windows - Added prompt to close StrokesPlus.net.exe if running when uninstalling - Corrected language display in hint form for "Global" to use "Global Actions" resource entry - Cleaned up and crentalized loading screen code - Added update check - Added language entries for: ExportFileFilterName ActionFileFilterName UpdateCheckPromptMessage UpdateCheckPromptTitle UpdateCheckRunErrorMessage UpdateCheckRunErrorTitle Downloading --------------------------------------------------------------------------------------------------- 0.1.0.22 - 1/5/2018 --------------------------------------------------------------------------------------------------- - Added code to detect if Win 7 (for Touch, which won't be supported for Win 7 even if present due to drastic changes made with Win 8) - Added code to detect if Pen and/or Touch is available - Updated installer to prompt to close StrokesPlus.net if running, and the option to run when install complete - Updated installer to download .NET 4.6.2 and/or MS VC++ 2015 runtime if needed - Updated installer to check for minimum Windows 7 SP1 - Added code to handle errors loading/finding settings (StrokesPlus.net.bin) - Added default setting profile as embedded resource to be used in the event no settings file can be found or loaded - Added related language entries: LoadSettingsErrorMessage LoadSettingsErrorTitle LoadSettingsDefaultFileErrorMessage LoadSettingsDefaultFileErrorTitle --------------------------------------------------------------------------------------------------- 0.1.0.21 - 1/4/2018 --------------------------------------------------------------------------------------------------- - Removed event handler for SystemEvents.UserPreferenceChanged - Detach event handler from SystemEvents.DisplaySettingsChanged on exit - Added logic to be able to detect the source of the stroke button (Mouse/Touch/Pen) - Once support for Touch and Pen are added, the mouse hook will ignore the messages, letting the new code handle - Added some checks to DisplayText for nulls - Changed app definition matching to ignore case - Changed Regex calls to include RegexOptions.IgnoreCase --------------------------------------------------------------------------------------------------- 0.1.0.20 - 1/3/2018 --------------------------------------------------------------------------------------------------- - Updated Loading window to use Loading string from resource file instead of "frmLoading" - Added check for Shcore.dll on load, if not present, skip monitor DPI check - Added check for DwmIsCompositionEnabled in frmHint and frmDisplayText, if not available, form is opaque - Support for Windows 7 SP1 --------------------------------------------------------------------------------------------------- 0.1.0.19 - 1/3/2018 --------------------------------------------------------------------------------------------------- - Changed to UIAccess = true and created installer - This will set S+ to run at Windows start and have access to elevated programs - Added extra logic in DisplayChange function to hopefully prevent odd scenario --------------------------------------------------------------------------------------------------- 0.1.0.18 - 1/3/2018 --------------------------------------------------------------------------------------------------- - Added new style of checking for MS VC++ 2015 runtime by calling LoadLibrary - Removed VC2013 entries from Resources.resx, only VC2015 are needed - Changed Hotkey class to use WindowsInput.Native.VirtualKeyCode - Removed VirtualKeyShort from script engine - When adding a new Action/Category/Application/Ignored Window/Hot Key the item will be in edit (rename) mode --------------------------------------------------------------------------------------------------- 0.1.0.17 - 1/1/2018 --------------------------------------------------------------------------------------------------- - Added DisableDisplayMismatchMessage field to import/export code - Corrected display element size for more Polish translations - Added code to exit S+ if script engines fail to initialize - Removed PDB files from download --------------------------------------------------------------------------------------------------- 0.1.0.16 - 1/1/2018 --------------------------------------------------------------------------------------------------- - Another adjustment to control size for text display length - Updated ClearScript and V8 engine - Added ClearScript/V8 files to folder - Added try/catch in init of V8 engines with message from error - Moved SystemWindow.cs to base folder - Removed check for VC++ runtimes - Removed Runtime folder from download - Added text for V8 loading error message boxes to Resources for translation --------------------------------------------------------------------------------------------------- 0.1.0.15 - 12/30/2017 --------------------------------------------------------------------------------------------------- - Added dialog for selection of trace items (only when compiled with TRACE) - This window doesn't support languages since this would only be for advanced users - You would never see this unless there was an odd issue and I needed to release a TRACE compiled version for someone to log the events for troubleshooting purposes - Added Polish translation - Set to DPI aware to prevent issues with scaling and the gesture line not drawing in the right place. - Added check and message about multiple screens at different DPI settings (not recommended for S+) - Updated size of a few controls to address text cut off issue in Polish translation --------------------------------------------------------------------------------------------------- 0.1.0.14 - 12/29/2017 --------------------------------------------------------------------------------------------------- - Corrected logic in mouse wheel detection between vertical and horizontal when firing wheel scripts - Fixed issue with relaying horizontal wheel as vertical --------------------------------------------------------------------------------------------------- 0.1.0.13 - 12/29/2017 --------------------------------------------------------------------------------------------------- - Changed dwExtraInfo check to cast to long instead of ToInt32 to addess overflow on touch screen finger tap --------------------------------------------------------------------------------------------------- 0.1.0.12 - 12/28/2017 --------------------------------------------------------------------------------------------------- - Finally figured out what was causing the loading window to not always be topmost - Added loading window display/text for change of system settings/display change to inform the user that S+ is recalibrating the drawing surface - Disabled most tray menu items when Settings window is open, as it could lead to unexpected results --------------------------------------------------------------------------------------------------- 0.1.0.11 - 12/28/2017 --------------------------------------------------------------------------------------------------- - Couple tweaks to loading screen code to (hopefully) ensure consistent display - Added updates to loading text at each stage of loading - Added check for S+.net already running - Fixed issue with clicking Reload from tray leaving S+ not capturing mouse/keyboard/win events --------------------------------------------------------------------------------------------------- 0.1.0.10 - 12/28/2017 --------------------------------------------------------------------------------------------------- - Added Find/Replace to Scripts editors - CTRL+F - Open Find - CTRL+H - Open Replace - F3 - Find Next - SHIFT+F3 - Find Previous - Added loading splash screen during start and opening settings screen --------------------------------------------------------------------------------------------------- 0.1.0.9 - 12/27/2017 --------------------------------------------------------------------------------------------------- - Fixed issue with export App (from Applications screen) export if selecting to import file from Import/Export screen --------------------------------------------------------------------------------------------------- 0.1.0.8 - 12/27/2017 --------------------------------------------------------------------------------------------------- - Added support for CTRL+C and CTRL+V in Action tree - Added support for Copy/Paste/Import/Export of app in Applications screen - Added inactive flag icons for Apps/Ignored/Hot keys - Added conflict icons for Apps/Ignored windows - Added inactive coloring for Action tree nodes - Added red tree node text for Action conflicts within same app (or global) - Fixed issue with Capture Modifiers drop down not saving correctly under certain circumstances --------------------------------------------------------------------------------------------------- 0.1.0.7 - 12/26/2017 --------------------------------------------------------------------------------------------------- - Updated root node checked state on Import tab - Removed call to collapse nodes on uncheck in Import/Export...seemed annoying - Check all children on check in Import/Export - Uncheck parent when no more children are checked in Import/Export - Essentially, a whole bunch of stuff relating the checking/unchecking of stuff in the Import/Export screen! - Added Copy/Paste for Actions. Note that Category is not preserved, it's pasted into the selected category --------------------------------------------------------------------------------------------------- 0.1.0.6 - 12/25/2017 --------------------------------------------------------------------------------------------------- - Corrected issue where renaming a gesture didn't update the gesture name for any actions using it --------------------------------------------------------------------------------------------------- 0.1.0.5 - 12/25/2017 --------------------------------------------------------------------------------------------------- - Added App Definition as an option during import/export - Changed Gesture label in Action Editor to a link to better communicate how to select the gesture --------------------------------------------------------------------------------------------------- 0.1.0.4 - 12/24/2017 --------------------------------------------------------------------------------------------------- - Fixed issue with error after renaming action without reloading actions tree - Added F2 and Delete key detection to lists/action tree --------------------------------------------------------------------------------------------------- 0.1.0.3 - 12/24/2017 --------------------------------------------------------------------------------------------------- - Changed ActionFunctions methods to always return arrays instead of Lists --------------------------------------------------------------------------------------------------- 0.1.0.2 - 12/23/2017 --------------------------------------------------------------------------------------------------- - Changed mouse click, wheel, and move method names, removing "FromPoint"