diff --git a/app/Config.cs b/app/Config.cs index 74727b3..be3c76e 100644 --- a/app/Config.cs +++ b/app/Config.cs @@ -17,7 +17,7 @@ namespace ParsecVDisplay public static int DisplayCount { - get => GetInt(nameof(DisplayCount)); + get => GetInt(nameof(DisplayCount), 0); set => SetInt(nameof(DisplayCount), value); } diff --git a/app/Languages/en.xaml b/app/Languages/en.xaml index 20f76a8..af97b74 100644 --- a/app/Languages/en.xaml +++ b/app/Languages/en.xaml @@ -28,6 +28,7 @@ Remove last display Options Run on startup + Restore displays Fallback display Keep screen on Check for update diff --git a/app/Languages/vi.xaml b/app/Languages/vi.xaml index dacb369..9130eab 100644 --- a/app/Languages/vi.xaml +++ b/app/Languages/vi.xaml @@ -29,6 +29,7 @@ Bỏ màn hình cuối Tùy chọn Chạy cùng hệ thống + Khôi phục lại màn hình Màn hình dự phòng Luôn sáng màn hình Kiểm tra cập nhật diff --git a/app/Languages/zh.xaml b/app/Languages/zh.xaml index 06a2843..f8ce42b 100644 --- a/app/Languages/zh.xaml +++ b/app/Languages/zh.xaml @@ -28,6 +28,7 @@ 删除最后一个虚拟显示器 选项 开机启动 + 恢复上次关闭的显示 备用显示 保持屏幕开启 检查更新 diff --git a/app/Tray.cs b/app/Tray.cs index 29ab158..791a493 100644 --- a/app/Tray.cs +++ b/app/Tray.cs @@ -3,6 +3,7 @@ using System.Windows.Forms; using System.Drawing; using System.Threading; using System.Threading.Tasks; +using Microsoft.Win32; namespace ParsecVDisplay { @@ -18,6 +19,7 @@ namespace ParsecVDisplay System.Windows.Forms.Timer VddTimer; ToolStripMenuItem MI_RunOnStartup; + ToolStripMenuItem MI_RestoreDisplays; ToolStripMenuItem MI_FallbackDisplay; ToolStripMenuItem MI_KeepScreenOn; @@ -27,6 +29,8 @@ namespace ParsecVDisplay // Remove last display // -------------- // Options > Run on startup + // | Restore displays + // | -------------- // | Fallback display // | Keep screen on // Check update @@ -70,6 +74,9 @@ namespace ParsecVDisplay { (MI_RunOnStartup = new ToolStripMenuItem("t_run_on_startup", null, OptionsCheck) { CheckOnClick = true, Checked = Config.RunOnStartup }), + (MI_RestoreDisplays = new ToolStripMenuItem("t_restore_displays", + null, OptionsCheck) { CheckOnClick = true, Checked = Config.DisplayCount >= 0 }), + new ToolStripSeparator(), (MI_FallbackDisplay = new ToolStripMenuItem("t_fallback_display", null, OptionsCheck) { CheckOnClick = true, Checked = Config.FallbackDisplay }), (MI_KeepScreenOn = new ToolStripMenuItem("t_keep_screen_on", @@ -88,12 +95,23 @@ namespace ParsecVDisplay TrayIcon.DoubleClick += delegate { ShowApp(); }; TrayIcon.Visible = true; + SystemEvents.SessionEnding += SaveDisplayCount; + SystemEvents.SessionSwitch += SaveDisplayCount; + SystemEvents.DisplaySettingsChanged += SaveDisplayCount; + Invoke(async () => { - await Task.Delay(2000); + await Task.Delay(1000); + + var savedCount = Config.DisplayCount; + if (savedCount >= 0) + { + for (int i = 0; i < savedCount; i++) + ParsecVDD.AddDisplay(out var _); + } + CheckUpdate(null, null); }); - } void VddTimer_Tick(object sender, EventArgs e) @@ -174,12 +192,23 @@ namespace ParsecVDisplay { if (sender == MI_RunOnStartup) Config.RunOnStartup = MI_RunOnStartup.Checked; + else if (sender == MI_RestoreDisplays) + Config.DisplayCount = ParsecVDD.GetDisplays().Count; else if (sender == MI_FallbackDisplay) Config.FallbackDisplay = MI_FallbackDisplay.Checked; else if (sender == MI_KeepScreenOn) Config.KeepScreenOn = MI_KeepScreenOn.Checked; } + void SaveDisplayCount(object sender, EventArgs e) + { + if (Config.DisplayCount >= 0) + { + var displays = ParsecVDD.GetDisplays(); + Config.DisplayCount = displays.Count; + } + } + public void ShowApp() { MainWindow.Instance?.Dispatcher @@ -219,6 +248,10 @@ namespace ParsecVDisplay void Exit(object sender, EventArgs e) { + SystemEvents.SessionEnding -= SaveDisplayCount; + SystemEvents.SessionSwitch -= SaveDisplayCount; + SystemEvents.DisplaySettingsChanged -= SaveDisplayCount; + var displays = ParsecVDD.GetDisplays(); if (displays.Count > 0) { @@ -231,6 +264,9 @@ namespace ParsecVDisplay var index = displays[i].DisplayIndex; ParsecVDD.RemoveDisplay(index); } + + if (Config.DisplayCount >= 0) + Config.DisplayCount = displays.Count; } VddTimer.Tick -= VddTimer_Tick;