Skip to content

Commit 67ad388

Browse files
committed
修复多类型壁纸切换bug
1 parent 53040cb commit 67ad388

File tree

7 files changed

+88
-35
lines changed

7 files changed

+88
-35
lines changed

LiveWallpaperEngineAPI/RenderManager.cs

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public static IRender GetRenderByExtension(string extension)
3838

3939
internal static IRender GetRender(WallpaperModel wallpaper)
4040
{
41+
if (wallpaper == null)
42+
return null;
4143
if (wallpaper.RunningData.Type != null)
4244
return GetRender(wallpaper.RunningData.Type.Value);
4345
else if (!string.IsNullOrEmpty(wallpaper.RunningData.AbsolutePath))

LiveWallpaperEngineAPI/Renders/BaseRender.cs

+13-9
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,26 @@ public async Task<BaseApiResult<List<RenderInfo>>> ShowWallpaper(WallpaperModel
2828
foreach (var item in screens)
2929
Debug.WriteLine($"show {GetType().Name} {item}");
3030

31-
List<RenderInfo> changedRender = new List<RenderInfo>();
31+
List<RenderInfo> changedRenderInfo = new();
3232
//过滤无变化的屏幕
3333
var changedScreen = screens.Where(m =>
3434
{
3535
bool ok = false;
36-
var existRender = _currentWallpapers.FirstOrDefault(x => x.Screen == m);
37-
if (existRender == null)
36+
var existRenderInfo = _currentWallpapers.FirstOrDefault(x => x.Screen == m);
37+
if (existRenderInfo == null)
3838
ok = true;
3939
else
4040
{
41-
ok = existRender.Wallpaper.RunningData.AbsolutePath != wallpaper.RunningData.AbsolutePath;
42-
changedRender.Add(existRender);
41+
ok = existRenderInfo.Wallpaper.RunningData.AbsolutePath != wallpaper.RunningData.AbsolutePath;
42+
changedRenderInfo.Add(existRenderInfo);
4343
}
4444
return ok;
4545
}).ToArray();
4646

4747
if (changedScreen.Length > 0)
4848
{
4949
//关闭已经展现的壁纸
50-
await InnerCloseWallpaperAsync(changedRender, true);
50+
await CloseWallpaperExAsync(wallpaper, changedScreen);
5151

5252
_showWallpaperCts = new CancellationTokenSource();
5353
var showResult = await InnerShowWallpaper(wallpaper, _showWallpaperCts.Token, changedScreen);
@@ -60,7 +60,11 @@ public async Task<BaseApiResult<List<RenderInfo>>> ShowWallpaper(WallpaperModel
6060

6161
return BaseApiResult<List<RenderInfo>>.SuccessState();
6262
}
63-
public async Task CloseWallpaperAsync(params string[] screens)
63+
public Task CloseWallpaperAsync(params string[] screens)
64+
{
65+
return CloseWallpaperExAsync(null, screens);
66+
}
67+
public async Task CloseWallpaperExAsync(WallpaperModel nextWallpaper = null, params string[] screens)
6468
{
6569
var playingWallpaper = _currentWallpapers.Where(m => screens.Contains(m.Screen)).ToList();
6670
if (playingWallpaper.Count == 0)
@@ -74,7 +78,7 @@ public async Task CloseWallpaperAsync(params string[] screens)
7478
_showWallpaperCts?.Dispose();
7579
_showWallpaperCts = null;
7680

77-
await InnerCloseWallpaperAsync(playingWallpaper);
81+
await InnerCloseWallpaperAsync(playingWallpaper, nextWallpaper);
7882

7983
playingWallpaper.ToList().ForEach(m =>
8084
{
@@ -88,7 +92,7 @@ public async Task CloseWallpaperAsync(params string[] screens)
8892
/// <param name="playingWallpaper"></param>
8993
/// <param name="closeBeforeOpening">是否是临时关闭,临时关闭表示马上又会继续播放其他壁纸</param>
9094
/// <returns></returns>
91-
protected virtual Task InnerCloseWallpaperAsync(List<RenderInfo> playingWallpaper, bool closeBeforeOpening = false)
95+
protected virtual Task InnerCloseWallpaperAsync(List<RenderInfo> playingWallpaper, WallpaperModel nextWallpaper = null)
9296
{
9397
return Task.CompletedTask;
9498
}

LiveWallpaperEngineAPI/Renders/EngineRender.cs

+43-17
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,41 @@ public EngineRender() : base(WallpaperType.Video,
3232

3333
}
3434

35-
protected override async Task InnerCloseWallpaperAsync(List<RenderInfo> wallpaperRenders, bool closeBeforeOpening)
35+
protected override Task InnerCloseWallpaperAsync(List<RenderInfo> wallpaperRenders, WallpaperModel nextWallpaper)
3636
{
37-
//不论是否临时关闭,都需要关闭进程重启进程
38-
foreach (var render in wallpaperRenders)
37+
//还要继续播放视频壁纸,不用关闭
38+
if (nextWallpaper != null && nextWallpaper.RunningData.Type == WallpaperType.Video)
3939
{
40-
try
41-
{
42-
var p = Process.GetProcessById(render.PId);
43-
p.Kill();
44-
}
45-
catch (Exception ex)
46-
{
47-
Debug.WriteLine($"InnerCloseWallpaper ex:{ex}");
48-
}
49-
finally
50-
{
51-
if (SupportMouseEvent)
52-
await DesktopMouseEventReciver.RemoveHandle(render.ReceiveMouseEventHandle);
53-
}
40+
return Task.CompletedTask;
5441
}
42+
43+
//关闭壁纸
44+
SendToRender(new RenderProtocol(new StopVideoPayload()
45+
{
46+
Screen = wallpaperRenders.Select(m => m.Screen).ToArray(),
47+
})
48+
{
49+
Command = ProtocolDefinition.StopVideo
50+
});
51+
52+
return Task.CompletedTask;
53+
//foreach (var render in wallpaperRenders)
54+
//{
55+
// try
56+
// {
57+
// var p = Process.GetProcessById(render.PId);
58+
// p.Kill();
59+
// }
60+
// catch (Exception ex)
61+
// {
62+
// Debug.WriteLine($"InnerCloseWallpaper ex:{ex}");
63+
// }
64+
// finally
65+
// {
66+
// if (SupportMouseEvent)
67+
// await DesktopMouseEventReciver.RemoveHandle(render.ReceiveMouseEventHandle);
68+
// }
69+
//}
5570
}
5671

5772
protected override async Task<BaseApiResult<List<RenderInfo>>> InnerShowWallpaper(WallpaperModel wallpaper, CancellationToken ct, params string[] screens)
@@ -89,6 +104,17 @@ protected override async Task<BaseApiResult<List<RenderInfo>>> InnerShowWallpape
89104
});
90105
}
91106
}
107+
else
108+
{
109+
foreach(var screenItem in screens)
110+
{
111+
infos.Add(new RenderInfo()
112+
{
113+
Wallpaper = wallpaper,
114+
Screen = screenItem
115+
});
116+
}
117+
}
92118

93119

94120
//return Task.CompletedTask;

LiveWallpaperEngineAPI/Renders/ExternalProcessRender.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ protected ExternalProcessRender(WallpaperType type, List<string> extension, bool
1818
{
1919
}
2020

21-
protected override async Task InnerCloseWallpaperAsync(List<RenderInfo> wallpaperRenders, bool closeBeforeOpening)
21+
protected override async Task InnerCloseWallpaperAsync(List<RenderInfo> wallpaperRenders, WallpaperModel nextWallpaper)
2222
{
2323
//不论是否临时关闭,都需要关闭进程重启进程
2424
foreach (var render in wallpaperRenders)

LiveWallpaperEngineAPI/Renders/ImageRender.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ private void CacheOldWallpaper(string screenName, Func<string> p)
6363
}
6464
}
6565

66-
protected override Task InnerCloseWallpaperAsync(List<RenderInfo> playingWallpaper, bool closeBeforeOpening)
66+
protected override Task InnerCloseWallpaperAsync(List<RenderInfo> playingWallpaper, WallpaperModel nextWallpaper)
6767
{
6868
//临时关闭不用处理
69-
if (closeBeforeOpening)
69+
if (nextWallpaper != null)
7070
return Task.CompletedTask;
7171

7272
return Task.Run(() =>

LiveWallpaperEngineAPI/WallpaperApi.cs

+20-6
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,8 @@ public static async Task<BaseApiResult<WallpaperModel>> ShowWallpaper(WallpaperM
318318
existWallpaper.Option == wallpaper.Option)
319319
continue;
320320

321-
//关闭之前的壁纸
322-
await CloseWallpaper(screenItem);
321+
//关闭其他类型的壁纸
322+
await CloseWallpaperEx(currentRender.SupportType, screenItem);
323323
var showResult = await currentRender.ShowWallpaper(wallpaper, screenItem);
324324
if (!showResult.Ok)
325325
return BaseApiResult<WallpaperModel>.ErrorState(showResult.Error, showResult.Message, wallpaper);
@@ -346,20 +346,32 @@ public static async Task<BaseApiResult<WallpaperModel>> ShowWallpaper(WallpaperM
346346
QuitBusyState(nameof(ShowWallpaper));
347347
}
348348
}
349-
350-
public static async Task<BaseApiResult> CloseWallpaper(params string[] screens)
349+
public static Task<BaseApiResult> CloseWallpaper(params string[] screens)
350+
{
351+
return CloseWallpaperEx(null, screens);
352+
}
353+
public static async Task<BaseApiResult> CloseWallpaperEx(WallpaperType? excludeType = null, params string[] screens)
351354
{
352355
try
353356
{
354357
if (!EnterBusyState(nameof(CloseWallpaper)))
355358
return BaseApiResult.BusyState();
356359

360+
List<string> tmpCloseScreen = new();
357361
foreach (var screenItem in screens)
358362
{
359363
if (CurrentWalpapers.ContainsKey(screenItem))
364+
{
365+
var currentWallpaper = CurrentWalpapers[screenItem];
366+
bool isExcluded = excludeType != null && currentWallpaper != null && currentWallpaper.RunningData.Type == excludeType;
360367
CurrentWalpapers.Remove(screenItem);
368+
369+
if (isExcluded)
370+
continue;
371+
tmpCloseScreen.Add(screenItem);
372+
}
361373
}
362-
await InnerCloseWallpaper(screens);
374+
await InnerCloseWallpaper(tmpCloseScreen.ToArray());
363375
return new BaseApiResult() { Ok = true };
364376
}
365377
catch (Exception ex)
@@ -690,14 +702,16 @@ private static void ApplyAudioSource()
690702
{
691703
var wallpaper = CurrentWalpapers[screen];
692704
var currentRender = RenderManager.GetRender(wallpaper);
693-
currentRender.SetVolume(screen == Options.AudioScreen ? 100 : 0, screen);
705+
currentRender?.SetVolume(screen == Options.AudioScreen ? 100 : 0, screen);
694706
}
695707
}
696708
}
697709
private static async Task InnerCloseWallpaper(params string[] screens)
698710
{
699711
foreach (var m in RenderManager.Renders)
712+
{
700713
await m.CloseWallpaperAsync(screens);
714+
}
701715
}
702716
private static void StartTimer(bool enable)
703717
{

LiveWallpaperEngineRender/UI/RenderForm.cs

+7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Drawing;
23
using System.Windows.Forms;
34

45
namespace LiveWallpaperEngineRender
@@ -10,6 +11,12 @@ public partial class RenderForm : Form
1011
public RenderForm()
1112
{
1213
InitializeComponent();
14+
//UI
15+
BackColor = Color.Magenta;
16+
TransparencyKey = Color.Magenta;
17+
ShowInTaskbar = false;
18+
FormBorderStyle = FormBorderStyle.None;
19+
//Opacity = 0;
1320
}
1421

1522
internal void PlayVideo(string filePath)

0 commit comments

Comments
 (0)