Files
RhythmicWallpaper/AudioWallpaperManager/WallpaperProcessOperation.cs
2024-10-17 23:10:02 +08:00

90 lines
3.3 KiB
C#

using AudioWallpaper.Entity;
using System.Diagnostics;
using System.IO.Pipes;
using System.Runtime.Serialization.Formatters.Binary;
namespace AudioWallpaperManager {
public class WallpaperProcessOperation {
/// <summary>
/// 壁纸进程通信管道
/// </summary>
NamedPipeClientStream wallpaperPice = new NamedPipeClientStream(".", "WallpaperReloadConfigPipe", PipeDirection.InOut, PipeOptions.Asynchronous);
/// <summary>
/// 管道是否连接成功
/// </summary>
private bool IsConnected = false;
private ProcessStartInfo ProcessStartInfo;
private Process? Process;
//private Process? Process;
private bool IsKeppProcessAlive = false;
public WallpaperProcessOperation(ProcessStartInfo ProcessStartInfo) {
this.ProcessStartInfo = ProcessStartInfo;
InitializeProcessObject();
}
private void InitializeProcessObject() {
Process = new Process();
Process.StartInfo = ProcessStartInfo;
Process.EnableRaisingEvents = true;
//Process.StartInfo.RedirectStandardOutput = true;
Process.Exited += exitedEvent;
Process.Start();
}
public void KeepProcessAlive() {
if (Process == null) {
InitializeProcessObject();
}
IsKeppProcessAlive = true;
}
public void UnKeepProcessAlive() {
IsKeppProcessAlive = false;
Process?.Kill();
Process?.Dispose();
Process = null;
}
private void exitedEvent(object? sender, EventArgs e) {
if (IsKeppProcessAlive) {
Process?.Kill();
Process?.Dispose();
wallpaperPice.Close();
wallpaperPice.Dispose();
wallpaperPice = new NamedPipeClientStream(".", "WallpaperReloadConfigPipe", PipeDirection.InOut, PipeOptions.Asynchronous);
Process = new Process();
Process.StartInfo = ProcessStartInfo;
Process.EnableRaisingEvents = true;
Process.Exited += exitedEvent;
Process.Start();
LoadWallpeperNamePices();
}
}
/// <summary>
/// 初始化壁纸通信管道
/// </summary>
public void LoadWallpeperNamePices() {
if (wallpaperPice.IsConnected) {
return;
}
wallpaperPice.Connect();
}
public void DeviceStateChange() {
ConfigurationObject configuration = new ConfigurationObject();
configuration.DeviceStateChange = true;
ReloadWallpeperConfig(configuration);
}
public void ReloadWallpeperConfig(ConfigurationObject configurationObject) {
BinaryFormatter formatter = new BinaryFormatter();
using MemoryStream memoryStream = new MemoryStream();
formatter.Serialize(memoryStream, configurationObject);
SendWallpeperData(memoryStream.ToArray());
memoryStream.Close();
}
private void SendWallpeperData(byte[] bytes) {
LoadWallpeperNamePices();
wallpaperPice.WriteAsync(bytes, 0, bytes.Length);
}
}
}