using System; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using BetterSeewo.Manager.Services; namespace BetterSeewo.Manager { public partial class MainWindow : Window { private readonly PatchService _patchService = new(); private readonly InkService _inkService = new(); private readonly CustomConversionService _conversionService = new(); private readonly ActivationService _activationService = new(); public MainWindow() { InitializeComponent(); Loaded += OnLoaded; } private async void OnLoaded(object sender, RoutedEventArgs e) { await RefreshInstallStatusAsync(); LoadInkSettings(); } private void TabChanged(object sender, RoutedEventArgs e) { if (sender == TabInstall) ShowPage(PageInstall); else if (sender == TabInk) ShowPage(PageInk); else if (sender == TabConvert) ShowPage(PageConvert); else if (sender == TabTouch) ShowPage(PageTouch); else if (sender == TabActivate) ShowPage(PageActivate); } private void ShowPage(StackPanel page) { foreach (var p in new[] { PageInstall, PageInk, PageConvert, PageTouch, PageActivate }) { if (p != null) p.Visibility = p == page ? Visibility.Visible : Visibility.Collapsed; } } private void Minimize_Click(object s, RoutedEventArgs e) => WindowState = WindowState.Minimized; private void Maximize_Click(object s, RoutedEventArgs e) => WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized; private void Close_Click(object s, RoutedEventArgs e) => Close(); // Install Management private async Task RefreshInstallStatusAsync() { var installed = await Task.Run(() => _patchService.IsInstalled()); InstallBtn.IsEnabled = !installed; UninstallBtn.IsEnabled = installed; InstallStatusText.Text = installed ? "补丁已安装" : "补丁未安装"; if (installed) { var m = await Task.Run(() => _patchService.GetManifest()); PatchDetailText.Text = $"版本: {m.Version} | 安装时间: {m.InstallTime} | 备份: {m.Backups.Count} 个 | 注册表: {m.RegistryKeys.Count} 项"; } else PatchDetailText.Text = "尚未安装补丁。点击「安装补丁」将备份关键配置并应用增强。"; } private async void InstallPatch_Click(object s, RoutedEventArgs e) { var progress = new Progress(msg => Dispatcher.Invoke(() => PatchDetailText.Text = msg)); InstallBtn.IsEnabled = false; UninstallBtn.IsEnabled = false; InstallStatusText.Text = "正在安装..."; try { await _patchService.InstallAsync(progress); InstallStatusText.Text = "补丁已安装"; UninstallBtn.IsEnabled = true; await CreateShortcutAsync(); } catch (Exception ex) { InstallStatusText.Text = "安装失败"; PatchDetailText.Text = ex.Message; InstallBtn.IsEnabled = true; } } private async void UninstallPatch_Click(object s, RoutedEventArgs e) { var result = MessageBox.Show(this, "确定要卸载补丁吗?\n将还原备份文件并清除注册表修改。", "卸载确认", MessageBoxButton.YesNo, MessageBoxImage.Question); if (result != MessageBoxResult.Yes) return; var progress = new Progress(msg => Dispatcher.Invoke(() => PatchDetailText.Text = msg)); InstallBtn.IsEnabled = false; UninstallBtn.IsEnabled = false; InstallStatusText.Text = "正在卸载..."; try { await _patchService.UninstallAsync(progress); InstallStatusText.Text = "补丁已卸载"; InstallBtn.IsEnabled = true; PatchDetailText.Text = "卸载完成。建议重启希沃白板。"; } catch (Exception ex) { InstallStatusText.Text = "卸载失败"; PatchDetailText.Text = ex.Message; UninstallBtn.IsEnabled = true; } } private async Task CreateShortcutAsync() { try { var ps1 = Path.GetTempFileName() + ".ps1"; var exePath = Environment.ProcessPath; var desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); var lnkPath = Path.Combine(desktop, "Better-Seewo Manager.lnk"); File.WriteAllText(ps1, "$ws = New-Object -ComObject WScript.Shell\n" + "$s = $ws.CreateShortcut(\"" + lnkPath.Replace("'", "''") + "\")\n" + "$s.TargetPath = \"" + exePath.Replace("'", "''") + "\"\n" + "$s.Description = \"Better-Seewo 插件管理工具\"\n" + "$s.Save()"); var psi = new System.Diagnostics.ProcessStartInfo { FileName = "powershell", Arguments = $"-ExecutionPolicy Bypass -File \"{ps1}\"", UseShellExecute = false, CreateNoWindow = true }; using var proc = System.Diagnostics.Process.Start(psi); proc?.WaitForExit(5000); try { File.Delete(ps1); } catch { } } catch { } } // Ink Management private void LoadInkSettings() { var settings = InkSettings.Load(); AutoSaveEnabled.IsChecked = settings.AutoSaveEnabled; AutoSaveInterval.Text = settings.AutoSaveIntervalMinutes.ToString(); AutoSavePath.Text = settings.SaveDirectory; } private async void ExportInk_Click(object s, RoutedEventArgs e) { var dialog = new Microsoft.Win32.SaveFileDialog { Title = "导出墨迹", Filter = "墨迹文件|*.ink.json|JSON|*.json", DefaultExt = ".ink.json" }; if (dialog.ShowDialog() == true) { await Task.Run(() => _inkService.ExportInkAsync(dialog.FileName)); InkStatus.Text = $"已导出: {Path.GetFileName(dialog.FileName)}"; } } private async void ImportInk_Click(object s, RoutedEventArgs e) { var dialog = new Microsoft.Win32.OpenFileDialog { Title = "导入墨迹", Filter = "墨迹文件|*.ink.json|JSON|*.json" }; if (dialog.ShowDialog() == true) { await Task.Run(() => _inkService.ImportInkAsync(dialog.FileName)); InkStatus.Text = "墨迹已导入"; } } private void InkSettings_Click(object s, RoutedEventArgs e) { var installed = _patchService.IsInstalled(); if (!installed) { MessageBox.Show(this, "请先安装补丁,自动保存功能需要补丁支持。", "提示", MessageBoxButton.OK, MessageBoxImage.Information); return; } var enabled = AutoSaveEnabled.IsChecked == true; var intervalText = AutoSaveInterval.Text; if (enabled && (!int.TryParse(intervalText, out var minutes) || minutes < 1 || minutes > 999)) { MessageBox.Show(this, "保存间隔必须是 1-999 之间的整数。", "输入错误", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var settings = new InkSettings { AutoSaveEnabled = enabled, AutoSaveIntervalMinutes = enabled && int.TryParse(intervalText, out var m) ? m : 5, SaveDirectory = AutoSavePath.Text }; settings.Save(); InkStatus.Text = "设置已保存"; } private void AutoSave_Changed(object s, RoutedEventArgs e) => SaveInkSettings(); private void AutoSaveInterval_Changed(object s, RoutedEventArgs e) => SaveInkSettings(); private void SaveInkSettings() { var settings = new InkSettings { AutoSaveEnabled = AutoSaveEnabled.IsChecked == true, AutoSaveIntervalMinutes = int.TryParse(AutoSaveInterval.Text, out var m) ? m : 5, SaveDirectory = AutoSavePath.Text }; settings.Save(); } private void SelectInkDir_Click(object s, RoutedEventArgs e) { using var dialog = new System.Windows.Forms.FolderBrowserDialog(); dialog.Description = "选择墨迹自动保存目录"; dialog.SelectedPath = AutoSavePath.Text; if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { AutoSavePath.Text = dialog.SelectedPath; SaveInkSettings(); } } // File Conversion private async void ConvertPptx_Click(object s, RoutedEventArgs e) { var dialog = new Microsoft.Win32.OpenFileDialog { Title = "选择 PPT", Filter = "PowerPoint|*.pptx" }; if (dialog.ShowDialog() == true) { ConvertStatus.Text = "正在转换 PPT → ENBX..."; try { var result = await _conversionService.ConvertPptxToEnbxAsync(dialog.FileName); ConvertStatus.Text = $"已完成: {Path.GetFileName(result)}"; } catch (Exception ex) { ConvertStatus.Text = $"转换失败: {ex.Message}"; } } } private async void ConvertEnbx_Click(object s, RoutedEventArgs e) { var dialog = new Microsoft.Win32.OpenFileDialog { Title = "选择 ENBX", Filter = "希沃课件|*.enbx" }; if (dialog.ShowDialog() == true) { ConvertStatus.Text = "正在转换 ENBX → PPT..."; try { var result = await _conversionService.ConvertEnbxToPptxAsync(dialog.FileName); ConvertStatus.Text = $"已完成: {Path.GetFileName(result)}"; } catch (Exception ex) { ConvertStatus.Text = $"转换失败: {ex.Message}"; } } } // Touch Fix private async void CheckTouch_Click(object s, RoutedEventArgs e) { var ok = await Task.Run(() => TouchFixService.IsTouchWorkingCorrectly()); TouchStatus.Text = ok ? "IWB 模式已启用" : "未启用 IWB 模式"; } private async void ApplyTouchFix_Click(object s, RoutedEventArgs e) { await Task.Run(() => TouchFixService.ApplyFixAsync()); TouchStatus.Text = "修复已应用,请重启希沃白板"; } // Activation private async void ActivatePro_Click(object s, RoutedEventArgs e) { var dlg = new ActivateDialog(); dlg.Owner = this; if (dlg.ShowDialog() == true) { var ok = await _activationService.ActivateProfessionalAsync(dlg.LicenseKey); ActivationStatusText.Text = ok ? "专业版已激活" : "激活码无效"; } } private async void LaunchInstaller_Click(object s, RoutedEventArgs e) { var ok = await _activationService.LaunchBen5InstallerAsync(); if (!ok) MessageBox.Show(this, "未找到注册补丁安装程序", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } private async void CheckActivation_Click(object s, RoutedEventArgs e) { var info = await Task.Run(() => _activationService.GetCurrentStatus()); ActivationStatusText.Text = info.IsProfessional ? $"专业版 · {info.LastActivationDate}" : "社区版"; } } }