v1.1.2: 新增 PatchService 安装/卸载补丁系统 + 品牌更新
This commit is contained in:
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; } = "";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user