using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace VHDMounter { public partial class MainWindow : Window { private VHDManager vhdManager; private List availableVHDs; private bool isProcessing = false; public MainWindow() { InitializeComponent(); vhdManager = new VHDManager(); vhdManager.StatusChanged += OnStatusChanged; vhdManager.VHDFilesFound += OnVHDFilesFound; // 注册开机启动 if (!StartupManager.IsRegisteredForStartup()) { StartupManager.RegisterForStartup(); } // 开始主流程 _ = StartMainProcess(); } private void OnStatusChanged(string status) { Dispatcher.Invoke(() => { StatusText.Text = status; }); } private void OnVHDFilesFound(List vhdFiles) { Dispatcher.Invoke(() => { availableVHDs = vhdFiles; ShowVHDSelector(vhdFiles); }); } private async Task StartMainProcess() { try { isProcessing = true; // 调试:测试特定文件 var testFile = @"C:\SDEZ_1.56.00_20250317134137.vhd"; if (System.IO.File.Exists(testFile)) { bool isValid = vhdManager.IsVHDFileValid(testFile); OnStatusChanged($"测试文件 {testFile}: {(isValid ? "符合条件" : "不符合条件")}"); await Task.Delay(2000); } // 扫描VHD文件 var vhdFiles = await vhdManager.ScanForVHDFiles(); if (vhdFiles.Count == 0) { OnStatusChanged("未找到符合条件的VHD文件"); OnStatusChanged("请检查文件名是否包含SDEZ、SDHD或SDDT关键词"); await Task.Delay(5000); Application.Current.Shutdown(); return; } string selectedVHD; if (vhdFiles.Count == 1) { selectedVHD = vhdFiles[0]; await ProcessSelectedVHD(selectedVHD); } else { // 显示选择器 availableVHDs = vhdFiles; ShowVHDSelector(vhdFiles); } } catch (Exception ex) { OnStatusChanged($"发生错误: {ex.Message}"); await Task.Delay(5000); Application.Current.Shutdown(); } } private void ShowVHDSelector(List vhdFiles) { Dispatcher.Invoke(() => { VHDListBox.ItemsSource = vhdFiles.Select(f => System.IO.Path.GetFileName(f)).ToList(); VHDListBox.SelectedIndex = 0; VHDSelector.Visibility = Visibility.Visible; ProgressBar.Visibility = Visibility.Collapsed; OnStatusChanged("请选择要挂载的VHD文件"); }); } private async Task ProcessSelectedVHD(string vhdPath) { try { Dispatcher.Invoke(() => { VHDSelector.Visibility = Visibility.Collapsed; ProgressBar.Visibility = Visibility.Visible; }); // 挂载VHD bool mounted = await vhdManager.MountVHD(vhdPath); if (!mounted) { OnStatusChanged("VHD挂载失败"); await Task.Delay(3000); Application.Current.Shutdown(); return; } // 查找package文件夹 string packagePath = await vhdManager.FindPackageFolder(); if (string.IsNullOrEmpty(packagePath)) { OnStatusChanged("未找到package文件夹"); await Task.Delay(3000); Application.Current.Shutdown(); return; } // 启动start.bat bool started = await vhdManager.StartBatchFile(packagePath); if (!started) { OnStatusChanged("启动start.bat失败"); await Task.Delay(3000); Application.Current.Shutdown(); return; } OnStatusChanged("程序启动成功,开始监控..."); // 隐藏窗口并开始监控 Dispatcher.Invoke(() => { this.WindowState = WindowState.Minimized; this.ShowInTaskbar = false; }); // 开始监控和重启循环 await vhdManager.MonitorAndRestart(packagePath); } catch (Exception ex) { OnStatusChanged($"处理过程中发生错误: {ex.Message}"); await Task.Delay(5000); Application.Current.Shutdown(); } } private async void Window_KeyDown(object sender, KeyEventArgs e) { if (isProcessing || VHDSelector.Visibility != Visibility.Visible) return; switch (e.Key) { case Key.Up: if (VHDListBox.SelectedIndex > 0) VHDListBox.SelectedIndex--; break; case Key.Down: if (VHDListBox.SelectedIndex < VHDListBox.Items.Count - 1) VHDListBox.SelectedIndex++; break; case Key.Enter: if (VHDListBox.SelectedIndex >= 0 && availableVHDs != null) { isProcessing = true; string selectedVHD = availableVHDs[VHDListBox.SelectedIndex]; await ProcessSelectedVHD(selectedVHD); } break; case Key.Escape: Application.Current.Shutdown(); break; } } private void CloseButton_Click(object sender, RoutedEventArgs e) { Application.Current.Shutdown(); } protected override void OnClosed(EventArgs e) { // 程序关闭时卸载VHD try { _ = vhdManager.UnmountDrive(); } catch { } base.OnClosed(e); } } }