From 3173ec6e141be66dd8ac60764c8eda5e096651af Mon Sep 17 00:00:00 2001 From: WebSpiderTeam Date: Sun, 26 May 2024 15:29:16 +0300 Subject: [PATCH] - Added Needle style to Analog Display. - Added Analog Display Bar/Needle color selection. - Added Menu Icon Style selection to settings. You can change these settings in View Settings. --- BluetoothDMM WPF/Bluetooth.Dmm/Utilities.cs | 2 +- BluetoothDMM WPF/BluetoothDMM/App.config | 6 + BluetoothDMM WPF/BluetoothDMM/Classes/Arc.cs | 92 +++++++++++++-- BluetoothDMM WPF/BluetoothDMM/MainWindow.xaml | 10 +- .../BluetoothDMM/Properties/AssemblyInfo.cs | 4 +- .../Properties/Settings.Designer.cs | 26 ++++- .../BluetoothDMM/Properties/Settings.settings | 6 + .../BluetoothDMM/SettingsNew.xaml | 40 +++++-- .../BluetoothDMM/SettingsNew.xaml.cs | 38 ++++++- .../BluetoothDMMSetup.vdproj | 106 +++++++++--------- 10 files changed, 246 insertions(+), 84 deletions(-) diff --git a/BluetoothDMM WPF/Bluetooth.Dmm/Utilities.cs b/BluetoothDMM WPF/Bluetooth.Dmm/Utilities.cs index ec1628b..f48a5c1 100644 --- a/BluetoothDMM WPF/Bluetooth.Dmm/Utilities.cs +++ b/BluetoothDMM WPF/Bluetooth.Dmm/Utilities.cs @@ -2040,7 +2040,7 @@ public static ArrayList ParseHeartRateValue(byte[] data, bool LogData, int isBDM // Testing other device data var TestDevice = 0; #if DEBUG// In debug mode do not custom-handle the exception, let Visual Studio handle it - TestDevice = 7; + TestDevice = 0; #else TestDevice = 0; #endif diff --git a/BluetoothDMM WPF/BluetoothDMM/App.config b/BluetoothDMM WPF/BluetoothDMM/App.config index 3047db3..746e2be 100644 --- a/BluetoothDMM WPF/BluetoothDMM/App.config +++ b/BluetoothDMM WPF/BluetoothDMM/App.config @@ -134,6 +134,12 @@ True + + False + + + #FFFFFF00 + diff --git a/BluetoothDMM WPF/BluetoothDMM/Classes/Arc.cs b/BluetoothDMM WPF/BluetoothDMM/Classes/Arc.cs index e0a40e2..266eddf 100644 --- a/BluetoothDMM WPF/BluetoothDMM/Classes/Arc.cs +++ b/BluetoothDMM WPF/BluetoothDMM/Classes/Arc.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Windows; using System.Windows.Media; using System.Windows.Shapes; @@ -23,7 +24,7 @@ static CircularProgress() StrokeThicknessProperty.OverrideMetadata( typeof(CircularProgress), - new FrameworkPropertyMetadata(10.0)); + new FrameworkPropertyMetadata(1.0)); } public double StartAngle @@ -43,6 +44,12 @@ public double Value set { SetValue(ValueProperty, value); } } + public int Type + { + get { return (int)GetValue(TypeProperty); } + set { SetValue(TypeProperty, value); } + } + #region 종료 각도 속성 - StartAngleProperty /// @@ -76,6 +83,16 @@ public double Value FrameworkPropertyMetadataOptions.AffectsRender, null, // Property changed callback new CoerceValueCallback(CoerceValue)); // Coerce value callback + // DependencyProperty - Value (0 - 100) + private static FrameworkPropertyMetadata typeMetadata = + new FrameworkPropertyMetadata( + 0, // Default value + FrameworkPropertyMetadataOptions.AffectsRender, + null, // Property changed callback + new CoerceValueCallback(TypeValue)); // Coerce value callback + + public static readonly DependencyProperty TypeProperty = + DependencyProperty.Register("Type", typeof(int), typeof(CircularProgress), typeMetadata); public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(CircularProgress), valueMetadata); @@ -86,6 +103,13 @@ public double Value public static readonly DependencyProperty EndAngleProperty = DependencyProperty.Register("EndAngle", typeof(double), typeof(CircularProgress), EndAngleMetadata); + private static object TypeValue(DependencyObject depObj, object baseVal) + { + int val = (int)baseVal; + val = Math.Min(val, 1); + val = Math.Max(val, 0); + return val; + } private static object CoerceValue(DependencyObject depObj, object baseVal) { double val = (double)baseVal; @@ -113,6 +137,15 @@ protected override Geometry DefiningGeometry { get { + int type = Type; + double multiplerTop = 1; + double multiplerBottom = 0.965; + double change = 1; + if (type == 1) + { + multiplerTop = 0.98; + multiplerBottom = 0.945; + } double startAngle = StartAngle + 90; double Differ = Math.Abs(EndAngle - StartAngle); double endAngle = startAngle - ((Value / 100.0) * (Differ)+0.2); @@ -120,30 +153,65 @@ protected override Geometry DefiningGeometry double maxWidth = Math.Max(0.0, RenderSize.Width - StrokeThickness); double maxHeight = Math.Max(0.0, RenderSize.Height - StrokeThickness); - double xStart = maxWidth / 2.0 * Math.Cos(startAngle * Math.PI / 180.0); - double yStart = maxHeight / 2.0 * Math.Sin(startAngle * Math.PI / 180.0); + double xTopStart = maxWidth * multiplerTop / 2.0 * Math.Cos(startAngle * Math.PI / 180.0); + double yTopStart = maxHeight * multiplerTop / 2.0 * Math.Sin(startAngle * Math.PI / 180.0); + + double xTopEnd = maxWidth * multiplerTop / 2.0 * Math.Cos(endAngle * Math.PI / 180.0); + double yTopEnd = maxHeight * multiplerTop / 2.0 * Math.Sin(endAngle * Math.PI / 180.0); + + double xBottomStart = maxWidth * multiplerBottom / 2.0 * Math.Cos(startAngle * Math.PI / 180.0); + double yBottomStart = maxHeight * multiplerBottom / 2.0 * Math.Sin(startAngle * Math.PI / 180.0); + + double xBottomEnd = maxWidth * multiplerBottom / 2.0 * Math.Cos(endAngle * Math.PI / 180.0); + double yBottomEnd = maxHeight * multiplerBottom / 2.0 * Math.Sin(endAngle * Math.PI / 180.0); - double xEnd = maxWidth / 2.0 * Math.Cos(endAngle * Math.PI / 180.0); - double yEnd = maxHeight / 2.0 * Math.Sin(endAngle * Math.PI / 180.0); + double xPinEnd = maxWidth * multiplerBottom / 2.0 * Math.Cos((endAngle + 0.3) * Math.PI / 180.0); + double yPinEnd = maxHeight * multiplerBottom / 2.0 * Math.Sin((endAngle + 0.3) * Math.PI / 180.00); StreamGeometry geom = new StreamGeometry(); using (StreamGeometryContext ctx = geom.Open()) { ctx.BeginFigure( - new Point((RenderSize.Width / 2.0) + xStart, - (RenderSize.Height / 2.0) - yStart), + new Point((RenderSize.Width / 2.0) + xBottomStart, + (RenderSize.Height / 2.0) - yBottomStart), true, // Filled false); // Closed ctx.ArcTo( - new Point((RenderSize.Width / 2.0) + xEnd, - (RenderSize.Height / 2.0) - yEnd), - new Size(maxWidth / 2.0, maxHeight / 2), + new Point((RenderSize.Width / 2.0) + xBottomEnd, + (RenderSize.Height / 2.0) - yBottomEnd), + new Size(maxWidth / (2.0/multiplerBottom), maxHeight / (2.0/multiplerBottom)), 0.0, // rotationAngle (startAngle - endAngle) > 180, // greater than 180 deg? SweepDirection.Clockwise, true, // isStroked - false); - // ctx.LineTo(new Point((RenderSize.Width / 2.0), (RenderSize.Height / 2.0)), true, true); + true); + + ctx.LineTo(new Point((RenderSize.Width / 2.0) + xTopEnd, (RenderSize.Height / 2.0) - yTopEnd), true, false); + if (Type == 0) + { + ctx.ArcTo( + new Point((RenderSize.Width / 2.0) + xTopStart, + (RenderSize.Height / 2.0) - yTopStart), + new Size(maxWidth / (2.0 / multiplerTop), maxHeight / (2.0 / multiplerTop)), + 0.0, // rotationAngle + (startAngle - endAngle) > 180, // greater than 180 deg? + SweepDirection.Counterclockwise, + true, // isStroked + false); + ctx.LineTo(new Point((RenderSize.Width / 2.0) + xBottomStart, (RenderSize.Height / 2.0) - yBottomStart), true, false); + } else + { + ctx.LineTo(new Point((RenderSize.Width / 2.0) + xPinEnd, (RenderSize.Height / 2.0) - yPinEnd), true, false); + ctx.ArcTo( + new Point((RenderSize.Width / 2.0) + xBottomStart, + (RenderSize.Height / 2.0) - yBottomStart), + new Size(maxWidth / (2.0 / multiplerBottom), maxHeight / (2.0 / multiplerBottom)), + 0.0, // rotationAngle + (startAngle - endAngle) > 180, // greater than 180 deg? + SweepDirection.Counterclockwise, + true, // isStroked + false); + } } return geom; diff --git a/BluetoothDMM WPF/BluetoothDMM/MainWindow.xaml b/BluetoothDMM WPF/BluetoothDMM/MainWindow.xaml index d988159..da6b966 100644 --- a/BluetoothDMM WPF/BluetoothDMM/MainWindow.xaml +++ b/BluetoothDMM WPF/BluetoothDMM/MainWindow.xaml @@ -527,16 +527,18 @@ - + - + diff --git a/BluetoothDMM WPF/BluetoothDMM/Properties/AssemblyInfo.cs b/BluetoothDMM WPF/BluetoothDMM/Properties/AssemblyInfo.cs index 2945c13..e62caf8 100644 --- a/BluetoothDMM WPF/BluetoothDMM/Properties/AssemblyInfo.cs +++ b/BluetoothDMM WPF/BluetoothDMM/Properties/AssemblyInfo.cs @@ -49,5 +49,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.25.0.0")] -[assembly: AssemblyFileVersion("1.25.0.0")] +[assembly: AssemblyVersion("1.26.0.0")] +[assembly: AssemblyFileVersion("1.26.0.0")] diff --git a/BluetoothDMM WPF/BluetoothDMM/Properties/Settings.Designer.cs b/BluetoothDMM WPF/BluetoothDMM/Properties/Settings.Designer.cs index 1f8c778..ca9b49e 100644 --- a/BluetoothDMM WPF/BluetoothDMM/Properties/Settings.Designer.cs +++ b/BluetoothDMM WPF/BluetoothDMM/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace BluetoothDMM.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.3.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.9.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -225,5 +225,29 @@ public bool CheckUpdates { this["CheckUpdates"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool ADisplayNewStyle { + get { + return ((bool)(this["ADisplayNewStyle"])); + } + set { + this["ADisplayNewStyle"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("#FFFFFF00")] + public string ADisplayBarColor { + get { + return ((string)(this["ADisplayBarColor"])); + } + set { + this["ADisplayBarColor"] = value; + } + } } } diff --git a/BluetoothDMM WPF/BluetoothDMM/Properties/Settings.settings b/BluetoothDMM WPF/BluetoothDMM/Properties/Settings.settings index 5dcf89f..cde521d 100644 --- a/BluetoothDMM WPF/BluetoothDMM/Properties/Settings.settings +++ b/BluetoothDMM WPF/BluetoothDMM/Properties/Settings.settings @@ -53,5 +53,11 @@ True + + False + + + #FFFFFF00 + \ No newline at end of file diff --git a/BluetoothDMM WPF/BluetoothDMM/SettingsNew.xaml b/BluetoothDMM WPF/BluetoothDMM/SettingsNew.xaml index 91d472a..f846184 100644 --- a/BluetoothDMM WPF/BluetoothDMM/SettingsNew.xaml +++ b/BluetoothDMM WPF/BluetoothDMM/SettingsNew.xaml @@ -43,9 +43,7 @@ RecognizesAccessKey="True" VerticalAlignment="Center" TextBlock.FontSize="14" - TextBlock.Foreground="#FFFFFF"> - - + TextBlock.Foreground="#FFFFFF"/> @@ -76,14 +74,14 @@ - - - - + + + - - + Orientation="Vertical"/> + + + + + + + + + + + + + + + + + + + + + diff --git a/BluetoothDMM WPF/BluetoothDMM/SettingsNew.xaml.cs b/BluetoothDMM WPF/BluetoothDMM/SettingsNew.xaml.cs index 7e7debb..acd3950 100644 --- a/BluetoothDMM WPF/BluetoothDMM/SettingsNew.xaml.cs +++ b/BluetoothDMM WPF/BluetoothDMM/SettingsNew.xaml.cs @@ -18,6 +18,7 @@ using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; +using System.Xml.Linq; using WPFLocalizeExtension.Deprecated.Extensions; using WPFLocalizeExtension.Engine; using Application = System.Windows.Application; @@ -31,6 +32,7 @@ namespace BluetoothDMM public partial class SettingsNew : Window { public Dictionary DeviceListC { get; set; } + public IEnumerable color_query { get; set; } // The path to the key where Windows looks for startup applications readonly RegistryKey rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); @@ -40,6 +42,17 @@ public SettingsNew(System.Collections.Generic.Dictionary de InitializeComponent(); DeviceListC = deviceListC; lstDevices.DataContext = this; + color_query = from PropertyInfo property in typeof(Colors).GetProperties() + orderby property.Name + //orderby ((Color)property.GetValue(null, null)).ToString() + select new ColorInfo( + property.Name, + (Color)property.GetValue(null, null)); + cmbColors.DataContext = this;// (new System.Linq.SystemCore_EnumerableDebugView(color_query).Items[12]).HexValue + //cmbColors.SelectedValue = color_query.FirstOrDefault( Properties.Settings.Default.ADisplayBarColor; + //cmbColors.ItemsSource = color_query; + //cmbColors.SelectedValue = Properties.Settings.Default.ADisplayBarColor; + LocalizeDictionary.Instance.OutputMissingKeys = true; LocalizeDictionary.Instance.MissingKeyEvent += Instance_MissingKeyEvent; this.Closing += SettingsNew_Closing; @@ -335,7 +348,30 @@ private void btnValues_Click(object sender, RoutedEventArgs e) datatypes.Topmost = this.Topmost; datatypes.ShowDialog(); } - //-------// + } + public class ColorInfo + { + public string ColorName { get; set; } + public Color Color { get; set; } + public SolidColorBrush SampleBrush + { + get { return new SolidColorBrush(Color); } + } + public string HexValue + { + get { return Color.ToString(); } + } + + public ColorInfo(string color_name, Color color) + { + ColorName = color_name; + Color = color; + } + public override string ToString() + { + return Color.ToString(); + } + } } diff --git a/BluetoothDMM WPF/BluetoothDMMSetup/BluetoothDMMSetup.vdproj b/BluetoothDMM WPF/BluetoothDMMSetup/BluetoothDMMSetup.vdproj index a759f81..a8d209d 100644 --- a/BluetoothDMM WPF/BluetoothDMMSetup/BluetoothDMMSetup.vdproj +++ b/BluetoothDMM WPF/BluetoothDMMSetup/BluetoothDMMSetup.vdproj @@ -47,7 +47,7 @@ "Entry" { "MsmKey" = "8:_06AEA0B9691CAEE29D0B5AA88DAF5AC8" - "OwnerKey" = "8:_A2AF05C0FCE4493F1F87A7FF624D9407" + "OwnerKey" = "8:_2558C9F4B1EA8F57C5409415B3067E63" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -148,6 +148,18 @@ } "Entry" { + "MsmKey" = "8:_2558C9F4B1EA8F57C5409415B3067E63" + "OwnerKey" = "8:_636A1D2068FF4735A642592EDECE3D24" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_2558C9F4B1EA8F57C5409415B3067E63" + "OwnerKey" = "8:_C8F0B57960AF1791227059AEBA33909B" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_26F75C40DABBCB97B3C6F0880A9D2171" "OwnerKey" = "8:_636A1D2068FF4735A642592EDECE3D24" "MsmSig" = "8:_UNDEFINED" @@ -167,7 +179,7 @@ "Entry" { "MsmKey" = "8:_288F552BA9FC9F81323ABD8C12B2A4E5" - "OwnerKey" = "8:_A2AF05C0FCE4493F1F87A7FF624D9407" + "OwnerKey" = "8:_2558C9F4B1EA8F57C5409415B3067E63" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -425,7 +437,7 @@ "Entry" { "MsmKey" = "8:_77F37AD55A7426F79BA8553F92495F24" - "OwnerKey" = "8:_A2AF05C0FCE4493F1F87A7FF624D9407" + "OwnerKey" = "8:_2558C9F4B1EA8F57C5409415B3067E63" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -568,18 +580,6 @@ } "Entry" { - "MsmKey" = "8:_A2AF05C0FCE4493F1F87A7FF624D9407" - "OwnerKey" = "8:_C8F0B57960AF1791227059AEBA33909B" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_A2AF05C0FCE4493F1F87A7FF624D9407" - "OwnerKey" = "8:_636A1D2068FF4735A642592EDECE3D24" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_A317CF6BCF05DF7688B5CAB752897CD0" "OwnerKey" = "8:_636A1D2068FF4735A642592EDECE3D24" "MsmSig" = "8:_UNDEFINED" @@ -587,7 +587,7 @@ "Entry" { "MsmKey" = "8:_A56FCADFB40F5977175AB88B795CA234" - "OwnerKey" = "8:_A2AF05C0FCE4493F1F87A7FF624D9407" + "OwnerKey" = "8:_2558C9F4B1EA8F57C5409415B3067E63" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -653,7 +653,7 @@ "Entry" { "MsmKey" = "8:_B818F6298DA780B2B6E0939F68A23802" - "OwnerKey" = "8:_A2AF05C0FCE4493F1F87A7FF624D9407" + "OwnerKey" = "8:_2558C9F4B1EA8F57C5409415B3067E63" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -851,7 +851,7 @@ "Entry" { "MsmKey" = "8:_FF600808F7BAE1CD11975D3C51CBBFF5" - "OwnerKey" = "8:_A2AF05C0FCE4493F1F87A7FF624D9407" + "OwnerKey" = "8:_2558C9F4B1EA8F57C5409415B3067E63" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -935,7 +935,7 @@ "Entry" { "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_A2AF05C0FCE4493F1F87A7FF624D9407" + "OwnerKey" = "8:_2558C9F4B1EA8F57C5409415B3067E63" "MsmSig" = "8:_UNDEFINED" } "Entry" @@ -2331,6 +2331,37 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } + "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_2558C9F4B1EA8F57C5409415B3067E63" + { + "AssemblyRegister" = "3:1" + "AssemblyIsInGAC" = "11:FALSE" + "AssemblyAsmDisplayName" = "8:Windows, Version=255.255.255.255, Culture=neutral" + "ScatterAssemblies" + { + "_2558C9F4B1EA8F57C5409415B3067E63" + { + "Name" = "8:Windows.winmd" + "Attributes" = "3:512" + } + } + "SourcePath" = "8:Windows.winmd" + "TargetName" = "8:" + "Tag" = "8:" + "Folder" = "8:_CC99BD1F96094477A96E2C776860F8D0" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_26F75C40DABBCB97B3C6F0880A9D2171" { "AssemblyRegister" = "3:1" @@ -4315,37 +4346,6 @@ "IsDependency" = "11:TRUE" "IsolateTo" = "8:" } - "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A2AF05C0FCE4493F1F87A7FF624D9407" - { - "AssemblyRegister" = "3:1" - "AssemblyIsInGAC" = "11:FALSE" - "AssemblyAsmDisplayName" = "8:Windows, Version=255.255.255.255, Culture=neutral" - "ScatterAssemblies" - { - "_A2AF05C0FCE4493F1F87A7FF624D9407" - { - "Name" = "8:Windows.winmd" - "Attributes" = "3:512" - } - } - "SourcePath" = "8:Windows.winmd" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_CC99BD1F96094477A96E2C776860F8D0" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_A317CF6BCF05DF7688B5CAB752897CD0" { "AssemblyRegister" = "3:1" @@ -5693,15 +5693,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:BluetoothDMM For Windows" - "ProductCode" = "8:{483C4B5C-C0B8-4853-90A6-25DDA272C291}" - "PackageCode" = "8:{543310B9-79DC-4854-9991-38DC43DA8356}" + "ProductCode" = "8:{02E0D7C8-47A9-4EDE-86AE-56CDDE41200F}" + "PackageCode" = "8:{56649FE2-CCD7-4732-95A0-D3074AC00037}" "UpgradeCode" = "8:{DB0CAFB1-E076-41B0-B7C2-DC4B12320C5B}" "AspNetVersion" = "8:4.0.30319.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:FALSE" "InstallAllUsers" = "11:TRUE" - "ProductVersion" = "8:1.25" + "ProductVersion" = "8:1.26" "Manufacturer" = "8:WebSpiderTeam" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:https://github.com/webspiderteam/Bluetooth-DMM-For-Windows"