From c5f6f825c06f7f7c2926ef0131e27456492e9f2d Mon Sep 17 00:00:00 2001 From: Marcel Houweling Date: Wed, 6 Apr 2022 18:30:07 +0200 Subject: [PATCH] update to .net framework 4.8 add multi-action button (see readme.md) --- .../WindowsInput/IKeyboardSimulator.cs | 12 +- .../WindowsInput/KeyboardSimulator.cs | 20 +- .../WindowsInput/WindowsInput.csproj | 2 +- README.md | 14 +- starcitizen/App.config | 6 +- starcitizen/Buttons/Macro.cs | 159 ++++++++ starcitizen/Buttons/StarCitizenBase.cs | 56 ++- starcitizen/Program.cs | 6 + starcitizen/Properties/AssemblyInfo.cs | 4 +- .../PropertyInspector/StarCitizen/Macro.html | 352 ++++++++++++++++++ starcitizen/SC/DProfileReader.cs | 72 ++++ starcitizen/macrotemplate.html | 43 +++ starcitizen/manifest.json | 17 +- starcitizen/packages.config | 10 +- starcitizen/starcitizen.csproj | 28 +- 15 files changed, 751 insertions(+), 50 deletions(-) create mode 100644 starcitizen/Buttons/Macro.cs create mode 100644 starcitizen/PropertyInspector/StarCitizen/Macro.html create mode 100644 starcitizen/macrotemplate.html diff --git a/InputSimulatorPlus/WindowsInput/IKeyboardSimulator.cs b/InputSimulatorPlus/WindowsInput/IKeyboardSimulator.cs index a8a2e00..19b6d2d 100644 --- a/InputSimulatorPlus/WindowsInput/IKeyboardSimulator.cs +++ b/InputSimulatorPlus/WindowsInput/IKeyboardSimulator.cs @@ -110,15 +110,13 @@ public interface IKeyboardSimulator /// Calls the Win32 SendInput method with a KeyUp message /// /// The to press - /// Delay in ms between keydown and keyup of final keyCode. - IKeyboardSimulator DelayedKeyPressUp(DirectInputKeyCode dikCode, int delay); + IKeyboardSimulator DelayedKeyPressUp(DirectInputKeyCode dikCode); /// /// Calls the Win32 SendInput method with a KeyDown message /// /// The to press - /// Delay in ms between keydown and keyup of final keyCode. - IKeyboardSimulator DelayedKeyPressDown(DirectInputKeyCode dikCode, int delay); + IKeyboardSimulator DelayedKeyPressDown(DirectInputKeyCode dikCode); /// @@ -152,8 +150,7 @@ public interface IKeyboardSimulator /// /// The list of modifier keys /// The key to simulate - /// Delay in ms between keydown and keyup of final keyCode. - IKeyboardSimulator DelayedModifiedKeyStrokeDown(IEnumerable modifierDikCodes, DirectInputKeyCode dikCode, int delay); + IKeyboardSimulator ModifiedKeyStrokeDown(IEnumerable modifierDikCodes, DirectInputKeyCode dikCode); /// @@ -162,8 +159,7 @@ public interface IKeyboardSimulator /// /// The list of modifier keys /// The key to simulate - /// Delay in ms between keydown and keyup of final keyCode. - IKeyboardSimulator DelayedModifiedKeyStrokeUp(IEnumerable modifierDikCodes, DirectInputKeyCode dikCode, int delay); + IKeyboardSimulator ModifiedKeyStrokeUp(IEnumerable modifierDikCodes, DirectInputKeyCode dikCode); /// /// Simulates a modified keystroke where there is one modifier and multiple keys like CTRL-K-C where CTRL is the modifierKey and K and C are the keys. diff --git a/InputSimulatorPlus/WindowsInput/KeyboardSimulator.cs b/InputSimulatorPlus/WindowsInput/KeyboardSimulator.cs index f5ca121..d0f9f36 100644 --- a/InputSimulatorPlus/WindowsInput/KeyboardSimulator.cs +++ b/InputSimulatorPlus/WindowsInput/KeyboardSimulator.cs @@ -311,11 +311,11 @@ public IKeyboardSimulator KeyPress(DirectInputKeyCode dikCode) /// Delay in ms between keydown and keyup of final keyCode. 50ms should be minimum public IKeyboardSimulator DelayedKeyPress(DirectInputKeyCode dikCode, int delay) { - DelayedKeyPressDown(dikCode, delay); + DelayedKeyPressDown(dikCode); Thread.Sleep(delay); - DelayedKeyPressUp(dikCode, delay); + DelayedKeyPressUp(dikCode); return this; } @@ -324,8 +324,7 @@ public IKeyboardSimulator DelayedKeyPress(DirectInputKeyCode dikCode, int delay) /// Calls the Win32 SendInput method with a KeyDown message /// /// The to press - /// Delay in ms between keydown and keyup of final keyCode. 50ms should be minimum - public IKeyboardSimulator DelayedKeyPressDown(DirectInputKeyCode dikCode, int delay) + public IKeyboardSimulator DelayedKeyPressDown(DirectInputKeyCode dikCode) { var inputList1 = new InputBuilder().AddKeyDown(dikCode).ToArray(); SendSimulatedInput(inputList1); @@ -337,8 +336,7 @@ public IKeyboardSimulator DelayedKeyPressDown(DirectInputKeyCode dikCode, int de /// Calls the Win32 SendInput method with a KeyUp message /// /// The to press - /// Delay in ms between keydown and keyup of final keyCode. 50ms should be minimum - public IKeyboardSimulator DelayedKeyPressUp(DirectInputKeyCode dikCode, int delay) + public IKeyboardSimulator DelayedKeyPressUp(DirectInputKeyCode dikCode) { var inputList2 = new InputBuilder().AddKeyUp(dikCode).ToArray(); SendSimulatedInput(inputList2); @@ -407,11 +405,11 @@ public IKeyboardSimulator ModifiedKeyStroke(IEnumerable modi /// Delay in ms between keydown and keyup of final keyCode. 50ms should be minimum public IKeyboardSimulator DelayedModifiedKeyStroke(IEnumerable modifierDikCodes, DirectInputKeyCode dikCode, int delay) { - DelayedModifiedKeyStrokeDown(modifierDikCodes, dikCode, delay); + ModifiedKeyStrokeDown(modifierDikCodes, dikCode); Thread.Sleep(delay); - DelayedModifiedKeyStrokeUp(modifierDikCodes, dikCode, delay); + ModifiedKeyStrokeUp(modifierDikCodes, dikCode); return this; } @@ -422,8 +420,7 @@ public IKeyboardSimulator DelayedModifiedKeyStroke(IEnumerable /// The list of modifier keys /// The list of keys to simulate - /// Delay in ms between keydown and keyup of final keyCode. 50ms should be minimum - public IKeyboardSimulator DelayedModifiedKeyStrokeDown(IEnumerable modifierDikCodes, DirectInputKeyCode dikCode, int delay) + public IKeyboardSimulator ModifiedKeyStrokeDown(IEnumerable modifierDikCodes, DirectInputKeyCode dikCode) { foreach (var keyCode in modifierDikCodes) { @@ -442,8 +439,7 @@ public IKeyboardSimulator DelayedModifiedKeyStrokeDown(IEnumerable /// The list of modifier keys /// The list of keys to simulate - /// Delay in ms between keydown and keyup of final keyCode. 50ms should be minimum - public IKeyboardSimulator DelayedModifiedKeyStrokeUp(IEnumerable modifierDikCodes, DirectInputKeyCode dikCode, int delay) + public IKeyboardSimulator ModifiedKeyStrokeUp(IEnumerable modifierDikCodes, DirectInputKeyCode dikCode) { KeyUp(dikCode); diff --git a/InputSimulatorPlus/WindowsInput/WindowsInput.csproj b/InputSimulatorPlus/WindowsInput/WindowsInput.csproj index 9fab198..7b0d1bf 100644 --- a/InputSimulatorPlus/WindowsInput/WindowsInput.csproj +++ b/InputSimulatorPlus/WindowsInput/WindowsInput.csproj @@ -10,7 +10,7 @@ Properties WindowsInput WindowsInput - v4.7.2 + v4.8 512 diff --git a/README.md b/README.md index 390bf3a..6e3f7ae 100644 --- a/README.md +++ b/README.md @@ -14,18 +14,24 @@ The bound key is shown in the dropdown, localised for the current keyboard langu Credit goes to https://github.com/SCToolsfactory/SCJMapper-V2 for all the code to get the `defaultProfile.xml` from the p4k file etc. -The button works in a similar way, to the streamdeck 'Hotkey' button type. +The static button works in a similar way, to the streamdeck 'Hotkey' button type. So, there is only one image and there is no game state feedback for these buttons. The differences with the 'Hotkey' buttons are, that it gets the keyboard binding from the game. When the stream deck button is pushed, the 'key down' event is sent to the keyboard and only after the stream deck button is released, the 'key up' event is sent to the keyboard. +The plugin's multi-action button behaviour is different : when the stream deck button is pushed, the 'key down' event is sent to the keyboard. +After a user-definable delay (default = 40 ms) the 'key up' event is sent to the keyboard. +Nothing happens when the streamdeck button is released. + +Both the static- and multi-action buttons can be used inside the streamdeck built-in multi-action button's action list. + +The multi-action button can also be used as a regular streamdeck button, in case a fixed user-definable delay is required between the key down and key up events. + A sound can be played when pressing a button. **You can clear the sound path, by clicking on the label in front of the file picker edit box.** -The buttons can also be used with multi-action buttons. - You can, for example, use the 'multi-action switch' function, that is built into the streamdeck software, to set up a toggle function. You can add the relevant function of this plugin to both the ON-and OFF-action of the 'multi-action switch' function. You can then set up different images for each toggle state. @@ -74,7 +80,7 @@ The plugin uses all the active keyboard bindings from `defaultProfile.xml` and t `C:\Program Files\Roberts Space Industries\StarCitizen\LIVE\USER\Client\0\Profiles\default\actionmaps.xml` -The `PropertyInspector\StarCitizen\Static.html` file is dynamically updated, in case more custom keyboard bindings were added to `actionmaps.xml`, +The `PropertyInspector\StarCitizen\Static.html` and `PropertyInspector\StarCitizen\Macro.html` file is dynamically updated, in case more custom keyboard bindings were added to `actionmaps.xml`, that didn't have any corresponding keyboard bindings in `defaultProfile.xml`. If nothing happens, when pressing streamdeck buttons: you could try to start streamdeck.exe as administrator. diff --git a/starcitizen/App.config b/starcitizen/App.config index 880fc33..f42eca7 100644 --- a/starcitizen/App.config +++ b/starcitizen/App.config @@ -2,13 +2,13 @@ - + - + @@ -20,7 +20,7 @@ - + diff --git a/starcitizen/Buttons/Macro.cs b/starcitizen/Buttons/Macro.cs new file mode 100644 index 0000000..959271a --- /dev/null +++ b/starcitizen/Buttons/Macro.cs @@ -0,0 +1,159 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using System.Windows.Input; +using WindowsInput.Native; +using BarRaider.SdTools; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +// ReSharper disable StringLiteralTypo + +namespace starcitizen.Buttons +{ + + [PluginActionId("com.mhwlng.starcitizen.macro")] + public class Macro : StarCitizenBase + { + protected class PluginSettings + { + public static PluginSettings CreateDefaultSettings() + { + var instance = new PluginSettings + { + Function = string.Empty, + }; + + return instance; + } + + [JsonProperty(PropertyName = "function")] + public string Function { get; set; } + + [FilenameProperty] + [JsonProperty(PropertyName = "clickSound")] + public string ClickSoundFilename { get; set; } + + [JsonProperty(PropertyName = "delay")] + public string Delay { get; set; } + + } + + + PluginSettings settings; + private CachedSound _clickSound = null; + + private int? _delay = null; + + + public Macro(SDConnection connection, InitialPayload payload) : base(connection, payload) + { + if (payload.Settings == null || payload.Settings.Count == 0) + { + //Logger.Instance.LogMessage(TracingLevel.DEBUG, "Repeating Macro Constructor #1"); + + settings = PluginSettings.CreateDefaultSettings(); + Connection.SetSettingsAsync(JObject.FromObject(settings)).Wait(); + + } + else + { + //Logger.Instance.LogMessage(TracingLevel.DEBUG, "Repeating Macro Constructor #2"); + + settings = payload.Settings.ToObject(); + HandleFileNames(); + } + + } + + + public override void KeyPressed(KeyPayload payload) + { + if (InputRunning || Program.dpReader == null) + { + ForceStop = true; + return; + } + + ForceStop = false; + + var action = Program.dpReader.GetBinding(settings.Function); + if (action != null) + { + Logger.Instance.LogMessage(TracingLevel.INFO, CommandTools.ConvertKeyString(action.Keyboard)); + + SendKeypress(CommandTools.ConvertKeyString(action.Keyboard), _delay ?? 40); + } + + if (_clickSound != null) + { + try + { + AudioPlaybackEngine.Instance.PlaySound(_clickSound); + } + catch (Exception ex) + { + Logger.Instance.LogMessage(TracingLevel.FATAL, $"PlaySound: {ex}"); + } + + } + + } + + public override void KeyReleased(KeyPayload payload) + { + + + } + + public override void Dispose() + { + base.Dispose(); + + //Logger.Instance.LogMessage(TracingLevel.DEBUG, "Destructor called #1"); + } + + + public override void ReceivedSettings(ReceivedSettingsPayload payload) + { + //Logger.Instance.LogMessage(TracingLevel.DEBUG, "ReceivedSettings"); + + // New in StreamDeck-Tools v2.0: + BarRaider.SdTools.Tools.AutoPopulateSettings(settings, payload.Settings); + HandleFileNames(); + } + + private void HandleFileNames() + { + _delay = null; + + if (!string.IsNullOrEmpty(settings.Delay)) + { + var ok = int.TryParse(settings.Delay, out var delay); + if (ok && (delay > 0)) + { + _delay = delay; + } + } + + _clickSound = null; + + if (File.Exists(settings.ClickSoundFilename)) + { + try + { + _clickSound = new CachedSound(settings.ClickSoundFilename); + } + catch (Exception ex) + { + Logger.Instance.LogMessage(TracingLevel.FATAL, $"CachedSound: {settings.ClickSoundFilename} {ex}"); + + _clickSound = null; + settings.ClickSoundFilename = null; + } + } + + Connection.SetSettingsAsync(JObject.FromObject(settings)).Wait(); + } + } +} diff --git a/starcitizen/Buttons/StarCitizenBase.cs b/starcitizen/Buttons/StarCitizenBase.cs index d7322c5..b4d6b37 100644 --- a/starcitizen/Buttons/StarCitizenBase.cs +++ b/starcitizen/Buttons/StarCitizenBase.cs @@ -51,6 +51,19 @@ public override void OnTick() public override void ReceivedGlobalSettings(ReceivedGlobalSettingsPayload payload) { } + private void SendInput(string inputText, int delay) + { + var text = inputText; + + for (var idx = 0; idx < text.Length && !ForceStop; idx++) + { + var macro = CommandTools.ExtractMacro(text, idx); + idx += macro.Length - 1; + macro = macro.Substring(1, macro.Length - 2); + + HandleMacro(macro, delay); + } + } private void SendInputDown(string inputText) { var text = inputText; @@ -79,6 +92,33 @@ private void SendInputUp(string inputText) } } + public static void HandleMacro(string macro, int delay) + { + var keyStrokes = CommandTools.ExtractKeyStrokes(macro); + + // Actually initiate the keystrokes + if (keyStrokes.Count > 0) + { + var iis = new InputSimulator(); + var keyCode = keyStrokes.Last(); + keyStrokes.Remove(keyCode); + + if (keyStrokes.Count > 0) + { + //iis.Keyboard.ModifiedKeyStroke(keyStrokes.Select(ks => ks).ToArray(), keyCode); + + iis.Keyboard.DelayedModifiedKeyStroke(keyStrokes.Select(ks => ks), keyCode, delay); + + } + else // Single Keycode + { + //iis.Keyboard.KeyPress(keyCode); + + iis.Keyboard.DelayedKeyPress(keyCode, delay); + } + } + } + private void HandleMacroDown(string macro) { var keyStrokes = CommandTools.ExtractKeyStrokes(macro); @@ -92,12 +132,12 @@ private void HandleMacroDown(string macro) if (keyStrokes.Count > 0) { - iis.Keyboard.DelayedModifiedKeyStrokeDown(keyStrokes.Select(ks => ks), keyCode, 40); + iis.Keyboard.ModifiedKeyStrokeDown(keyStrokes.Select(ks => ks), keyCode); } else // Single Keycode { - iis.Keyboard.DelayedKeyPressDown(keyCode, 40); + iis.Keyboard.DelayedKeyPressDown(keyCode); } } } @@ -116,16 +156,24 @@ private void HandleMacroUp(string macro) if (keyStrokes.Count > 0) { - iis.Keyboard.DelayedModifiedKeyStrokeUp(keyStrokes.Select(ks => ks), keyCode, 40); + iis.Keyboard.ModifiedKeyStrokeUp(keyStrokes.Select(ks => ks), keyCode); } else // Single Keycode { - iis.Keyboard.DelayedKeyPressUp(keyCode, 40); + iis.Keyboard.DelayedKeyPressUp(keyCode); } } } + protected void SendKeypress(string keyInfo, int delay) + { + if (!string.IsNullOrEmpty(keyInfo)) + { + SendInput("{" + keyInfo + "}", delay); + } + } + protected void SendKeypressDown(string keyInfo) { if (!string.IsNullOrEmpty(keyInfo)) diff --git a/starcitizen/Program.cs b/starcitizen/Program.cs index e7ad7db..6b4b76d 100644 --- a/starcitizen/Program.cs +++ b/starcitizen/Program.cs @@ -86,6 +86,8 @@ class Program public static string statictemplate; + public static string macrotemplate; + public static void HandleKeyBindingEvents(object sender, object evt) { Logger.Instance.LogMessage(TracingLevel.INFO, $"Reloading Key Bindings"); @@ -116,6 +118,8 @@ private static void GetKeyBindings(Object threadContext) dpReader.CreateStaticHtml(statictemplate); + dpReader.CreateMacroHtml(macrotemplate); + dpReader.CreateCsv(); Logger.Instance.LogMessage(TracingLevel.INFO, "monitoring key binding file" ); @@ -135,6 +139,8 @@ static void Main(string[] args) statictemplate = File.ReadAllText("statictemplate.html"); + macrotemplate = File.ReadAllText("macrotemplate.html"); + profile = SCDefaultProfile.DefaultProfile(); GetKeyBindings(null); diff --git a/starcitizen/Properties/AssemblyInfo.cs b/starcitizen/Properties/AssemblyInfo.cs index 8a5da05..a970a02 100644 --- a/starcitizen/Properties/AssemblyInfo.cs +++ b/starcitizen/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.6.0")] -[assembly: AssemblyFileVersion("1.0.6.0")] +[assembly: AssemblyVersion("1.0.7.0")] +[assembly: AssemblyFileVersion("1.0.7.0")] diff --git a/starcitizen/PropertyInspector/StarCitizen/Macro.html b/starcitizen/PropertyInspector/StarCitizen/Macro.html new file mode 100644 index 0000000..59a3527 --- /dev/null +++ b/starcitizen/PropertyInspector/StarCitizen/Macro.html @@ -0,0 +1,352 @@ + + + + + + + + Mhwlng's Star Citizen + + + + + + + +
+ +
+
Function
+ +
+ +
+
Sound
+
+ + + +
+
+ +
+
Delay (ms)
+ +
+ +
+ + diff --git a/starcitizen/SC/DProfileReader.cs b/starcitizen/SC/DProfileReader.cs index cf9efea..696a118 100644 --- a/starcitizen/SC/DProfileReader.cs +++ b/starcitizen/SC/DProfileReader.cs @@ -660,5 +660,77 @@ public void CreateStaticHtml(string statictemplate) } + + public void CreateMacroHtml(string macrotemplate) + { + try + { + var keyboard = KeyboardLayouts.GetThreadKeyboardLayout(); + + CultureInfo culture; + + try + { + culture = new CultureInfo(keyboard.KeyboardId); + } + catch + { + culture = new CultureInfo("en-US"); + } + + Logger.Instance.LogMessage(TracingLevel.INFO, $"Keyboard Detected, language : {keyboard.LanguageId:X} keyboard : {keyboard.KeyboardId:X} culture : {culture.Name}"); + + var dropdownHtml = new StringBuilder(); + + var mapsList = + actions + .Where(x => !string.IsNullOrWhiteSpace(x.Value.Keyboard)) + .OrderBy(x => x.Value.MapUILabel) + .GroupBy(x => x.Value.MapUILabel) + .Select(x => x.Key); + + + foreach (var map in mapsList) + { + var options = actions + .Where(x => x.Value.MapUILabel == map && !string.IsNullOrWhiteSpace(x.Value.Keyboard)) + .OrderBy(x => x.Value.MapUICategory) + .ThenBy(x => x.Value.MapUILabel) + .ThenBy(x => x.Value.UILabel); + + if (options.Any()) + { + var htmlline = $""; + + dropdownHtml.AppendLine(htmlline); + + foreach (var action in options) + { + var keyString = CommandTools.ConvertKeyStringToLocale(action.Value.Keyboard, culture.Name); + + var key = keyString.Replace("Dik", "").Replace("}{", "+").Replace("}", "").Replace("{", ""); + + htmlline = $" "; + + dropdownHtml.AppendLine(htmlline); + } + + htmlline = $""; + + dropdownHtml.AppendLine(htmlline); + } + + } + + File.WriteAllText(Path.Combine(@"PropertyInspector\StarCitizen", "Macro.html"), + macrotemplate.Replace("[DROPDOWN]", dropdownHtml.ToString())); + } + catch (Exception ex) + { + Logger.Instance.LogMessage(TracingLevel.ERROR, $"CreateMacroHtml {ex}"); + } + + } + } } diff --git a/starcitizen/macrotemplate.html b/starcitizen/macrotemplate.html new file mode 100644 index 0000000..3d392d0 --- /dev/null +++ b/starcitizen/macrotemplate.html @@ -0,0 +1,43 @@ + + + + + + + + Mhwlng's Star Citizen + + + + + + + +
+ +
+
Function
+ +
+ +
+
Sound
+
+ + + +
+
+ +
+
Delay (ms)
+ +
+ +
+ + diff --git a/starcitizen/manifest.json b/starcitizen/manifest.json index c8718a9..6dc14f0 100644 --- a/starcitizen/manifest.json +++ b/starcitizen/manifest.json @@ -14,6 +14,21 @@ "Tooltip": "Star Citizen Static Button", "UUID": "com.mhwlng.starcitizen.static", "PropertyInspectorPath": "PropertyInspector/StarCitizen/Static.html" + }, + { + "Icon": "Images/icon", + "Name": "Multi-Action Button", + "States": [ + { + "Image": "Images/Default", + "TitleAlignment": "bottom", + "FontSize": "8" + } + ], + "SupportedInMultiActions": true, + "Tooltip": "Star Citizen Multi-Action Button", + "UUID": "com.mhwlng.starcitizen.macro", + "PropertyInspectorPath": "PropertyInspector/StarCitizen/Macro.html" } ], "Author": "mhwlng", @@ -21,7 +36,7 @@ "Name": "Star Citizen", "Icon": "Images/pluginIcon", "URL": "https://github.com/mhwlng/streamdeck-starcitizen", - "Version": "1.0.6", + "Version": "1.0.7", "CodePath": "com.mhwlng.starcitizen", "Category": "Star Citizen", "CategoryIcon": "Images/categoryIcon", diff --git a/starcitizen/packages.config b/starcitizen/packages.config index 90fd547..b64a1c3 100644 --- a/starcitizen/packages.config +++ b/starcitizen/packages.config @@ -12,17 +12,17 @@ - + - + - - - + + + \ No newline at end of file diff --git a/starcitizen/starcitizen.csproj b/starcitizen/starcitizen.csproj index 29a093c..6778484 100644 --- a/starcitizen/starcitizen.csproj +++ b/starcitizen/starcitizen.csproj @@ -8,7 +8,7 @@ Exe starcitizen com.mhwlng.starcitizen - v4.7.2 + v4.8 512 true true @@ -29,6 +29,7 @@ 1.0.0.%2a false true + AnyCPU @@ -89,7 +90,7 @@ ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll - ..\packages\NLog.4.7.10\lib\net45\NLog.dll + ..\packages\NLog.4.7.15\lib\net45\NLog.dll ..\packages\streamdeck-client-csharp.4.3.0\lib\netstandard2.0\streamdeck-client-csharp.dll @@ -109,8 +110,8 @@ - - ..\packages\System.Drawing.Common.5.0.2\lib\net461\System.Drawing.Common.dll + + ..\packages\System.Drawing.Common.6.0.0\lib\net461\System.Drawing.Common.dll @@ -124,16 +125,16 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\packages\System.Security.AccessControl.5.0.0\lib\net461\System.Security.AccessControl.dll + + ..\packages\System.Security.AccessControl.6.0.0\lib\net461\System.Security.AccessControl.dll - - ..\packages\System.Security.Permissions.5.0.0\lib\net461\System.Security.Permissions.dll + + ..\packages\System.Security.Permissions.6.0.0\lib\net461\System.Security.Permissions.dll ..\packages\System.Security.Principal.Windows.5.0.0\lib\net461\System.Security.Principal.Windows.dll @@ -158,6 +159,7 @@ + @@ -262,6 +264,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -283,6 +288,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest