311 lines
12 KiB
C#
311 lines
12 KiB
C#
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<string>(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<string>(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}"
|
|
: "社区版";
|
|
}
|
|
}
|
|
}
|