From 21a073ed1e81dc036eb2766c4d64b4600c5c26b5 Mon Sep 17 00:00:00 2001 From: Yizhao Han Date: Mon, 23 Apr 2018 10:01:42 +0800 Subject: [PATCH] Update Version to 1.0.13 Add option to show or hide tray icon. --- NetSpeedMonitor/App.xaml.cs | 54 +++++++----- NetSpeedMonitor/Properties/AssemblyInfo.cs | 4 +- .../Properties/Settings.Designer.cs | 12 +++ NetSpeedMonitor/Properties/Settings.settings | 3 + NetSpeedMonitor/Resources/StringResource.xaml | 1 + .../Resources/StringResource.zh-CN.xaml | 1 + NetSpeedMonitor/Service/Languages.cs | 29 ++++++- NetSpeedMonitor/Service/PortProcessMap.cs | 47 ++++++++-- NetSpeedMonitor/View/DetailWindow.xaml.cs | 77 ++++------------ NetSpeedMonitor/View/MainWindow.xaml | 1 + NetSpeedMonitor/View/MainWindow.xaml.cs | 87 +++++++++++++++++-- .../View/ProcessDetailWindow.xaml.cs | 6 +- NetSpeedMonitor/app.config | 5 +- .../NetSpeedMonitorSetup.vdproj | 8 +- 14 files changed, 226 insertions(+), 109 deletions(-) diff --git a/NetSpeedMonitor/App.xaml.cs b/NetSpeedMonitor/App.xaml.cs index ae05970..c7a0586 100644 --- a/NetSpeedMonitor/App.xaml.cs +++ b/NetSpeedMonitor/App.xaml.cs @@ -64,7 +64,7 @@ private void Application_Startup(object sender, StartupEventArgs e) { if (Int32.TryParse(e.Args[1], out int id)) { - ProcessDetailWindow w = new ProcessDetailWindow(id, null); + ProcessDetailWindow w = new ProcessDetailWindow(id); Dispatcher.InvokeAsync(new Action(() => { w.Show(); })); } } @@ -94,7 +94,7 @@ private void Application_Startup(object sender, StartupEventArgs e) { Dispatcher.InvokeAsync(new Action(() => { - InitViewAndNeedCloseResourcees(); + InitViewAndNeedClosedResourcees(); welcomeWindow.ReduceAndClose(new Point(mainWindow.Left + mainWindow.Width / 2, mainWindow.Top + mainWindow.Height / 2)); })); } @@ -138,12 +138,9 @@ private void InitLanguage() } } - private void InitViewAndNeedCloseResourcees() + private void InitViewAndNeedClosedResourcees() { mainWindow = new MainWindow(); - detailWindow = new DetailWindow(mainWindow); - mainWindow.SetDetailWindow(detailWindow); - detailWindow.IsVisibleChanged += DetailWindow_IsVisibleChanged; if (Settings.Default.MainWindowLeft > -200000 && Settings.Default.MainWindowTop > -200000) { mainWindow.Left = Settings.Default.MainWindowLeft; @@ -241,12 +238,15 @@ private void CheckScreenCount() } } - private void DetailWindow_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) + public void NeedPortProcessMap(object sender, bool need) { - portProcessMap.Enabled = detailWindow.IsVisible; - if (!detailWindow.IsVisible) + if (need) { - mainWindow.TryToEdgeHide(); + portProcessMap.RegisterCustomer(sender); + } + else + { + portProcessMap.UnRegisterCustomer(sender); } } @@ -258,6 +258,10 @@ private void InitializeTray() { Checked = Settings.Default.edgeHide }; + menuShowTrayIcon = new System.Windows.Forms.MenuItem(FindResource("ShowTrayIcon").ToString(), TrayMenu_Click) + { + Checked = Settings.Default.ShowTrayIcon + }; menuStartOnBoot = new System.Windows.Forms.MenuItem(FindResource("StartOnBoot").ToString(), TrayMenu_Click) { Checked = Settings.Default.startOnBoot @@ -270,7 +274,7 @@ private void InitializeTray() Tag = "" }; menuLanguage.MenuItems.Add(menuDefault); - List languages = Languages.getLanguages(); + List languages = Languages.GetLanguages(); foreach (OneLanguage i in languages) { System.Windows.Forms.MenuItem menuItem = new System.Windows.Forms.MenuItem() @@ -297,13 +301,13 @@ private void InitializeTray() menuAbout = new System.Windows.Forms.MenuItem(FindResource("AboutNetSpeedMonitor").ToString(), TrayMenu_Click); System.Windows.Forms.ContextMenu menu = new System.Windows.Forms.ContextMenu(new System.Windows.Forms.MenuItem[] { - menuStartOnBoot, menuEdgeHide, menuLanguage, menuUpdate, menuAbout, menuExit }); + menuStartOnBoot, menuEdgeHide,menuShowTrayIcon, menuLanguage, menuUpdate, menuAbout, menuExit }); notifyIcon = new System.Windows.Forms.NotifyIcon { Icon = new System.Drawing.Icon(GetResourceStream(new Uri("pack://application:,,,/icon.ico", UriKind.RelativeOrAbsolute)).Stream), ContextMenu = menu, - Visible = true + Visible = Settings.Default.ShowTrayIcon }; } @@ -365,7 +369,6 @@ public void TryToExit() { Microsoft.Win32.SystemEvents.DisplaySettingsChanged -= SystemEvents_DisplaySettingsChanged; SystemParameters.StaticPropertyChanged -= SystemParameters_StaticPropertyChanged; - portProcessMap.Enabled = false; mainWindow.RegisterAppBar(false); timer.Enabled = false; notifyIcon.Dispose(); @@ -375,6 +378,13 @@ public void TryToExit() t.Start(); } + public void TryToSetShowTrayIcon(bool showTrayIcon) + { + Settings.Default.ShowTrayIcon = showTrayIcon; + Settings.Default.Save(); + notifyIcon.Visible = showTrayIcon; + } + public void TryToSetEdgeHide(bool edgeHide) { Settings.Default.edgeHide = edgeHide; @@ -407,6 +417,12 @@ private void TrayMenu_Click(object sender, EventArgs e) mainWindow.WindowMenuEdgeHide.IsChecked = menuEdgeHide.Checked; TryToSetEdgeHide(menuEdgeHide.Checked); } + else if(sender == menuShowTrayIcon) + { + menuShowTrayIcon.Checked = !menuShowTrayIcon.Checked; + mainWindow.WindowMenuShowTrayIcon.IsChecked = menuShowTrayIcon.Checked; + TryToSetShowTrayIcon(menuShowTrayIcon.Checked); + } else if (sender == menuAutoUpdate) { menuAutoUpdate.Checked = !menuAutoUpdate.Checked; @@ -428,20 +444,14 @@ private void Timer_Elapsed(object sender, ElapsedEventArgs e) UDStatistic statistics = udMap.NextStatistic(10, portProcessMap); Dispatcher.Invoke(new Action(() => { - mainWindow.UploadLabel.Content = Tool.GetNetSpeedString(statistics.upload, statistics.timeSpan); - mainWindow.DownloadLabel.Content = Tool.GetNetSpeedString(statistics.download, statistics.timeSpan); - if (detailWindow.Visibility == Visibility.Visible) - { - detailWindow.NewData(statistics.items, statistics.timeSpan); - } + mainWindow.NewData(statistics); })); } - public System.Windows.Forms.MenuItem menuExit, menuEdgeHide, menuStartOnBoot, menuAutoUpdate, menuCheckUpdate, menuAbout; + public System.Windows.Forms.MenuItem menuExit, menuEdgeHide, menuShowTrayIcon, menuStartOnBoot, menuAutoUpdate, menuCheckUpdate, menuAbout; private System.Windows.Forms.NotifyIcon notifyIcon; private MainWindow mainWindow; - private DetailWindow detailWindow; private WelcomeWindow welcomeWindow; private CaptureManager captureManager; private UDMap udMap = new UDMap(); diff --git a/NetSpeedMonitor/Properties/AssemblyInfo.cs b/NetSpeedMonitor/Properties/AssemblyInfo.cs index f8ecd9f..f49d241 100644 --- a/NetSpeedMonitor/Properties/AssemblyInfo.cs +++ b/NetSpeedMonitor/Properties/AssemblyInfo.cs @@ -51,5 +51,5 @@ // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 // 方法是按如下所示使用“*”: : // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.1.2")] -[assembly: AssemblyFileVersion("1.0.1.2")] +[assembly: AssemblyVersion("1.0.1.3")] +[assembly: AssemblyFileVersion("1.0.1.3")] diff --git a/NetSpeedMonitor/Properties/Settings.Designer.cs b/NetSpeedMonitor/Properties/Settings.Designer.cs index 2399ae1..782eb49 100644 --- a/NetSpeedMonitor/Properties/Settings.Designer.cs +++ b/NetSpeedMonitor/Properties/Settings.Designer.cs @@ -94,5 +94,17 @@ public sealed partial class Settings : global::System.Configuration.ApplicationS this["AutoUpdate"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool ShowTrayIcon { + get { + return ((bool)(this["ShowTrayIcon"])); + } + set { + this["ShowTrayIcon"] = value; + } + } } } diff --git a/NetSpeedMonitor/Properties/Settings.settings b/NetSpeedMonitor/Properties/Settings.settings index 58fd994..8424d58 100644 --- a/NetSpeedMonitor/Properties/Settings.settings +++ b/NetSpeedMonitor/Properties/Settings.settings @@ -20,5 +20,8 @@ True + + True + \ No newline at end of file diff --git a/NetSpeedMonitor/Resources/StringResource.xaml b/NetSpeedMonitor/Resources/StringResource.xaml index 5828775..98b2380 100644 --- a/NetSpeedMonitor/Resources/StringResource.xaml +++ b/NetSpeedMonitor/Resources/StringResource.xaml @@ -30,4 +30,5 @@ OK Version Current Version: + Show tray icon \ No newline at end of file diff --git a/NetSpeedMonitor/Resources/StringResource.zh-CN.xaml b/NetSpeedMonitor/Resources/StringResource.zh-CN.xaml index 8aba226..5b0dc4e 100644 --- a/NetSpeedMonitor/Resources/StringResource.zh-CN.xaml +++ b/NetSpeedMonitor/Resources/StringResource.zh-CN.xaml @@ -29,4 +29,5 @@ 确定 版本 当前版本: + 显示托盘图标 \ No newline at end of file diff --git a/NetSpeedMonitor/Service/Languages.cs b/NetSpeedMonitor/Service/Languages.cs index 02e6822..9127b40 100644 --- a/NetSpeedMonitor/Service/Languages.cs +++ b/NetSpeedMonitor/Service/Languages.cs @@ -9,9 +9,16 @@ namespace USTC.Software.hanyizhao.NetSpeedMonitor { + /// + /// Multi-language resources + /// class Languages { - public static List getLanguages() + /// + /// Get language list. + /// + /// Lnguage list + public static List GetLanguages() { List result = new List { @@ -21,6 +28,10 @@ public static List getLanguages() return result; } + /// + /// Get default language resource according to language of PC. + /// + /// Language resource according to language of PC. Or null if don't support the language of PC. public static ResourceDictionary GetFromDefaultLanguage() { ResourceDictionary result = null; @@ -39,6 +50,11 @@ public static ResourceDictionary GetFromDefaultLanguage() return result; } + /// + /// Get language resource. + /// + /// The name of language resource file. + /// Language resource or null public static ResourceDictionary GetResourceDictionary(String fileName) { ResourceDictionary result = null; @@ -60,10 +76,19 @@ public static ResourceDictionary GetResourceDictionary(String fileName) } } + /// + /// One supported language + /// class OneLanguage { - + /// + /// The name of language resource file. + /// public String FileName { get { return fileName; } } + + /// + /// The name used to display to user. + /// public String ShowName { get { return showName; } } public OneLanguage(String fileName, String showName) diff --git a/NetSpeedMonitor/Service/PortProcessMap.cs b/NetSpeedMonitor/Service/PortProcessMap.cs index 2cb8bc8..75e8202 100644 --- a/NetSpeedMonitor/Service/PortProcessMap.cs +++ b/NetSpeedMonitor/Service/PortProcessMap.cs @@ -30,7 +30,7 @@ public static PortProcessMap GetInstance() } /// - /// Start or Stop mapping. (Reduce the cost of CPU) + /// Check whether this class is working. /// public bool Enabled { @@ -41,12 +41,46 @@ public bool Enabled return timer.Enabled; } } - set + } + + /// + /// Let this class know that the object needs this class. + /// + /// the object that needs this class + public void RegisterCustomer(object customer) + { + lock (timerLock) { - lock(timerLock) - { - timer.Enabled = value; - } + Console.WriteLine("PortProessMap Add Customer"); + customers.Add(customer); + CheckTimer(); + } + } + + /// + /// Let this class know that the object does not need this class any more.(Reduce the cost of CPU) + /// + /// the object that does not need this class + public void UnRegisterCustomer(object customer) + { + lock(timerLock) + { + Console.WriteLine("PortProessMap Remove Customer"); + customers.Remove(customer); + CheckTimer(); + } + } + + private void CheckTimer() + { + Console.WriteLine("PortProcessMap CheckTimer count:" + customers.Count); + if(customers.Count == 0) + { + timer.Enabled = false; + } + else + { + timer.Enabled = true; } } @@ -124,6 +158,7 @@ private void Timer_Elapsed(object sender, ElapsedEventArgs e) } + private HashSet customers = new HashSet(); private readonly object timerLock = new object(); private Timer timer; private Dictionary map; diff --git a/NetSpeedMonitor/View/DetailWindow.xaml.cs b/NetSpeedMonitor/View/DetailWindow.xaml.cs index 3240fc1..f13ed5f 100644 --- a/NetSpeedMonitor/View/DetailWindow.xaml.cs +++ b/NetSpeedMonitor/View/DetailWindow.xaml.cs @@ -21,9 +21,9 @@ namespace USTC.Software.hanyizhao.NetSpeedMonitor /// public partial class DetailWindow : Window { - public DetailWindow(MainWindow mainWindow) + public DetailWindow(ICanMoveDetailWindowToRightPlace canMove) { - this.mainWindow = mainWindow; + this.canMove = canMove; asynShow = new Run(AsynShow); asynHide = new Run(AsynHide); InitializeComponent(); @@ -37,6 +37,10 @@ private void DetailWindow_IsVisibleChanged(object sender, DependencyPropertyChan { idMap.Clear(); } + if(Application.Current is App app) + { + app.NeedPortProcessMap(this, this.IsVisible); + } } private void InitializeContent() @@ -104,12 +108,12 @@ private void DetailLabel_MouseDown(object sender, MouseButtonEventArgs e) int id = localItems[row].ProcessID; if (idMap.TryGetValue(id, out ProcessView process)) { - ProcessDetailWindow win = new ProcessDetailWindow(process, mainWindow); + ProcessDetailWindow win = new ProcessDetailWindow(process); win.Show(); } else { - ProcessDetailWindow win = new ProcessDetailWindow(id, mainWindow); + ProcessDetailWindow win = new ProcessDetailWindow(id); win.Show(); } } @@ -217,64 +221,10 @@ public void OthersWantHide(bool now) } } } - - private void MoveToSafePlace() - { - Thickness pa = mainWindow.windowMargin; - Rect mainRect = new Rect(mainWindow.Left - pa.Left, mainWindow.Top - pa.Top, - mainWindow.Width + pa.Left + pa.Right, mainWindow.Height + pa.Top + pa.Bottom); - Rect workArea = SystemParameters.WorkArea; - if (workArea.Bottom - mainRect.Bottom >= Height)//bellow - { - Top = mainRect.Bottom; - if (mainRect.Left + Width <= workArea.Right) - { - Left = mainRect.Left; - } - else - { - Left = mainRect.Right - Width; - } - - } - else if (mainRect.Top - workArea.Top >= Height)//top - { - Top = mainRect.Top - Height; - if (mainRect.Left + Width <= workArea.Right) - { - Left = mainRect.Left; - } - else - { - Left = mainRect.Right - Width; - } - } - else//left or right - { - if (mainRect.Right + Width <= workArea.Right)//right - { - Left = mainRect.Right; - } - else - { - Left = mainRect.Left - Width;//left - } - if (mainRect.Top + Height <= workArea.Bottom) - { - Top = mainRect.Top; - } - else - { - Top = workArea.Bottom - Height; - } - } - - - } - + private void MyShow() { - MoveToSafePlace(); + canMove.MoveDetailWindowToRightPlace(this); Show(); } @@ -343,7 +293,7 @@ private void RefreshDetailButton(Point p) - private MainWindow mainWindow; + private ICanMoveDetailWindowToRightPlace canMove; private Run asynShow, asynHide; @@ -393,4 +343,9 @@ public class ContentListViewItem public string DOWNLOAD { get; set; } public string UPLOAD { get; set; } } + + public interface ICanMoveDetailWindowToRightPlace + { + void MoveDetailWindowToRightPlace(DetailWindow dw); + } } diff --git a/NetSpeedMonitor/View/MainWindow.xaml b/NetSpeedMonitor/View/MainWindow.xaml index d40a960..445ce18 100644 --- a/NetSpeedMonitor/View/MainWindow.xaml +++ b/NetSpeedMonitor/View/MainWindow.xaml @@ -21,6 +21,7 @@ + diff --git a/NetSpeedMonitor/View/MainWindow.xaml.cs b/NetSpeedMonitor/View/MainWindow.xaml.cs index fbd97c2..e4a181c 100644 --- a/NetSpeedMonitor/View/MainWindow.xaml.cs +++ b/NetSpeedMonitor/View/MainWindow.xaml.cs @@ -20,25 +20,40 @@ namespace USTC.Software.hanyizhao.NetSpeedMonitor /// /// MainWindow.xaml 的交互逻辑 /// - public partial class MainWindow : Window + public partial class MainWindow : Window, ICanMoveDetailWindowToRightPlace { public MainWindow() { InitializeComponent(); InitializeWindowMenu(); + detailWindow = new DetailWindow(this); + detailWindow.IsVisibleChanged += DetailWindow_IsVisibleChanged; } - - public void SetDetailWindow(DetailWindow detail) + + private void DetailWindow_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { - detailWindow = detail; + if(detailWindow.Visibility == Visibility.Hidden) + { + TryToEdgeHide(); + } + } + + public void NewData(UDStatistic statistics) + { + UploadLabel.Content = Tool.GetNetSpeedString(statistics.upload, statistics.timeSpan); + DownloadLabel.Content = Tool.GetNetSpeedString(statistics.download, statistics.timeSpan); + if (detailWindow.Visibility == Visibility.Visible) + { + detailWindow.NewData(statistics.items, statistics.timeSpan); + } } - private void InitializeWindowMenu() { WindowMenuStartOnBoot.IsChecked = Settings.Default.startOnBoot; WindowMenuEdgeHide.IsChecked = Settings.Default.edgeHide; - List languages = Languages.getLanguages(); + WindowMenuShowTrayIcon.IsChecked = Settings.Default.ShowTrayIcon; + List languages = Languages.GetLanguages(); String nowLanguageFile = Settings.Default.language; foreach(OneLanguage i in languages) { @@ -47,7 +62,7 @@ private void InitializeWindowMenu() Header = i.ShowName, IsCheckable = true, IsChecked = i.FileName == nowLanguageFile, - Tag = i.FileName, + Tag = i.FileName }; menuItem.Click += MenuItem_ChangeLanguageClick; WindowMenuLanguage.Items.Add(menuItem); @@ -98,6 +113,12 @@ private void MenuItem_Click(object sender, RoutedEventArgs e) app.menuEdgeHide.Checked = edgeHide; app.TryToSetEdgeHide(edgeHide); } + else if(sender == WindowMenuShowTrayIcon) + { + bool showTrayIcon = WindowMenuShowTrayIcon.IsChecked; + app.menuShowTrayIcon.Checked = showTrayIcon; + app.TryToSetShowTrayIcon(showTrayIcon); + } else if (sender == WindowMenuAutoUpdate) { bool autoUpdate = WindowMenuAutoUpdate.IsChecked; @@ -326,6 +347,58 @@ private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e.Cancel = true; } + void ICanMoveDetailWindowToRightPlace.MoveDetailWindowToRightPlace(DetailWindow dw) + { + Thickness pa = windowMargin; + Rect mainRect = new Rect(Left - pa.Left, Top - pa.Top, + Width + pa.Left + pa.Right, Height + pa.Top + pa.Bottom); + Rect workArea = SystemParameters.WorkArea; + if (workArea.Bottom - mainRect.Bottom >= dw.Height)//bellow + { + dw.Top = mainRect.Bottom; + if (mainRect.Left + dw.Width <= workArea.Right) + { + dw.Left = mainRect.Left; + } + else + { + dw.Left = mainRect.Right - dw.Width; + } + + } + else if (mainRect.Top - workArea.Top >= dw.Height)//top + { + dw.Top = mainRect.Top - dw.Height; + if (mainRect.Left + dw.Width <= workArea.Right) + { + dw.Left = mainRect.Left; + } + else + { + dw.Left = mainRect.Right - dw.Width; + } + } + else//left or right + { + if (mainRect.Right + dw.Width <= workArea.Right)//right + { + dw.Left = mainRect.Right; + } + else + { + dw.Left = mainRect.Left - dw.Width;//left + } + if (mainRect.Top + dw.Height <= workArea.Bottom) + { + dw.Top = mainRect.Top; + } + else + { + dw.Top = workArea.Bottom - dw.Height; + } + } + } + public readonly Thickness windowMargin = new Thickness(-3, 3, -3, 0); } } diff --git a/NetSpeedMonitor/View/ProcessDetailWindow.xaml.cs b/NetSpeedMonitor/View/ProcessDetailWindow.xaml.cs index 681796c..ab3c54d 100644 --- a/NetSpeedMonitor/View/ProcessDetailWindow.xaml.cs +++ b/NetSpeedMonitor/View/ProcessDetailWindow.xaml.cs @@ -23,14 +23,13 @@ namespace USTC.Software.hanyizhao.NetSpeedMonitor /// public partial class ProcessDetailWindow : Window { - public ProcessDetailWindow(int id, MainWindow mainWindow) : this(new ProcessView(id), mainWindow) + public ProcessDetailWindow(int id) : this(new ProcessView(id)) { } - public ProcessDetailWindow(ProcessView tempP, MainWindow mainWindow) + public ProcessDetailWindow(ProcessView tempP) { - this.mainWindow = mainWindow; this.process = tempP; InitializeComponent(); ProcessID.Text = process.ID + ""; @@ -95,7 +94,6 @@ private void OpenButton_RunAsAdmin_Click(object sender, RoutedEventArgs e) } private ProcessView process; - private MainWindow mainWindow; private void Window_SourceInitialized(object sender, EventArgs e) { diff --git a/NetSpeedMonitor/app.config b/NetSpeedMonitor/app.config index 0f741fe..80249f4 100644 --- a/NetSpeedMonitor/app.config +++ b/NetSpeedMonitor/app.config @@ -20,11 +20,14 @@ -200001 - + True + + True + diff --git a/NetSpeedMonitorSetup/NetSpeedMonitorSetup.vdproj b/NetSpeedMonitorSetup/NetSpeedMonitorSetup.vdproj index 6dd9276..e75a284 100644 --- a/NetSpeedMonitorSetup/NetSpeedMonitorSetup.vdproj +++ b/NetSpeedMonitorSetup/NetSpeedMonitorSetup.vdproj @@ -359,15 +359,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:NetSpeedMonitor" - "ProductCode" = "8:{BAFCE074-E841-4BC1-A4F5-61ECC89D7F00}" - "PackageCode" = "8:{DA4E76A2-408C-4F39-8019-B3390358CB85}" + "ProductCode" = "8:{C0BE2BE8-AC1A-41FD-9C36-15E14FCCDD5B}" + "PackageCode" = "8:{97B8A5DE-9F9F-4679-9BAB-3AE84E7BFE95}" "UpgradeCode" = "8:{E0A6FD93-BFA5-4E27-9D33-24971C4969C0}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.0.12" + "ProductVersion" = "8:1.0.13" "Manufacturer" = "8:HanYizhao" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" @@ -923,7 +923,7 @@ { "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_AF6B2EE60F62462F871550AF0FFE9D7F" { - "SourcePath" = "8:..\\NetSpeedMonitor\\obj\\Release\\NetSpeedMonitor.exe" + "SourcePath" = "8:..\\NetSpeedMonitor\\obj\\Debug\\NetSpeedMonitor.exe" "TargetName" = "8:" "Tag" = "8:" "Folder" = "8:_4CA1A5EE6F314ED1BF1DB85025AAA75A"