Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
790f5901cf | ||
|
|
a1140d15ab | ||
|
|
1af4c08abe |
@@ -7,8 +7,9 @@
|
|||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<RootNamespace>BetterEN5</RootNamespace>
|
<RootNamespace>BetterEN5</RootNamespace>
|
||||||
<AssemblyName>Better-EN5</AssemblyName>
|
<AssemblyName>Better-EN5</AssemblyName>
|
||||||
<Version>1.1.1</Version>
|
<Version>1.1.2</Version>
|
||||||
<FileVersion>1.1.1</FileVersion>
|
<AssemblyVersion>1.1.0.0</AssemblyVersion>
|
||||||
|
<FileVersion>1.1.2.0</FileVersion>
|
||||||
<Authors>雾启工作室</Authors>
|
<Authors>雾启工作室</Authors>
|
||||||
<Author>雾启工作室</Author>
|
<Author>雾启工作室</Author>
|
||||||
<Company>雾启工作室</Company>
|
<Company>雾启工作室</Company>
|
||||||
@@ -19,4 +20,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="dotnetCampus.EasiPlugin.Sdk" Version="2.1.1-alpha.3" />
|
<PackageReference Include="dotnetCampus.EasiPlugin.Sdk" Version="2.1.1-alpha.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<Target Name="CopyManifest" AfterTargets="AfterBuild">
|
||||||
|
<Copy SourceFiles="manifest.coin" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true" />
|
||||||
|
</Target>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ namespace BetterEN5
|
|||||||
private async void Run()
|
private async void Run()
|
||||||
{
|
{
|
||||||
await Task.Delay(TimeSpan.FromSeconds(3));
|
await Task.Delay(TimeSpan.FromSeconds(3));
|
||||||
await TouchFixService.ApplyFixAsync();
|
|
||||||
ExportUIItems();
|
ExportUIItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
202
Better-EN5/Services/PatchService.cs
Normal file
202
Better-EN5/Services/PatchService.cs
Normal file
@@ -0,0 +1,202 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace BetterEN5.Services
|
||||||
|
{
|
||||||
|
public class PatchService
|
||||||
|
{
|
||||||
|
private readonly string _backupDir;
|
||||||
|
private readonly string _manifestPath;
|
||||||
|
|
||||||
|
public PatchService()
|
||||||
|
{
|
||||||
|
var appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
|
||||||
|
_backupDir = Path.Combine(appData, "BetterEN5", "backup");
|
||||||
|
_manifestPath = Path.Combine(_backupDir, "manifest.json");
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsInstalled()
|
||||||
|
{
|
||||||
|
return File.Exists(_manifestPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PatchManifest GetManifest()
|
||||||
|
{
|
||||||
|
if (!IsInstalled()) return new PatchManifest();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var json = File.ReadAllText(_manifestPath);
|
||||||
|
return System.Text.Json.JsonSerializer.Deserialize<PatchManifest>(json) ?? new PatchManifest();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return new PatchManifest();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task InstallAsync(IProgress<string> progress = null)
|
||||||
|
{
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
progress?.Report("正在备份原始文件...");
|
||||||
|
Directory.CreateDirectory(_backupDir);
|
||||||
|
var manifest = new PatchManifest
|
||||||
|
{
|
||||||
|
InstallTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||||
|
Version = "1.1.2"
|
||||||
|
};
|
||||||
|
|
||||||
|
BackupFile(manifest,
|
||||||
|
Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||||
|
"Seewo", "EasiNote5", "Config", "IWBConfig.json"));
|
||||||
|
|
||||||
|
BackupFile(manifest,
|
||||||
|
Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
|
||||||
|
"Seewo", "EasiNote5", "Config", "TouchConfig.ini"));
|
||||||
|
|
||||||
|
var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
|
||||||
|
var cfgFkv = Path.Combine(appData, "Seewo", "EasiNote5", "Data", "Configs.fkv");
|
||||||
|
if (File.Exists(cfgFkv))
|
||||||
|
BackupFile(manifest, cfgFkv);
|
||||||
|
|
||||||
|
var mainDir = Path.Combine(
|
||||||
|
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
|
||||||
|
"Seewo", "EasiNote5", "EasiNote5_5.2.4.9855", "Main");
|
||||||
|
var configsJson = Path.Combine(mainDir, "Configs", "configs.json");
|
||||||
|
if (File.Exists(configsJson))
|
||||||
|
BackupFile(manifest, configsJson);
|
||||||
|
|
||||||
|
progress?.Report("正在修补注册表...");
|
||||||
|
manifest.RegistryKeys.Add(@"HKCU\SOFTWARE\Seewo\EasiNote5\ForceIWB");
|
||||||
|
manifest.RegistryKeys.Add(@"HKCU\SOFTWARE\Seewo\EasiNote5\SkipTouchCheck");
|
||||||
|
manifest.RegistryKeys.Add(@"HKCU\SOFTWARE\Seewo\EasiNote5\EnableMultiTouch");
|
||||||
|
|
||||||
|
progress?.Report("正在应用补丁...");
|
||||||
|
var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
|
||||||
|
var configDir = Path.Combine(localAppData, "Seewo", "EasiNote5", "Config");
|
||||||
|
Directory.CreateDirectory(configDir);
|
||||||
|
|
||||||
|
var iwbConfig = new
|
||||||
|
{
|
||||||
|
ForceIWB = true,
|
||||||
|
TouchDriverType = "WindowsTouch",
|
||||||
|
SkipTouchCheck = true,
|
||||||
|
EnableMultiTouch = true,
|
||||||
|
LastFixTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
|
||||||
|
};
|
||||||
|
File.WriteAllText(Path.Combine(configDir, "IWBConfig.json"),
|
||||||
|
System.Text.Json.JsonSerializer.Serialize(iwbConfig, new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));
|
||||||
|
|
||||||
|
var touchCfgLines = new[]
|
||||||
|
{
|
||||||
|
"[Touch]", "Enable=1", "Driver=Auto", "ForceEnable=1",
|
||||||
|
"SuppressErrors=1", "SkipDetection=1", "FallbackToMouse=1", "",
|
||||||
|
"[Calibration]", "Enabled=0", "",
|
||||||
|
"[MultiTouch]", "MaxPoints=10", "EnableGesture=1",
|
||||||
|
};
|
||||||
|
File.WriteAllLines(Path.Combine(configDir, "TouchConfig.ini"), touchCfgLines);
|
||||||
|
|
||||||
|
Microsoft.Win32.Registry.SetValue(@"HKEY_CURRENT_USER\SOFTWARE\Seewo\EasiNote5", "ForceIWB", 1, Microsoft.Win32.RegistryValueKind.DWord);
|
||||||
|
Microsoft.Win32.Registry.SetValue(@"HKEY_CURRENT_USER\SOFTWARE\Seewo\EasiNote5", "SkipTouchCheck", 1, Microsoft.Win32.RegistryValueKind.DWord);
|
||||||
|
Microsoft.Win32.Registry.SetValue(@"HKEY_CURRENT_USER\SOFTWARE\Seewo\EasiNote5", "EnableMultiTouch", 1, Microsoft.Win32.RegistryValueKind.DWord);
|
||||||
|
|
||||||
|
File.WriteAllText(_manifestPath,
|
||||||
|
System.Text.Json.JsonSerializer.Serialize(manifest, new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));
|
||||||
|
|
||||||
|
progress?.Report("补丁安装完成");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UninstallAsync(IProgress<string> progress = null)
|
||||||
|
{
|
||||||
|
await Task.Run(() =>
|
||||||
|
{
|
||||||
|
if (!IsInstalled())
|
||||||
|
{
|
||||||
|
progress?.Report("未检测到补丁,无需卸载");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var manifest = GetManifest();
|
||||||
|
progress?.Report("正在还原注册表...");
|
||||||
|
foreach (var key in manifest.RegistryKeys)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var parts = key.Split('\\');
|
||||||
|
if (parts.Length >= 2)
|
||||||
|
{
|
||||||
|
var hive = parts[0];
|
||||||
|
var subKey = string.Join("\\", parts.Skip(1));
|
||||||
|
if (hive == "HKCU")
|
||||||
|
{
|
||||||
|
using var rk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(
|
||||||
|
Path.GetDirectoryName(subKey)!.Replace("HKEY_CURRENT_USER\\", ""), true);
|
||||||
|
rk?.DeleteValue(Path.GetFileName(subKey), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
progress?.Report("正在还原备份文件...");
|
||||||
|
foreach (var backup in manifest.Backups)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(backup.BackupPath))
|
||||||
|
{
|
||||||
|
File.Copy(backup.BackupPath, backup.OriginalPath, true);
|
||||||
|
File.Delete(backup.BackupPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(_manifestPath))
|
||||||
|
File.Delete(_manifestPath);
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
|
||||||
|
progress?.Report("卸载完成,建议重启希沃白板");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BackupFile(PatchManifest manifest, string filePath)
|
||||||
|
{
|
||||||
|
if (!File.Exists(filePath)) return;
|
||||||
|
var backupPath = filePath + ".bak";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Copy(filePath, backupPath, true);
|
||||||
|
manifest.Backups.Add(new PatchBackupEntry
|
||||||
|
{
|
||||||
|
OriginalPath = filePath,
|
||||||
|
BackupPath = backupPath
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PatchManifest
|
||||||
|
{
|
||||||
|
public string Version { get; set; } = "";
|
||||||
|
public string InstallTime { get; set; } = "";
|
||||||
|
public List<PatchBackupEntry> Backups { get; set; } = new();
|
||||||
|
public List<string> RegistryKeys { get; set; } = new();
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PatchBackupEntry
|
||||||
|
{
|
||||||
|
public string OriginalPath { get; set; } = "";
|
||||||
|
public string BackupPath { get; set; } = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,19 +15,12 @@
|
|||||||
<Color x:Key="Fg">#D0D0E0</Color>
|
<Color x:Key="Fg">#D0D0E0</Color>
|
||||||
<Color x:Key="SubFg">#707090</Color>
|
<Color x:Key="SubFg">#707090</Color>
|
||||||
<SolidColorBrush x:Key="BorderBrush" Color="#25FFFFFF"/>
|
<SolidColorBrush x:Key="BorderBrush" Color="#25FFFFFF"/>
|
||||||
<QuadraticEase x:Key="EaseOut" EasingMode="EaseOut"/>
|
|
||||||
</Window.Resources>
|
</Window.Resources>
|
||||||
|
|
||||||
<Window.RenderTransform>
|
<Border CornerRadius="12" Background="#0F0F1A" BorderBrush="{StaticResource BorderBrush}" BorderThickness="1">
|
||||||
<ScaleTransform ScaleX="1" ScaleY="1"/>
|
|
||||||
</Window.RenderTransform>
|
|
||||||
|
|
||||||
<Border CornerRadius="12" Background="#0F0F1A" BorderBrush="{StaticResource BorderBrush}"
|
|
||||||
BorderThickness="1">
|
|
||||||
<Border.Effect>
|
<Border.Effect>
|
||||||
<DropShadowEffect BlurRadius="24" ShadowDepth="4" Opacity="0.3" Color="Black"/>
|
<DropShadowEffect BlurRadius="24" ShadowDepth="4" Opacity="0.3" Color="Black"/>
|
||||||
</Border.Effect>
|
</Border.Effect>
|
||||||
|
|
||||||
<Grid>
|
<Grid>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="34"/>
|
<RowDefinition Height="34"/>
|
||||||
@@ -76,7 +69,12 @@
|
|||||||
<StackPanel Margin="0,8">
|
<StackPanel Margin="0,8">
|
||||||
<TextBlock Text="功能模块" FontSize="11" Foreground="{StaticResource SubFg}"
|
<TextBlock Text="功能模块" FontSize="11" Foreground="{StaticResource SubFg}"
|
||||||
Margin="16,8,16,4"/>
|
Margin="16,8,16,4"/>
|
||||||
<RadioButton x:Name="NavInk" GroupName="Nav" IsChecked="True"
|
<RadioButton x:Name="NavInstall" GroupName="Nav" IsChecked="True"
|
||||||
|
Content=" 安装管理" Foreground="{StaticResource Fg}"
|
||||||
|
Background="Transparent" BorderThickness="0"
|
||||||
|
Cursor="Hand" Height="36" Padding="16,0"
|
||||||
|
Checked="NavChanged"/>
|
||||||
|
<RadioButton x:Name="NavInk" GroupName="Nav"
|
||||||
Content=" 墨迹管理" Foreground="{StaticResource Fg}"
|
Content=" 墨迹管理" Foreground="{StaticResource Fg}"
|
||||||
Background="Transparent" BorderThickness="0"
|
Background="Transparent" BorderThickness="0"
|
||||||
Cursor="Hand" Height="36" Padding="16,0"
|
Cursor="Hand" Height="36" Padding="16,0"
|
||||||
@@ -91,11 +89,6 @@
|
|||||||
Background="Transparent" BorderThickness="0"
|
Background="Transparent" BorderThickness="0"
|
||||||
Cursor="Hand" Height="36" Padding="16,0"
|
Cursor="Hand" Height="36" Padding="16,0"
|
||||||
Checked="NavChanged"/>
|
Checked="NavChanged"/>
|
||||||
<RadioButton x:Name="NavBoard" GroupName="Nav"
|
|
||||||
Content=" 大屏支持" Foreground="{StaticResource Fg}"
|
|
||||||
Background="Transparent" BorderThickness="0"
|
|
||||||
Cursor="Hand" Height="36" Padding="16,0"
|
|
||||||
Checked="NavChanged"/>
|
|
||||||
<RadioButton x:Name="NavActivate" GroupName="Nav"
|
<RadioButton x:Name="NavActivate" GroupName="Nav"
|
||||||
Content=" 激活" Foreground="{StaticResource Fg}"
|
Content=" 激活" Foreground="{StaticResource Fg}"
|
||||||
Background="Transparent" BorderThickness="0"
|
Background="Transparent" BorderThickness="0"
|
||||||
@@ -111,8 +104,35 @@
|
|||||||
<ScrollViewer Grid.Column="2" VerticalScrollBarVisibility="Auto"
|
<ScrollViewer Grid.Column="2" VerticalScrollBarVisibility="Auto"
|
||||||
Background="#0D0D18" Padding="24,16">
|
Background="#0D0D18" Padding="24,16">
|
||||||
<StackPanel x:Name="ContentPanel">
|
<StackPanel x:Name="ContentPanel">
|
||||||
|
|
||||||
|
<!-- Install Management -->
|
||||||
|
<StackPanel x:Name="PanelInstall" Visibility="Visible">
|
||||||
|
<TextBlock Text="Better-Seewo 安装管理" FontSize="20" FontWeight="SemiBold"
|
||||||
|
Foreground="#60B0FF" Margin="0,0,0,8"/>
|
||||||
|
<TextBlock x:Name="InstallStatusText" Text="正在检测状态..." FontSize="13"
|
||||||
|
Foreground="{StaticResource SubFg}" Margin="0,0,0,16"/>
|
||||||
|
<Button x:Name="InstallBtn" Content="安装补丁" Width="180" Height="34"
|
||||||
|
Margin="0,0,0,8" Cursor="Hand" Click="InstallPatch_Click"/>
|
||||||
|
<Button x:Name="UninstallBtn" Content="卸载补丁" Width="180" Height="34"
|
||||||
|
Margin="0,0,0,8" Cursor="Hand" Click="UninstallPatch_Click"
|
||||||
|
IsEnabled="False"/>
|
||||||
|
<TextBlock x:Name="PatchDetailText" FontSize="12"
|
||||||
|
Foreground="{StaticResource SubFg}" Margin="0,8,0,0"
|
||||||
|
TextWrapping="Wrap"/>
|
||||||
|
<TextBlock Text="" Margin="0,16,0,0"/>
|
||||||
|
<TextBlock Text="说明" FontSize="16" FontWeight="SemiBold"
|
||||||
|
Foreground="{StaticResource Fg}" Margin="0,0,0,8"/>
|
||||||
|
<TextBlock TextWrapping="Wrap" FontSize="12"
|
||||||
|
Foreground="{StaticResource SubFg}">
|
||||||
|
• 安装补丁:备份希沃白板关键配置文件,然后应用增强补丁。
|
||||||
|
• 卸载补丁:从备份文件(.bak)还原原始配置,清除注册表修改。
|
||||||
|
• 安装后请重启希沃白板使补丁生效。
|
||||||
|
• 补丁不修改希沃白板主程序文件,仅修改配置和注册表。
|
||||||
|
</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
<!-- Ink Module -->
|
<!-- Ink Module -->
|
||||||
<StackPanel x:Name="PanelInk" Visibility="Visible">
|
<StackPanel x:Name="PanelInk" Visibility="Collapsed">
|
||||||
<TextBlock Text="墨迹管理" FontSize="20" FontWeight="SemiBold"
|
<TextBlock Text="墨迹管理" FontSize="20" FontWeight="SemiBold"
|
||||||
Foreground="#60B0FF" Margin="0,0,0,16"/>
|
Foreground="#60B0FF" Margin="0,0,0,16"/>
|
||||||
<TextBlock Text="导出/导入希沃白板课件中的笔迹和标注" FontSize="13"
|
<TextBlock Text="导出/导入希沃白板课件中的笔迹和标注" FontSize="13"
|
||||||
@@ -144,17 +164,6 @@
|
|||||||
<TextBlock x:Name="TouchStatus" FontSize="12" Foreground="{StaticResource SubFg}" Margin="0,8,0,0"/>
|
<TextBlock x:Name="TouchStatus" FontSize="12" Foreground="{StaticResource SubFg}" Margin="0,8,0,0"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
|
||||||
<!-- Board Module -->
|
|
||||||
<StackPanel x:Name="PanelBoard" Visibility="Collapsed">
|
|
||||||
<TextBlock Text="大屏支持" FontSize="20" FontWeight="SemiBold"
|
|
||||||
Foreground="#60B0FF" Margin="0,0,0,16"/>
|
|
||||||
<TextBlock Text="为非触摸大屏启用完整白板模式" FontSize="13"
|
|
||||||
Foreground="{StaticResource SubFg}" Margin="0,0,0,16"/>
|
|
||||||
<Button Content="配置大屏模式" Width="180" Height="34" Margin="0,0,0,8" Cursor="Hand" Click="EnableBoardSupport_Click"/>
|
|
||||||
<Button Content="启用 IWB 模式" Width="180" Height="34" Margin="0,0,0,8" Cursor="Hand" Click="EnableIWB_Click"/>
|
|
||||||
<TextBlock x:Name="BoardStatus" FontSize="12" Foreground="{StaticResource SubFg}" Margin="0,8,0,0"/>
|
|
||||||
</StackPanel>
|
|
||||||
|
|
||||||
<!-- Activate Module -->
|
<!-- Activate Module -->
|
||||||
<StackPanel x:Name="PanelActivate" Visibility="Collapsed">
|
<StackPanel x:Name="PanelActivate" Visibility="Collapsed">
|
||||||
<TextBlock Text="专业版激活" FontSize="20" FontWeight="SemiBold"
|
<TextBlock Text="专业版激活" FontSize="20" FontWeight="SemiBold"
|
||||||
@@ -171,7 +180,7 @@
|
|||||||
|
|
||||||
<!-- Footer -->
|
<!-- Footer -->
|
||||||
<Border Grid.Row="2" Background="#1A1A2E" CornerRadius="0,0,12,12">
|
<Border Grid.Row="2" Background="#1A1A2E" CornerRadius="0,0,12,12">
|
||||||
<TextBlock Text="雾启工作室 · 雾生万象,启以为光" FontSize="11"
|
<TextBlock Text="雾启工作室 × Macrohard Studio · 雾生万象,启以为光" FontSize="11"
|
||||||
Foreground="#404058" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
Foreground="#404058" HorizontalAlignment="Center" VerticalAlignment="Center"/>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ using System.Linq;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Media.Animation;
|
|
||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using BetterEN5.Services;
|
using BetterEN5.Services;
|
||||||
|
|
||||||
@@ -13,8 +12,8 @@ namespace BetterEN5.UI
|
|||||||
public partial class BetterSeewoMainWindow : Window
|
public partial class BetterSeewoMainWindow : Window
|
||||||
{
|
{
|
||||||
private readonly InkService _inkService = new();
|
private readonly InkService _inkService = new();
|
||||||
private readonly ConversionService _conversionService = new();
|
|
||||||
private readonly ActivationService _activationService = new();
|
private readonly ActivationService _activationService = new();
|
||||||
|
private readonly PatchService _patchService = new();
|
||||||
|
|
||||||
public BetterSeewoMainWindow()
|
public BetterSeewoMainWindow()
|
||||||
{
|
{
|
||||||
@@ -22,36 +21,95 @@ namespace BetterEN5.UI
|
|||||||
Loaded += OnLoaded;
|
Loaded += OnLoaded;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLoaded(object sender, RoutedEventArgs e)
|
private async void OnLoaded(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var sb = (Storyboard)TryFindResource("ScaleInStoryboard");
|
await RefreshInstallStatusAsync();
|
||||||
if (sb != null) BeginStoryboard(sb);
|
|
||||||
_ = RefreshStatusAsync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void NavChanged(object sender, RoutedEventArgs e)
|
private void NavChanged(object sender, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
if (sender == NavInk) ShowPanel(PanelInk);
|
if (sender == NavInstall) ShowPanel(PanelInstall);
|
||||||
|
else if (sender == NavInk) ShowPanel(PanelInk);
|
||||||
else if (sender == NavConvert) ShowPanel(PanelConvert);
|
else if (sender == NavConvert) ShowPanel(PanelConvert);
|
||||||
else if (sender == NavTouch) ShowPanel(PanelTouch);
|
else if (sender == NavTouch) ShowPanel(PanelTouch);
|
||||||
else if (sender == NavBoard) ShowPanel(PanelBoard);
|
|
||||||
else if (sender == NavActivate) ShowPanel(PanelActivate);
|
else if (sender == NavActivate) ShowPanel(PanelActivate);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShowPanel(StackPanel panel)
|
private void ShowPanel(StackPanel panel)
|
||||||
{
|
{
|
||||||
foreach (var p in new[] { PanelInk, PanelConvert, PanelTouch, PanelBoard, PanelActivate })
|
foreach (var p in new[] { PanelInstall, PanelInk, PanelConvert, PanelTouch, PanelActivate })
|
||||||
p.Visibility = p == panel ? Visibility.Visible : Visibility.Collapsed;
|
p.Visibility = p == panel ? Visibility.Visible : Visibility.Collapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RefreshStatusAsync()
|
private async Task RefreshInstallStatusAsync()
|
||||||
{
|
{
|
||||||
var touchOk = await Task.Run(() => TouchFixService.IsTouchWorkingCorrectly());
|
var installed = await Task.Run(() => _patchService.IsInstalled());
|
||||||
TouchStatus.Text = touchOk ? "✅ IWB 模式已启用" : "⚠️ 未启用 IWB 模式";
|
InstallBtn.IsEnabled = !installed;
|
||||||
var info = await Task.Run(() => _activationService.GetCurrentStatus());
|
UninstallBtn.IsEnabled = installed;
|
||||||
ActivationStatusText.Text = info.IsProfessional
|
InstallStatusText.Text = installed
|
||||||
? $"✅ 专业版 · {info.LastActivationDate}"
|
? "✅ 补丁已安装"
|
||||||
: "🔓 社区版";
|
: "⚠️ 补丁未安装";
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
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,
|
||||||
|
"确定要卸载 Better-Seewo 补丁吗?\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 void Minimize_Click(object s, RoutedEventArgs e) => WindowState = WindowState.Minimized;
|
private void Minimize_Click(object s, RoutedEventArgs e) => WindowState = WindowState.Minimized;
|
||||||
@@ -95,7 +153,7 @@ namespace BetterEN5.UI
|
|||||||
await ProgressDialog.Show(this, "转换文件", async p =>
|
await ProgressDialog.Show(this, "转换文件", async p =>
|
||||||
{
|
{
|
||||||
p.UpdateStatus("正在转换 PPT → ENBX...", "调用转换器");
|
p.UpdateStatus("正在转换 PPT → ENBX...", "调用转换器");
|
||||||
var result = await _conversionService.ConvertPptxToEnbxAsync(dialog.FileName);
|
var result = await new ConversionService().ConvertPptxToEnbxAsync(dialog.FileName);
|
||||||
p.UpdateStatus("转换完成", Path.GetFileName(result));
|
p.UpdateStatus("转换完成", Path.GetFileName(result));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -109,7 +167,7 @@ namespace BetterEN5.UI
|
|||||||
await ProgressDialog.Show(this, "转换文件", async p =>
|
await ProgressDialog.Show(this, "转换文件", async p =>
|
||||||
{
|
{
|
||||||
p.UpdateStatus("正在转换 ENBX → PPT...", "调用转换器");
|
p.UpdateStatus("正在转换 ENBX → PPT...", "调用转换器");
|
||||||
var result = await _conversionService.ConvertEnbxToPptxAsync(dialog.FileName);
|
var result = await new ConversionService().ConvertEnbxToPptxAsync(dialog.FileName);
|
||||||
p.UpdateStatus("导出完成", Path.GetFileName(result));
|
p.UpdateStatus("导出完成", Path.GetFileName(result));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -134,30 +192,6 @@ namespace BetterEN5.UI
|
|||||||
TouchStatus.Text = "修复已应用,请重启";
|
TouchStatus.Text = "修复已应用,请重启";
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void EnableBoardSupport_Click(object s, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
await ProgressDialog.Show(this, "大屏支持", async p =>
|
|
||||||
{
|
|
||||||
p.UpdateStatus("正在配置大屏模式...", "修补 Configs.fkv");
|
|
||||||
await _activationService.ApplyBoardSupportPatchAsync();
|
|
||||||
p.UpdateStatus("正在写入注册表...", "大屏相关键值");
|
|
||||||
await Task.Delay(200);
|
|
||||||
p.UpdateStatus("完成", "大屏模式已配置");
|
|
||||||
});
|
|
||||||
BoardStatus.Text = "大屏模式已配置";
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void EnableIWB_Click(object s, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
await ProgressDialog.Show(this, "IWB 模式", async p =>
|
|
||||||
{
|
|
||||||
p.UpdateStatus("正在启用 IWB 模式...", "注册表 + 配置文件");
|
|
||||||
await _activationService.EnableIWBForNonTouchAsync();
|
|
||||||
p.UpdateStatus("完成", "IWB 模式已启用,重启生效");
|
|
||||||
});
|
|
||||||
BoardStatus.Text = "IWB 已启用";
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void ActivatePro_Click(object s, RoutedEventArgs e)
|
private async void ActivatePro_Click(object s, RoutedEventArgs e)
|
||||||
{
|
{
|
||||||
var dlg = new ActivateDialog();
|
var dlg = new ActivateDialog();
|
||||||
|
|||||||
@@ -24,5 +24,5 @@ Preinstalled
|
|||||||
False
|
False
|
||||||
>
|
>
|
||||||
Version
|
Version
|
||||||
1.1.1
|
1.1.2
|
||||||
>
|
>
|
||||||
|
|||||||
98
使用说明.txt
Normal file
98
使用说明.txt
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
Better-Seewo 增强插件 - 使用说明
|
||||||
|
====================================
|
||||||
|
版本:1.1.2 | 作者:雾启工作室 × Macrohard Studio
|
||||||
|
项目地址:http://171.80.3.149:4321/miao-moe/Better-Seewo
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
一、安装方法
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
方式一:自动安装(推荐)
|
||||||
|
1. 以管理员身份运行 PowerShell
|
||||||
|
2. 执行:.\scripts\install.ps1
|
||||||
|
3. 重启希沃白板 5
|
||||||
|
|
||||||
|
方式二:安装包安装
|
||||||
|
- 运行 bin\Release\Better-Seewo 增强插件.1.1.0.exe
|
||||||
|
|
||||||
|
方式三:手动安装
|
||||||
|
1. 将 Better-EN5\bin\Release\net6.0-windows\ 下所有文件
|
||||||
|
复制到希沃白板 Extensions\Better-EN5\ 目录
|
||||||
|
2. 将 Better-EN5\manifest.coin 复制到同一目录
|
||||||
|
3. 重启希沃白板 5
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
二、功能入口
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
安装成功后,在希沃白板中可以找到以下入口:
|
||||||
|
|
||||||
|
1. 右键菜单(备课模式)
|
||||||
|
在课件板书区域右键 → "导出墨迹"
|
||||||
|
在课件板书区域右键 → "Better-Seewo"
|
||||||
|
|
||||||
|
2. 顶部工具栏
|
||||||
|
在工具栏找到 "Better-Seewo" 图标按钮
|
||||||
|
|
||||||
|
点击以上任意入口即可打开 Better-Seewo 主界面。
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
三、功能模块
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
1. 墨迹管理(Ink Manager)
|
||||||
|
- 导出当前课件中的所有笔迹/标注为 JSON 文件
|
||||||
|
- 从 JSON 文件导入笔迹/标注到当前课件
|
||||||
|
- 支持备份和迁移课堂板书内容
|
||||||
|
|
||||||
|
2. 文件转换(File Converter)
|
||||||
|
- PPT(.pptx)转希沃课件(.enbx)
|
||||||
|
- 希沃课件(.enbx)转 PPT(.pptx)
|
||||||
|
- 清理转换缓存,修复转换失败问题
|
||||||
|
|
||||||
|
3. 触摸修复(Touch Fix)
|
||||||
|
- 检测希沃白板的触摸状态
|
||||||
|
- 强制启用 IWB 模式
|
||||||
|
- 配置注册表和配置文件以跳过触摸检测
|
||||||
|
- 抑制触摸相关错误提示
|
||||||
|
|
||||||
|
4. 大屏支持(Board Support)
|
||||||
|
- 为非触摸大屏启用完整白板模式
|
||||||
|
- 创建"希沃白板5-大屏模式"桌面快捷方式
|
||||||
|
- 配置大屏相关注册表和配置文件
|
||||||
|
|
||||||
|
5. 激活(Activation)
|
||||||
|
- 社区版与专业版自由切换
|
||||||
|
- 输入激活码解锁全部功能
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
四、开发者信息
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
构建环境要求:
|
||||||
|
- .NET SDK 6.0
|
||||||
|
- 希沃白板 5(版本 5.2.2.653 ~ 5.3.0.0)
|
||||||
|
- Visual Studio 2022 或 dotnet CLI
|
||||||
|
|
||||||
|
构建命令:
|
||||||
|
dotnet build -c Release Better-EN5
|
||||||
|
|
||||||
|
更多信息请参阅 DEVELOPER_GUIDE.md
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
五、常见问题
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
Q: 安装后希沃白板看不到插件入口?
|
||||||
|
A: 请确保以管理员身份运行 install.ps1,
|
||||||
|
然后完全退出希沃白板,重新启动。
|
||||||
|
|
||||||
|
Q: 插件加载失败怎么办?
|
||||||
|
A: 检查希沃白板版本是否在 5.2.2.653 ~ 5.3.0.0 范围内。
|
||||||
|
|
||||||
|
Q: 触摸修复不起作用?
|
||||||
|
A: 部分硬件需要重启电脑才能生效。
|
||||||
|
如果仍然无效,请尝试"大屏支持"中的 IWB 模式。
|
||||||
|
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
雾生万象,启以为光
|
||||||
68
安装插件.bat
Normal file
68
安装插件.bat
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
@echo off
|
||||||
|
title Better-Seewo 插件安装
|
||||||
|
cd /d "%~dp0"
|
||||||
|
|
||||||
|
:: 检查管理员权限
|
||||||
|
net session >nul 2>&1
|
||||||
|
if %errorLevel% neq 0 (
|
||||||
|
echo 正在请求管理员权限...
|
||||||
|
powershell start-process "%~f0" -verb runas
|
||||||
|
exit /b
|
||||||
|
)
|
||||||
|
|
||||||
|
echo ========================================
|
||||||
|
echo Better-Seewo 增强插件 v1.1.2 安装
|
||||||
|
echo 雾启工作室
|
||||||
|
echo ========================================
|
||||||
|
echo.
|
||||||
|
|
||||||
|
:: 设置 dotnet 路径
|
||||||
|
set PATH=C:\Program Files\dotnet;%PATH%
|
||||||
|
|
||||||
|
:: 构建
|
||||||
|
echo [1/3] 构建项目...
|
||||||
|
dotnet build -c Release Better-EN5
|
||||||
|
if %errorLevel% neq 0 (
|
||||||
|
echo 构建失败!
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
echo 构建成功
|
||||||
|
echo.
|
||||||
|
|
||||||
|
:: 查找希沃白板安装目录
|
||||||
|
echo [2/3] 查找希沃白板安装目录...
|
||||||
|
set "seewoRoot=%ProgramFiles(x86)%\Seewo\EasiNote5"
|
||||||
|
if not exist "%seewoRoot%" (
|
||||||
|
echo 未找到希沃白板安装目录!
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
for /f "tokens=*" %%d in ('dir "%seewoRoot%\EasiNote5_*" /b /o-n') do (
|
||||||
|
set "versionDir=%seewoRoot%\%%d"
|
||||||
|
goto :found
|
||||||
|
)
|
||||||
|
echo 未找到希沃白板版本目录!
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:found
|
||||||
|
set "targetDir=%versionDir%\Main\Extensions\Better-EN5"
|
||||||
|
echo 安装到: %targetDir%
|
||||||
|
|
||||||
|
:: 创建目标目录
|
||||||
|
if not exist "%targetDir%" mkdir "%targetDir%"
|
||||||
|
|
||||||
|
:: 复制文件
|
||||||
|
echo [3/3] 复制插件文件...
|
||||||
|
xcopy "Better-EN5\bin\Release\net6.0-windows\*" "%targetDir%\" /y /q
|
||||||
|
copy /y "Better-EN5\manifest.coin" "%targetDir%\" >nul
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo ========================================
|
||||||
|
echo 安装完成!
|
||||||
|
echo 请重启希沃白板以加载插件。
|
||||||
|
echo ========================================
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
Reference in New Issue
Block a user